Skip to content

Commit

Permalink
Override vanilla cat variant logic + other stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
nyuppo committed Mar 11, 2024
1 parent c741227 commit 1d5fa44
Show file tree
Hide file tree
Showing 41 changed files with 285 additions and 173 deletions.
2 changes: 0 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ dependencies {

// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"

modImplementation include("eu.pb4:polymer-core:${project.polymer_version}")
}

processResources {
Expand Down
1 change: 0 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,3 @@ archives_base_name = moremobvariants

# Dependencies
fabric_version=0.95.1+1.20.4
polymer_version=0.7.5+1.20.4
41 changes: 20 additions & 21 deletions src/main/java/com/github/nyuppo/MoreMobVariants.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.github.nyuppo.config.ConfigDataLoader;
import com.github.nyuppo.networking.MMVNetworkingConstants;
import com.github.nyuppo.polymer.PolymerCatVariant;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
Expand All @@ -13,19 +12,16 @@
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.entity.passive.CatVariant;
import net.minecraft.entity.passive.PigEntity;
import net.minecraft.entity.passive.SheepEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.resource.ResourceType;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.Identifier;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeKeys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -37,19 +33,11 @@ public class MoreMobVariants implements ModInitializer {

// NBT keys
public static final String NBT_KEY = "Variant";
public static final String CUSTOM_NBT_KEY = "CustomVariant";
public static final String MUDDY_NBT_KEY = "IsMuddy"; // Muddy pigs
public static final String MUDDY_TIMEOUT_NBT_KEY = "MuddyTimeLeft"; // Muddy pigs
//public static final String SHEEP_HORNS_NBT_KEY = "HasHorns";
public static final String SHEEP_HORN_COLOUR_NBT_KEY = "HornColour";

public static final Identifier MMB_HELLO_PACKET = new Identifier(MOD_ID, "hello");

// Cat variants
public static final CatVariant GRAY_TABBY = new PolymerCatVariant(new Identifier(MOD_ID, "textures/entity/cat/gray_tabby.png"));
public static final CatVariant DOUG = new PolymerCatVariant(new Identifier(MOD_ID, "textures/entity/cat/doug.png"));
public static final CatVariant HANDSOME = new PolymerCatVariant(new Identifier(MOD_ID, "textures/entity/cat/handsome.png"));
public static final CatVariant TORTOISESHELL = new PolymerCatVariant(new Identifier(MOD_ID, "textures/entity/cat/tortoiseshell.png"));

// Pig mud tag
public static final TagKey<Block> PIG_MUD_BLOCKS = TagKey.of(RegistryKeys.BLOCK, new Identifier(MOD_ID, "pig_mud_blocks"));

Expand All @@ -75,24 +63,29 @@ public void onInitialize() {
// Config
ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new ConfigDataLoader());

// Register cat variants
Registry.register(Registries.CAT_VARIANT, new Identifier(MOD_ID, "gray_tabby"), GRAY_TABBY);
Registry.register(Registries.CAT_VARIANT, new Identifier(MOD_ID, "doug"), DOUG);
Registry.register(Registries.CAT_VARIANT, new Identifier(MOD_ID, "handsome"), HANDSOME);
Registry.register(Registries.CAT_VARIANT, new Identifier(MOD_ID, "tortoiseshell"), TORTOISESHELL);

// Make wolves spawn in more biomes
BiomeModifications.addSpawn(BiomeSelectors.tag(ADDITIONAL_WOLF_SPAWNS), SpawnGroup.CREATURE, EntityType.WOLF, 5, 4, 4);

// Server event to respond to client request for a variant
ServerPlayNetworking.registerGlobalReceiver(MMVNetworkingConstants.CLIENT_REQUEST_VARIANT_ID, ((server, player, handler, buf, responseSender) -> {
UUID uuid = buf.readUuid();
Entity entity = server.getOverworld().getEntity(uuid);

// If we couldn't find the mob in the overworld, start checking all other worlds
if (entity == null) {
for (ServerWorld serverWorld : server.getWorlds()) {
Entity entity2 = serverWorld.getEntity(uuid);
if (entity2 != null) {
entity = entity2;
}
}
}

if (entity != null) {
NbtCompound nbt = new NbtCompound();
entity.writeNbt(nbt);

if (nbt.contains(NBT_KEY)) {
if (nbt.contains(NBT_KEY) && !nbt.contains(CUSTOM_NBT_KEY)) {
PacketByteBuf responseBuf = PacketByteBufs.create();
responseBuf.writeInt(entity.getId());
responseBuf.writeString(nbt.getString(NBT_KEY));
Expand All @@ -108,6 +101,12 @@ public void onInitialize() {
responseBuf.writeString(nbt.getString(SHEEP_HORN_COLOUR_NBT_KEY));
}

ServerPlayNetworking.send(handler.getPlayer(), MMVNetworkingConstants.SERVER_RESPOND_VARIANT_ID, responseBuf);
} else if (nbt.contains(CUSTOM_NBT_KEY)) { // Cats
PacketByteBuf responseBuf = PacketByteBufs.create();
responseBuf.writeInt(entity.getId());
responseBuf.writeString(nbt.getString(CUSTOM_NBT_KEY));

ServerPlayNetworking.send(handler.getPlayer(), MMVNetworkingConstants.SERVER_RESPOND_VARIANT_ID, responseBuf);
}
}
Expand Down
17 changes: 9 additions & 8 deletions src/main/java/com/github/nyuppo/MoreMobVariantsClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.github.nyuppo.client.render.entity.feature.ShearedWoolColorFeatureRenderer;
import com.github.nyuppo.client.render.entity.feature.SheepHornsFeatureRenderer;
import com.github.nyuppo.networking.MMVNetworkingConstants;
import eu.pb4.polymer.networking.api.client.PolymerClientNetworking;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
Expand All @@ -13,21 +12,22 @@
import net.minecraft.client.render.entity.PigEntityRenderer;
import net.minecraft.client.render.entity.SheepEntityRenderer;
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
import net.minecraft.client.render.entity.feature.SheepWoolFeatureRenderer;
import net.minecraft.client.render.entity.model.PigEntityModel;
import net.minecraft.client.render.entity.model.SheepEntityModel;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.passive.CatEntity;
import net.minecraft.entity.passive.PigEntity;
import net.minecraft.entity.passive.SheepEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtInt;
import net.minecraft.network.PacketByteBuf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Set;

public class MoreMobVariantsClient implements ClientModInitializer {
Set<EntityType> validEntities = Set.of(EntityType.CHICKEN, EntityType.COW, EntityType.PIG, EntityType.SHEEP, EntityType.SKELETON, EntityType.SPIDER, EntityType.WOLF, EntityType.ZOMBIE);
Set<EntityType> validEntities = Set.of(EntityType.CAT, EntityType.CHICKEN, EntityType.COW, EntityType.PIG, EntityType.SHEEP, EntityType.SKELETON, EntityType.SPIDER, EntityType.WOLF, EntityType.ZOMBIE);

@Override
public void onInitializeClient() {
Expand All @@ -41,9 +41,6 @@ public void onInitializeClient() {
}
});

// Polymer handshake
PolymerClientNetworking.setClientMetadata(MoreMobVariants.MMB_HELLO_PACKET, NbtInt.of(1));

// Client event to request variant when a mob is loaded
ClientEntityEvents.ENTITY_LOAD.register((entity, world) -> {
// Check if entity can have variants so we don't make useless requests
Expand All @@ -66,7 +63,11 @@ public void onInitializeClient() {
NbtCompound nbt = new NbtCompound();
entity.writeNbt(nbt);

nbt.putString(MoreMobVariants.NBT_KEY, variantId);
if (entity instanceof CatEntity) { // Mobs that have vanilla 'variant' nbt data
nbt.putString(MoreMobVariants.CUSTOM_NBT_KEY, variantId);
} else {
nbt.putString(MoreMobVariants.NBT_KEY, variantId);
}

// Muddy pigs
boolean isMuddy;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/github/nyuppo/config/ConfigDataLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,10 @@ private void applyVariant(Reader reader, String namespace, String mobId, String
if (element.getAsJsonObject().has("nametag_override")) {
modifiers.add(new NametagOverrideModifier(element.getAsJsonObject().get("nametag_override").getAsString()));
}

if (element.getAsJsonObject().has("minimum_moon_size")) {
modifiers.add(new MoonPhaseModifier(element.getAsJsonObject().get("minimum_moon_size").getAsFloat()));
}
}

Variants.addVariant(Variants.getMob(mobId), new MobVariant(new Identifier(namespace, variantId), weight, modifiers));
Expand Down
32 changes: 25 additions & 7 deletions src/main/java/com/github/nyuppo/config/Variants.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,18 @@ public static MobVariant getVariant(EntityType<?> mob, Identifier identifier) {
return getDefaultVariant(mob);
}

@Nullable
public static MobVariant getVariantNullable(EntityType<?> mob, Identifier identifier) {
ArrayList<MobVariant> variants = getVariants(mob);

for (MobVariant variant : variants) {
if (variant.getIdentifier().equals(identifier)) {
return variant;
}
}
return null;
}

public static void resetVariants(EntityType<?> mob) {
variants.remove(mob);
variants.put(mob, defaultVariants.get(mob));
Expand Down Expand Up @@ -113,10 +125,6 @@ public static void validateEmptyVariants() {

public static void applyBlacklists() {
variants.keySet().forEach((EntityType<?> mob) -> {
if (mob.equals(EntityType.CAT) || variants.get(mob) == null) {
return;
}

List<MobVariant> variantsList = variants.get(mob);
if (variantsList.isEmpty()) {
return;
Expand All @@ -142,7 +150,7 @@ public static EntityType<?> getMob(String mobId) {
throw new IllegalArgumentException("Unknown mob identifier: " + mobId);
}

public static MobVariant getRandomVariant(EntityType<?> mob, Random random, @Nullable RegistryEntry<Biome> spawnBiome, @Nullable BreedingResultData breedingResultData) {
public static MobVariant getRandomVariant(EntityType<?> mob, Random random, @Nullable RegistryEntry<Biome> spawnBiome, @Nullable BreedingResultData breedingResultData, @Nullable Float moonSize) {
ArrayList<MobVariant> variants = getVariants(mob);
if (variants.isEmpty()) {
return getDefaultVariant(mob);
Expand Down Expand Up @@ -171,12 +179,22 @@ public static MobVariant getRandomVariant(EntityType<?> mob, Random random, @Nul
// Discard if variant is discardable
if (variant.shouldDiscard(random)) {
i.remove();
continue;
}

// Discord if variant has nametag override
// Note: they shouldn't be in this pool in the first place, but better safe than sorry
if (variant.isNametagOverride()) {
i.remove();
continue;
}

// Discard if minimum moon phase is not present
if (moonSize != null && variant.hasMinimumMoonSize()) {
if (!variant.meetsMinimumMoonSize(moonSize)) {
i.remove();
continue;
}
}
}

Expand Down Expand Up @@ -233,9 +251,9 @@ public static MobVariant getChildVariant(EntityType<?> mob, ServerWorld world, P
String[] parent2VariantId = parent2Nbt.getString("Variant").split(":");
MobVariant parent2Variant = Variants.getVariant(mob, new Identifier(parent2VariantId[0], parent2VariantId[1]));

return Variants.getRandomVariant(mob, world.getRandom(), world.getBiome(parent1.getBlockPos()), new BreedingResultData(parent1Variant, parent2Variant));
return Variants.getRandomVariant(mob, world.getRandom(), world.getBiome(parent1.getBlockPos()), new BreedingResultData(parent1Variant, parent2Variant), null);
} else {
return Variants.getRandomVariant(mob, world.getRandom(), world.getBiome(parent1.getBlockPos()), null);
return Variants.getRandomVariant(mob, world.getRandom(), world.getBiome(parent1.getBlockPos()), null, null);
}
}

Expand Down
45 changes: 0 additions & 45 deletions src/main/java/com/github/nyuppo/mixin/CatBlacklistMixin.java

This file was deleted.

43 changes: 43 additions & 0 deletions src/main/java/com/github/nyuppo/mixin/CatRendererMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.github.nyuppo.mixin;

import com.github.nyuppo.MoreMobVariants;
import com.github.nyuppo.config.Variants;
import com.github.nyuppo.variant.MobVariant;
import net.minecraft.client.render.entity.CatEntityRenderer;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.passive.CatEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Mixin(CatEntityRenderer.class)
public class CatRendererMixin {
private static final Identifier DEFAULT = new Identifier("textures/entity/cat/tabby.png");

@Inject(method = "getTexture", at = @At("HEAD"), cancellable = true)
private void onGetTexture(CatEntity catEntity, CallbackInfoReturnable<Identifier> ci) {
NbtCompound nbt = new NbtCompound();
catEntity.writeNbt(nbt);

if (nbt.contains(MoreMobVariants.CUSTOM_NBT_KEY)) {
String variant = nbt.getString(MoreMobVariants.CUSTOM_NBT_KEY);
if (variant.equals(MoreMobVariants.id("default").toString()) || variant.isEmpty()) {
ci.setReturnValue(DEFAULT);
} else {
String[] split = Variants.splitVariant(variant);
ci.setReturnValue(new Identifier(split[0], "textures/entity/cat/" + split[1] + ".png"));
}
}

if (catEntity.hasCustomName()) {
MobVariant variant = Variants.getVariantFromNametag(EntityType.CAT, catEntity.getName().getString());
if (variant != null) {
Identifier identifier = variant.getIdentifier();
ci.setReturnValue(new Identifier(identifier.getNamespace(), "textures/entity/cat/" + identifier.getPath() + ".png"));
}
}
}
}
Loading

0 comments on commit 1d5fa44

Please sign in to comment.