add: a registry for mimicked entity types
This commit is contained in:
6 files changed
+73
-37
No files matched your search
@@ -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<SomeCustomAllayEntity> 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
|
||||
);
|
||||
|
||||
@@ -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<SFGuiderEntity> 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<?>, EntityType<?>> mappedEntityTypes = new ConcurrentHashMap<>();
|
||||
|
||||
private void init() {
|
||||
register(GUIDER, EntityType.ALLAY, SFGuiderEntity.createAllayAttributes().build());
|
||||
}
|
||||
|
||||
private <A extends LivingEntity, B extends LivingEntity> void register(EntityType<B> custom, EntityType<A> origin, DefaultAttributeContainer attr) {
|
||||
FabricDefaultAttributeRegistry.register(custom, attr);
|
||||
mappedEntityTypes.put(custom, origin);
|
||||
}
|
||||
|
||||
static void registerEntities() {
|
||||
registry = new SFEntityType();
|
||||
registry.init();
|
||||
}
|
||||
|
||||
public static <T extends LivingEntity> EntityType<T> mapToVanilla(EntityType<?> type) {
|
||||
return (EntityType<T>) registry.mappedEntityTypes.getOrDefault(type, type);
|
||||
}
|
||||
}
|
||||
+2
-9
@@ -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<SomeCustomAllayEntity> entityEntityType, World world) {
|
||||
public class SFGuiderEntity extends AllayEntity {
|
||||
public SFGuiderEntity(EntityType<SFGuiderEntity> entityEntityType, World world) {
|
||||
super(entityEntityType, world);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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<EntityType> cir) {
|
||||
cir.setReturnValue(SFEntityType.mapToVanilla(content.entityType));
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user