diff --git a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java index 61b2588..dd9aa4f 100644 --- a/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java +++ b/src/main/java/io/ib67/sfcraft/SFCraftInitializer.java @@ -3,6 +3,7 @@ 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; @@ -16,11 +17,26 @@ 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(); @@ -58,9 +74,14 @@ public class SFCraftInitializer extends GuiceModInitializer { 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( diff --git a/src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java b/src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java new file mode 100644 index 0000000..3cffb89 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/entity/SomeCustomAllayEntity.java @@ -0,0 +1,37 @@ +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) { + super(entityEntityType, world); + } + + @Override + public Text getName() { + return Text.of("guider"); + } + + @Override + public void tick() { + super.tick(); + var nearbyPlayer = PlayerLookup.around((ServerWorld) getWorld(), getPos(), 20D); + for (ServerPlayerEntity serverPlayerEntity : nearbyPlayer) { + this.navigation.startMovingTo(serverPlayerEntity, 2f); + break; + } + } +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java index f792eb0..7231b08 100644 --- a/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/io/ib67/sfcraft/mixin/server/ServerPlayNetworkHandlerMixin.java @@ -4,7 +4,11 @@ import io.ib67.sfcraft.SFCraft; import io.ib67.sfcraft.callback.SFCallbacks; import io.ib67.sfcraft.mixin.server.bridge.ServerPlayerBridge; import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator; +import net.minecraft.entity.EntityType; +import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.message.MessageDecorator; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.text.Text; 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 new file mode 100644 index 0000000..69809e1 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/hack/EntitySpawnS2CPacketMixin.java @@ -0,0 +1,19 @@ +package io.ib67.sfcraft.mixin.server.hack; + +import io.ib67.sfcraft.SFCraftInitializer; +import net.minecraft.entity.EntityType; +import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(EntitySpawnS2CPacket.class) +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; + } +} diff --git a/src/main/java/io/ib67/sfcraft/mixin/server/hack/RegistryHandlerMixin.java b/src/main/java/io/ib67/sfcraft/mixin/server/hack/RegistryHandlerMixin.java new file mode 100644 index 0000000..5b4f2d6 --- /dev/null +++ b/src/main/java/io/ib67/sfcraft/mixin/server/hack/RegistryHandlerMixin.java @@ -0,0 +1,21 @@ +package io.ib67.sfcraft.mixin.server.hack; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import net.fabricmc.fabric.impl.registry.sync.packet.DirectRegistryPacketHandler; +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.CallbackInfo; + +import java.util.Map; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +@Mixin(DirectRegistryPacketHandler.class) +public abstract class RegistryHandlerMixin { + @Inject(method = "sendPacket", at = @At("HEAD"), remap = false) + public void sf$removeRegistry(Consumer sender, Map> registryMap, CallbackInfo ci) { + registryMap.clear(); + } +} diff --git a/src/main/resources/sfcraft.mixins.json b/src/main/resources/sfcraft.mixins.json index 8ddbe6f..c7013e1 100644 --- a/src/main/resources/sfcraft.mixins.json +++ b/src/main/resources/sfcraft.mixins.json @@ -8,21 +8,23 @@ "client": [ ], "server": [ - "server.fixes.EndermanEntityMixin$ChaseGoalMixin", - "server.bridge.ServerWorldBridge", - "server.bridge.ServerPlayerBridge", - "server.bridge.EntityBridge", - "server.MinecraftServerMixin", - "server.ServerPlayNetworkHandlerMixin", - "server.SleepManagerMixin", - "server.ServerWorldMixin", - "server.EntityMixin", "server.AbstractFurnaceBlockMixin", - "server.ServerHandshakeNetworkHandlerMixin", + "server.EntityMixin", "server.LegacyQueryHandlerMixin", - "server.ServerPlayerEntityMixin", + "server.MinecraftServerMixin", "server.PlayerEntityMixin", - "server.ServerLoginNetworkHandlerMixin" + "server.ServerHandshakeNetworkHandlerMixin", + "server.ServerLoginNetworkHandlerMixin", + "server.ServerPlayerEntityMixin", + "server.ServerPlayNetworkHandlerMixin", + "server.ServerWorldMixin", + "server.SleepManagerMixin", + "server.bridge.EntityBridge", + "server.bridge.ServerPlayerBridge", + "server.bridge.ServerWorldBridge", + "server.fixes.EndermanEntityMixin$ChaseGoalMixin", + "server.hack.EntitySpawnS2CPacketMixin", + "server.hack.RegistryHandlerMixin" ], "injectors": { "defaultRequire": 1