Skip to content

Commit

Permalink
Particles! Gotta finish the colors tho
Browse files Browse the repository at this point in the history
  • Loading branch information
enjarai committed Apr 5, 2024
1 parent 66ba378 commit b024695
Show file tree
Hide file tree
Showing 10 changed files with 231 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 1.20.1 2024-04-01T16:33:08.4219291 Blåhaj of Undying/Model Definitions
// 1.20.1 2024-04-05T21:39:24.2305186 Blåhaj of Undying/Model Definitions
0328344f7ee0d0d51f6710182c2f66d9ab0e7f8e assets\blahaj_totem\models\item\blahaj_skins\demiboy_shark.json
1cc7cdb3a189ebb3e5672fffda5973b9157cf3bf assets\blahaj_totem\models\item\blahaj_skins\trans_shark.json
d4c40cb9fad911fa329d304d157868a6db6041b1 assets\blahaj_totem\models\item\blahaj_skins\demiromantic_shark.json
Expand Down
94 changes: 55 additions & 39 deletions src/main/java/dev/enjarai/blahajtotem/BlahajTotem.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package dev.enjarai.blahajtotem;

import dev.enjarai.blahajtotem.particle.ModParticles;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
import net.minecraft.client.item.ModelPredicateProviderRegistry;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;

import java.util.Arrays;
import java.util.List;
Expand All @@ -15,61 +18,74 @@ public class BlahajTotem implements ClientModInitializer, DataGeneratorEntrypoin
public static final String MOD_ID = "blahaj-totem";
public static final String NAMESPACE = "blahaj_totem";

public static final List<String> VARIANTS = List.of(
"gray",
"grey",
"red",
"orange",
"yellow",
"lime",
"green",
"cyan",
"blue",
"purple",
"magenta",
"pink",
public static final List<BlahajType> VARIANTS = List.of(
new BlahajType("gray", 0x888885, 0xa9a9a7, 0xc3d0d3),
new BlahajType("grey", 0x888885, 0xa9a9a7, 0xc3d0d3),
new BlahajType("red", 0x9a3f43, 0xbf5b5f, 0xc3d0d3),
new BlahajType("orange", 0xac7646, 0xd19864, 0xc3d0d3),
new BlahajType("yellow", 0xb98f4b, 0xdeb36a, 0xc3d0d3),
new BlahajType("lime", 0x87a242, 0xa8c75f, 0xc3d0d3),
new BlahajType("green", 0x637730, 0x839c4a, 0xc3d0d3),
new BlahajType("cyan", 0x327c76, 0x4ca19c, 0xc3d0d3),
new BlahajType("blue", 0x39508e, 0x546bb3, 0xc3d0d3),
new BlahajType("purple", 0x563481, 0x784ea6, 0xc3d0d3),
new BlahajType("magenta", 0x973e9b, 0xbf5ac0, 0xc3d0d3),
new BlahajType("pink", 0xce80a9, 0xf3a7cd, 0xc3d0d3),

"ace",
"agender",
"aro",
"aroace",
"bi",
"demiboy",
"demigirl",
"demiromantic",
"demisexual",
"enby",
"gay",
"genderfluid",
"genderqueer",
"greyromantic",
"greyrose",
"greysexual",
"intersex",
"lesbian",
"pan",
"poly",
"pride",
"trans"
new BlahajType("ace", 0x382b3b, 0x5b5c75, 0x5e416e, 0xc0d0d6),
new BlahajType("agender", 0x98d888, 0x82989d, 0x383a3a, 0xc4d3d9),
new BlahajType("aro"),
new BlahajType("aroace"),
new BlahajType("bi"),
new BlahajType("demiboy"),
new BlahajType("demigirl"),
new BlahajType("demiromantic"),
new BlahajType("demisexual"),
new BlahajType("enby"),
new BlahajType("gay"),
new BlahajType("genderfluid"),
new BlahajType("genderqueer"),
new BlahajType("greyromantic"),
new BlahajType("greyrose"),
new BlahajType("greysexual"),
new BlahajType("intersex"),
new BlahajType("lesbian"),
new BlahajType("pan"),
new BlahajType("poly"),
new BlahajType("pride"),
new BlahajType("trans", 0x6f9fba, 0xe882b6, 0xc6d3d6)
);

@Override
public void onInitializeClient() {
ModelPredicateProviderRegistry.register(Items.TOTEM_OF_UNDYING, id("shork_variant"), (stack, world, entity, seed) -> {
if (stack.hasCustomName()) {
var name = Arrays.asList(stack.getName().getString().toLowerCase(Locale.ROOT).split("[ \\-_]"));
var variant = VARIANTS.stream().filter(name::contains).reduce((v1, v2) -> v2.length() > v1.length() ? v2 : v1);
return variant.map(v -> (VARIANTS.indexOf(v) + 1f) / VARIANTS.size()).orElse(0f);
var type = getShorkType(stack);
if (type != null) {
return (VARIANTS.indexOf(type) + 1f) / VARIANTS.size();
}
return 0f;
});

ModParticles.register();
}

@Override
public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
fabricDataGenerator.createPack().addProvider(ShorkModelGenerator::new);
}

@Nullable
public static BlahajType getShorkType(ItemStack stack) {
if (stack.isOf(Items.TOTEM_OF_UNDYING) && stack.hasCustomName()) {
var name = Arrays.asList(stack.getName().getString().toLowerCase(Locale.ROOT).split("[ \\-_]"));
var variant = VARIANTS.stream().filter(v -> name.contains(v.name())).reduce((v1, v2) -> v2.name().length() > v1.name().length() ? v2 : v1);

return variant.orElse(null);
}

return null;
}

public static Identifier id(String path) {
return new Identifier(NAMESPACE, path);
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/dev/enjarai/blahajtotem/BlahajType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.enjarai.blahajtotem;

public record BlahajType(String name, int... colors) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public void generateItemModels(ItemModelGenerator itemModelGenerator) {

var overrides = new JsonArray();
for (int i = 0; i < BlahajTotem.VARIANTS.size(); i++) {
var variant = BlahajTotem.VARIANTS.get(i);
var variant = BlahajTotem.VARIANTS.get(i).name();

var override = new JsonObject();

Expand All @@ -45,12 +45,12 @@ public void generateItemModels(ItemModelGenerator itemModelGenerator) {
});

BlahajTotem.VARIANTS.forEach(variant -> {
itemModelGenerator.writer.accept(BlahajTotem.id("item/blahaj_skins/" + variant + "_shark"), () -> {
itemModelGenerator.writer.accept(BlahajTotem.id("item/blahaj_skins/" + variant.name() + "_shark"), () -> {
var model = new JsonObject();
model.addProperty("parent", BlahajTotem.id("item/shork").toString());

var textures = new JsonObject();
textures.addProperty("0", BlahajTotem.id("item/blahaj_skins/" + variant + "_shark").toString());
textures.addProperty("0", BlahajTotem.id("item/blahaj_skins/" + variant.name() + "_shark").toString());
model.add("textures", textures);

return model;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package dev.enjarai.blahajtotem.mixin;

import com.llamalad7.mixinextras.sugar.Local;
import dev.enjarai.blahajtotem.particle.BlahajParticleEffect;
import dev.enjarai.blahajtotem.particle.ModParticles;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.particle.ParticleEffect;
import net.minecraft.util.Hand;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;

@Mixin(ClientPlayNetworkHandler.class)
public abstract class ClientPlayNetworkHandlerMixin {
@ModifyArg(
method = "onEntityStatus",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/particle/ParticleManager;addEmitter(Lnet/minecraft/entity/Entity;Lnet/minecraft/particle/ParticleEffect;I)V"
),
index = 1
)
private ParticleEffect modifyTotemParticle(ParticleEffect original, @Local Entity entity) {
if (entity instanceof LivingEntity livingEntity) {
var colors = BlahajParticleEffect.getColorsForShork(getActiveTotemOfUndyingForAnyEntity(livingEntity));

if (colors.length > 0) {
return new BlahajParticleEffect(ModParticles.BLAHAJ_OF_UNDYING, colors);
}
}

return original;
}

@Unique
private static ItemStack getActiveTotemOfUndyingForAnyEntity(LivingEntity entity) {
for (Hand hand : Hand.values()) {
ItemStack itemStack = entity.getStackInHand(hand);
if (itemStack.isOf(Items.TOTEM_OF_UNDYING)) {
return itemStack;
}
}

return new ItemStack(Items.TOTEM_OF_UNDYING);
}
}
39 changes: 39 additions & 0 deletions src/main/java/dev/enjarai/blahajtotem/particle/BlahajParticle.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package dev.enjarai.blahajtotem.particle;

import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.particle.AnimatedParticle;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleFactory;
import net.minecraft.client.particle.SpriteProvider;
import net.minecraft.client.world.ClientWorld;

public class BlahajParticle extends AnimatedParticle {
protected BlahajParticle(ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ, int[] colors, SpriteProvider spriteProvider) {
super(world, x, y, z, spriteProvider, 1.25F);
this.velocityMultiplier = 0.6F;
this.velocityX = velocityX;
this.velocityY = velocityY;
this.velocityZ = velocityZ;
this.scale *= 0.75F;
this.maxAge = 60 + this.random.nextInt(12);
this.setSpriteForAge(spriteProvider);

if (colors.length >= 1) {
this.setColor(colors[this.random.nextInt(colors.length)]);
}
}

@Environment(EnvType.CLIENT)
public static class Factory implements ParticleFactory<BlahajParticleEffect> {
private final SpriteProvider spriteProvider;

public Factory(SpriteProvider spriteProvider) {
this.spriteProvider = spriteProvider;
}

public Particle createParticle(BlahajParticleEffect effect, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) {
return new BlahajParticle(clientWorld, d, e, f, g, h, i, effect.colors(), this.spriteProvider);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package dev.enjarai.blahajtotem.particle;

import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import dev.enjarai.blahajtotem.BlahajTotem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.particle.ParticleEffect;
import net.minecraft.particle.ParticleType;
import net.minecraft.registry.Registries;

public record BlahajParticleEffect(ParticleType<BlahajParticleEffect> type, int[] colors) implements ParticleEffect {
@SuppressWarnings("deprecation")
public static final ParticleEffect.Factory<BlahajParticleEffect> PARAMETERS_FACTORY = new ParticleEffect.Factory<>() {
@Override
public BlahajParticleEffect read(ParticleType<BlahajParticleEffect> type, StringReader reader) throws CommandSyntaxException {
return new BlahajParticleEffect(type, new int[0]); // This doesn't actually need to work with commands, so dummy impl it is
}

@Override
public BlahajParticleEffect read(ParticleType<BlahajParticleEffect> type, PacketByteBuf buf) {
return new BlahajParticleEffect(type, buf.readIntArray());
}
};

@Override
public ParticleType<?> getType() {
return type;
}

@Override
public void write(PacketByteBuf buf) {
buf.writeIntArray(colors);
}

@Override
public String asString() {
return Registries.PARTICLE_TYPE.getId(getType()) + "";
}

public static int[] getColorsForShork(ItemStack shorkStack) {
var type = BlahajTotem.getShorkType(shorkStack);
if (type != null) {
return type.colors();
}
return new int[0];
}
}
17 changes: 17 additions & 0 deletions src/main/java/dev/enjarai/blahajtotem/particle/ModParticles.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package dev.enjarai.blahajtotem.particle;

import dev.enjarai.blahajtotem.BlahajTotem;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes;
import net.minecraft.particle.ParticleType;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;

public class ModParticles {
public static final ParticleType<BlahajParticleEffect> BLAHAJ_OF_UNDYING = FabricParticleTypes.complex(BlahajParticleEffect.PARAMETERS_FACTORY);

public static void register() {
Registry.register(Registries.PARTICLE_TYPE, BlahajTotem.id("blahaj_of_undying"), BLAHAJ_OF_UNDYING);
ParticleFactoryRegistry.getInstance().register(BLAHAJ_OF_UNDYING, BlahajParticle.Factory::new);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"textures": [
"minecraft:glitter_7",
"minecraft:glitter_6",
"minecraft:glitter_5",
"minecraft:glitter_4",
"minecraft:glitter_3",
"minecraft:glitter_2",
"minecraft:glitter_1",
"minecraft:glitter_0"
]
}
1 change: 1 addition & 0 deletions src/main/resources/blahaj-totem.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
},
"client": [
"BipedEntityModelMixin",
"ClientPlayNetworkHandlerMixin",
"PlayerEntityRendererMixin"
]
}

0 comments on commit b024695

Please sign in to comment.