diff --git a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java index dd9aa4f..9c8ce6e 100644 --- a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java +++ b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java @@ -3,7 +3,6 @@ package io.ib67.sfcraft; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.inject.*; -import io.ib67.sfcraft.entity.SomeCustomAllayEntity; import io.ib67.sfcraft.module.*; import io.ib67.sfcraft.module.chat.ChatPingModule; import io.ib67.sfcraft.module.chat.ChatSendLocModule; @@ -17,26 +16,11 @@ import io.ib67.sfcraft.inject.MinecraftServerSupplier; import io.ib67.sfcraft.registry.event.RandomEventRegistry; import io.ib67.sfcraft.module.command.BackModule; import io.ib67.sfcraft.module.command.ManagementModule; -import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; @Log4j2 public class SFCraftInitializer extends GuiceModInitializer { - public static final EntityType ALLAY = Registry.register( - Registries.ENTITY_TYPE, - Identifier.of("sfcraft", "allay"), - FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, SomeCustomAllayEntity::new).build() - ); @Override protected void configure() { super.configure(); @@ -72,19 +56,14 @@ public class SFCraftInitializer extends GuiceModInitializer { protected void onReady(MinecraftServer minecraftServer) { log.info("SFCraft is loading"); SFCraft.server = minecraftServer; - SFCraft.injector = getInjector(); getModuleManager().switchGlobalState(Lifecycle.State.ENABLED); - test(); log.info("Load completed! " + getModuleManager().getModules().size() + " modules were loaded."); } - private void test() { - FabricDefaultAttributeRegistry.register(ALLAY,SomeCustomAllayEntity.createAllayAttributes().build()); - } - @Override protected Injector onInit() { - return Guice.createInjector( + SFEntityType.registerEntities(); + return SFCraft.injector = Guice.createInjector( new SFCraft(), this ); diff --git a/src/main/java/io/ib67/sfcraft/SFEntityType.java b/src/main/java/io/ib67/sfcraft/SFEntityType.java new file mode 100644 index 0000000..7f78357 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/SFEntityType.java @@ -0,0 +1,47 @@ +package io.ib67.sfcraft; + +import io.ib67.sfcraft.entity.SFGuiderEntity; +import lombok.experimental.UtilityClass; +import lombok.extern.log4j.Log4j2; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.SpawnGroup; +import net.minecraft.entity.attribute.DefaultAttributeContainer; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Log4j2 +public class SFEntityType { + public final EntityType GUIDER = Registry.register( + Registries.ENTITY_TYPE, + Identifier.of("sfcraft", "guider"), + FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, SFGuiderEntity::new).build() + ); + private static SFEntityType registry; + private final Map, EntityType> mappedEntityTypes = new ConcurrentHashMap<>(); + + private void init() { + register(GUIDER, EntityType.ALLAY, SFGuiderEntity.createAllayAttributes().build()); + } + + private void register(EntityType custom, EntityType origin, DefaultAttributeContainer attr) { + FabricDefaultAttributeRegistry.register(custom, attr); + mappedEntityTypes.put(custom, origin); + } + + static void registerEntities() { + registry = new SFEntityType(); + registry.init(); + } + + public static EntityType mapToVanilla(EntityType type) { + return (EntityType) registry.mappedEntityTypes.getOrDefault(type, type); + } +} diff --git a/src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java b/src/main/java/io/ib67/sfcraft/entity/SFGuiderEntity.java similarity index 62% rename from src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java rename to src/main/java/io/ib67/sfcraft/entity/SFGuiderEntity.java index 3cffb89..8968e00 100644 --- a/src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java +++ b/src/main/java/io/ib67/sfcraft/entity/SFGuiderEntity.java @@ -1,22 +1,15 @@ package io.ib67.sfcraft.entity; -import io.ib67.sfcraft.SFCraftInitializer; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; -import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.passive.AllayEntity; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; import net.minecraft.world.World; -public class SomeCustomAllayEntity extends AllayEntity { - public SomeCustomAllayEntity(EntityType entityEntityType, World world) { +public class SFGuiderEntity extends AllayEntity { + public SFGuiderEntity(EntityType entityEntityType, World world) { super(entityEntityType, world); } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/hack/EntitySpawnS2CPacketMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/hack/EntitySpawnS2CPacketMixin.java index 69809e1..4ea274b 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/hack/EntitySpawnS2CPacketMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/hack/EntitySpawnS2CPacketMixin.java @@ -1,6 +1,7 @@ package io.ib67.sfcraft.mixin.server.hack; import io.ib67.sfcraft.SFCraftInitializer; +import io.ib67.sfcraft.SFEntityType; import net.minecraft.entity.EntityType; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; import org.spongepowered.asm.mixin.Mixin; @@ -11,9 +12,6 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; public class EntitySpawnS2CPacketMixin { @ModifyArg(method = "write", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/codec/PacketCodec;encode(Ljava/lang/Object;Ljava/lang/Object;)V"), index = 1) public Object mapModType(Object type) { - if (type == SFCraftInitializer.ALLAY) { - return EntityType.ALLAY; - } - return type; + return SFEntityType.mapToVanilla((EntityType) type); } } diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/hack/HoverEntityContentMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/hack/HoverEntityContentMixin.java new file mode 100644 index 0000000..2546341 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/hack/HoverEntityContentMixin.java @@ -0,0 +1,18 @@ +package io.ib67.sfcraft.mixin.server.hack; + +import io.ib67.sfcraft.SFCraftInitializer; +import io.ib67.sfcraft.SFEntityType; +import net.minecraft.entity.EntityType; +import net.minecraft.text.HoverEvent; +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(HoverEvent.EntityContent.class) +public class HoverEntityContentMixin { + @Inject(method = "method_54198", at = @At("HEAD"), cancellable = true) + private static void sf$mapToVanilla(HoverEvent.EntityContent content, CallbackInfoReturnable cir) { + cir.setReturnValue(SFEntityType.mapToVanilla(content.entityType)); + } +} diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index c7013e1..ee36b78 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -24,7 +24,8 @@ "server.bridge.ServerWorldBridge", "server.fixes.EndermanEntityMixin$ChaseGoalMixin", "server.hack.EntitySpawnS2CPacketMixin", - "server.hack.RegistryHandlerMixin" + "server.hack.RegistryHandlerMixin", + "server.hack.HoverEntityContentMixin" ], "injectors": { "defaultRequire": 1