Merge pull request #20 from saltedfishclub/test-new-entity
Serverside Entities
This commit is contained in:
8 files changed
+159
-14
No files matched your search
@@ -56,14 +56,14 @@ public class SFCraftInitializer extends GuiceModInitializer {
|
|||||||
protected void onReady(MinecraftServer minecraftServer) {
|
protected void onReady(MinecraftServer minecraftServer) {
|
||||||
log.info("SFCraft is loading");
|
log.info("SFCraft is loading");
|
||||||
SFCraft.server = minecraftServer;
|
SFCraft.server = minecraftServer;
|
||||||
SFCraft.injector = getInjector();
|
|
||||||
getModuleManager().switchGlobalState(Lifecycle.State.ENABLED);
|
getModuleManager().switchGlobalState(Lifecycle.State.ENABLED);
|
||||||
log.info("Load completed! " + getModuleManager().getModules().size() + " modules were loaded.");
|
log.info("Load completed! " + getModuleManager().getModules().size() + " modules were loaded.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Injector onInit() {
|
protected Injector onInit() {
|
||||||
return Guice.createInjector(
|
SFEntityType.registerEntities();
|
||||||
|
return SFCraft.injector = Guice.createInjector(
|
||||||
new SFCraft(),
|
new SFCraft(),
|
||||||
this
|
this
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
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"),
|
||||||
|
EntityType.Builder.create(SFGuiderEntity::new, SpawnGroup.CREATURE)
|
||||||
|
.dimensions(0.35F, 0.6F)
|
||||||
|
.eyeHeight(0.36F)
|
||||||
|
.vehicleAttachment(0.04F)
|
||||||
|
.maxTrackingRange(8)
|
||||||
|
.trackingTickInterval(2).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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package io.ib67.sfcraft.entity;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.networking.v1.PlayerLookup;
|
||||||
|
import net.minecraft.entity.EntityType;
|
||||||
|
import net.minecraft.entity.passive.AllayEntity;
|
||||||
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.server.world.ServerWorld;
|
||||||
|
import net.minecraft.text.Text;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
public class SFGuiderEntity extends AllayEntity {
|
||||||
|
public SFGuiderEntity(EntityType<SFGuiderEntity> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,7 +4,11 @@ import io.ib67.sfcraft.SFCraft;
|
|||||||
import io.ib67.sfcraft.callback.SFCallbacks;
|
import io.ib67.sfcraft.callback.SFCallbacks;
|
||||||
import io.ib67.sfcraft.mixin.server.bridge.ServerPlayerBridge;
|
import io.ib67.sfcraft.mixin.server.bridge.ServerPlayerBridge;
|
||||||
import io.ib67.sfcraft.registry.chat.SimpleMessageDecorator;
|
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.network.message.MessageDecorator;
|
||||||
|
import net.minecraft.registry.Registries;
|
||||||
|
import net.minecraft.registry.Registry;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import net.minecraft.server.network.ServerPlayNetworkHandler;
|
import net.minecraft.server.network.ServerPlayNetworkHandler;
|
||||||
import net.minecraft.text.Text;
|
import net.minecraft.text.Text;
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
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;
|
||||||
|
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) {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<DirectRegistryPacketHandler.Payload> sender, Map<Identifier, Object2IntMap<Identifier>> registryMap, CallbackInfo ci) {
|
||||||
|
registryMap.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,21 +8,24 @@
|
|||||||
"client": [
|
"client": [
|
||||||
],
|
],
|
||||||
"server": [
|
"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.AbstractFurnaceBlockMixin",
|
||||||
"server.ServerHandshakeNetworkHandlerMixin",
|
"server.EntityMixin",
|
||||||
"server.LegacyQueryHandlerMixin",
|
"server.LegacyQueryHandlerMixin",
|
||||||
"server.ServerPlayerEntityMixin",
|
"server.MinecraftServerMixin",
|
||||||
"server.PlayerEntityMixin",
|
"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",
|
||||||
|
"server.hack.HoverEntityContentMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|||||||
Reference in new issue
Block a user