diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java index 774c13468..e5636846e 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/entity/ArmadilloController.java @@ -19,12 +19,17 @@ import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.TagKey; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.armadillo.Armadillo; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.AbstractMinecart; import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; @@ -94,6 +99,9 @@ public class ArmadilloController extends MobEntityController { if (npc != null) { NMSImpl.updateMinecraftAIState(npc, this); npc.update(); + if (npc.isProtected()) { + NMSImpl.setScuteTime(this, 2); + } } } @@ -162,6 +170,16 @@ public class ArmadilloController extends MobEntityController { return NMSBoundingBox.makeBB(npc, super.makeBoundingBox()); } + @Override + public InteractionResult mobInteract(Player entityhuman, InteractionHand enumhand) { + if (npc == null || !npc.isProtected()) + return super.mobInteract(entityhuman, enumhand); + ItemStack itemstack = entityhuman.getItemInHand(enumhand); + if (itemstack.getItem() == Items.BRUSH) + return InteractionResult.FAIL; + return super.mobInteract(entityhuman, enumhand); + } + @Override public boolean onClimbable() { if (npc == null || !npc.isFlyable()) diff --git a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java index c2485459f..7b2d7a394 100644 --- a/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java +++ b/v1_20_R4/src/main/java/net/citizensnpcs/nms/v1_20_R4/util/NMSImpl.java @@ -2447,6 +2447,16 @@ public class NMSImpl implements NMSBridge { } } + public static void setScuteTime(Entity armadillo, int scuteTime) { + if (ARMADILLO_SCUTE_TIME == null) + return; + try { + ARMADILLO_SCUTE_TIME.invoke(armadillo, scuteTime); + } catch (Throwable e) { + e.printStackTrace(); + } + } + public static void setSize(Entity entity, boolean justCreated) { try { EntityDimensions entitysize = (EntityDimensions) SIZE_FIELD_GETTER.invoke(entity); @@ -2544,6 +2554,8 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENTS_PLAYER_SETTER = NMS.getFirstFinalSetter(ServerPlayer.class, PlayerAdvancements.class); + + private static final MethodHandle ARMADILLO_SCUTE_TIME = NMS.getSetter(Armadillo.class, "cj"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getFirstGetter(AttributeSupplier.class, Map.class); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFirstFinalSetter(AttributeSupplier.class, Map.class); diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/AllayController.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/AllayController.java index c07741f8c..a4eeb0ee0 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/AllayController.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/AllayController.java @@ -58,7 +58,6 @@ public class AllayController extends MobEntityController { public static class EntityAllayNPC extends Allay implements NPCHolder { private final CitizensNPC npc; - private int taskId = -1; public EntityAllayNPC(EntityType types, Level level) { @@ -84,6 +83,13 @@ public class AllayController extends MobEntityController { return false; } + @Override + public Entity changeDimension(DimensionTransition transition) { + if (npc == null) + return super.changeDimension(transition); + return NMSImpl.teleportAcrossWorld(this, transition); + } + @Override public void checkDespawn() { if (npc == null) { @@ -217,13 +223,6 @@ public class AllayController extends MobEntityController { return npc == null ? super.save(save) : false; } - @Override - public Entity changeDimension(DimensionTransition transition) { - if (npc == null) - return super.changeDimension(transition); - return NMSImpl.teleportAcrossWorld(this, transition); - } - @Override public void travel(Vec3 vec3d) { if (npc == null || !npc.isFlyable()) { diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/ArmadilloController.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/ArmadilloController.java index 04d51cc82..7dbe88733 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/ArmadilloController.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/entity/ArmadilloController.java @@ -18,12 +18,17 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.sounds.SoundEvent; import net.minecraft.tags.TagKey; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.armadillo.Armadillo; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.AbstractMinecart; import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; @@ -74,6 +79,13 @@ public class ArmadilloController extends MobEntityController { return false; } + @Override + public Entity changeDimension(DimensionTransition transition) { + if (npc == null) + return super.changeDimension(transition); + return NMSImpl.teleportAcrossWorld(this, transition); + } + @Override public void checkDespawn() { if (npc == null) { @@ -94,6 +106,9 @@ public class ArmadilloController extends MobEntityController { if (npc != null) { NMSImpl.updateMinecraftAIState(npc, this); npc.update(); + if (npc.isProtected()) { + NMSImpl.setScuteTime(this, 2); + } } } @@ -162,6 +177,16 @@ public class ArmadilloController extends MobEntityController { return NMSBoundingBox.makeBB(npc, super.makeBoundingBox()); } + @Override + public InteractionResult mobInteract(Player entityhuman, InteractionHand enumhand) { + if (npc == null || !npc.isProtected()) + return super.mobInteract(entityhuman, enumhand); + ItemStack itemstack = entityhuman.getItemInHand(enumhand); + if (itemstack.getItem() == Items.BRUSH) + return InteractionResult.FAIL; + return super.mobInteract(entityhuman, enumhand); + } + @Override public boolean onClimbable() { if (npc == null || !npc.isFlyable()) @@ -194,13 +219,6 @@ public class ArmadilloController extends MobEntityController { return npc == null ? super.save(save) : false; } - @Override - public Entity changeDimension(DimensionTransition transition) { - if (npc == null) - return super.changeDimension(transition); - return NMSImpl.teleportAcrossWorld(this, transition); - } - @Override public void travel(Vec3 vec3d) { if (npc == null || !npc.isFlyable()) { diff --git a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java index a8343f4ff..20e8e8287 100644 --- a/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java +++ b/v1_21_R1/src/main/java/net/citizensnpcs/nms/v1_21_R1/util/NMSImpl.java @@ -937,7 +937,6 @@ public class NMSImpl implements NMSBridge { } private void loadEntityTypes() { - EntityControllers.setEntityControllerForType(EntityType.ALLAY, AllayController.class); EntityControllers.setEntityControllerForType(EntityType.AREA_EFFECT_CLOUD, AreaEffectCloudController.class); EntityControllers.setEntityControllerForType(EntityType.ARMADILLO, ArmadilloController.class); @@ -2426,6 +2425,16 @@ public class NMSImpl implements NMSBridge { } } + public static void setScuteTime(Entity armadillo, int scuteTime) { + if (ARMADILLO_SCUTE_TIME == null) + return; + try { + ARMADILLO_SCUTE_TIME.invoke(armadillo, scuteTime); + } catch (Throwable e) { + e.printStackTrace(); + } + } + public static void setSize(Entity entity, boolean justCreated) { try { EntityDimensions entitysize = (EntityDimensions) SIZE_FIELD_GETTER.invoke(entity); @@ -2511,6 +2520,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENTS_PLAYER_SETTER = NMS.getFirstFinalSetter(ServerPlayer.class, PlayerAdvancements.class); + private static final MethodHandle ARMADILLO_SCUTE_TIME = NMS.getSetter(Armadillo.class, "cn"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getFirstGetter(AttributeSupplier.class, Map.class); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFirstFinalSetter(AttributeSupplier.class, Map.class); @@ -2562,10 +2572,10 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle NAVIGATION_CREATE_PATHFINDER = NMS .getFirstMethodHandleWithReturnType(PathNavigation.class, true, PathFinder.class, int.class); private static final MethodHandle NAVIGATION_PATH = NMS.getFirstGetter(PathNavigation.class, Path.class); + private static final MethodHandle NAVIGATION_PATHFINDER = NMS.getFirstFinalSetter(PathNavigation.class, PathFinder.class); private static final MethodHandle NAVIGATION_WORLD_FIELD = NMS.getFirstSetter(PathNavigation.class, Level.class); - private static final MethodHandle PLAYER_INFO_ENTRIES_LIST = NMS .getFirstFinalSetter(ClientboundPlayerInfoUpdatePacket.class, List.class); private static final MethodHandle PLAYERINFO_ENTRIES = PLAYER_INFO_ENTRIES_LIST;