From efff2ff9ab1c149eed91089e5c35b34c4e15ce72 Mon Sep 17 00:00:00 2001 From: fullwall Date: Wed, 29 Mar 2023 20:01:07 +0800 Subject: [PATCH] Add /npc enderdragon --destroywalls --- .../trait/versioned/EnderDragonTrait.java | 18 ++++++++++++++++-- .../v1_10_R1/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_10_R1/util/NMSImpl.java | 2 ++ .../v1_11_R1/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_11_R1/util/NMSImpl.java | 3 ++- .../v1_12_R1/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_12_R1/util/NMSImpl.java | 3 ++- .../v1_13_R2/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_13_R2/util/NMSImpl.java | 2 ++ .../v1_14_R1/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_14_R1/util/NMSImpl.java | 3 ++- .../v1_15_R1/entity/EnderDragonController.java | 12 ++++++++++++ .../nms/v1_15_R1/util/NMSImpl.java | 3 ++- .../v1_16_R3/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_16_R3/util/NMSImpl.java | 4 ++-- .../v1_17_R1/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_17_R1/util/NMSImpl.java | 7 ++----- .../v1_18_R2/entity/EnderDragonController.java | 13 +++++++++++++ .../nms/v1_18_R2/util/NMSImpl.java | 2 ++ .../v1_19_R3/entity/EnderDragonController.java | 14 ++++++++++++++ .../nms/v1_19_R3/util/NMSImpl.java | 3 +++ .../v1_8_R3/entity/EnderDragonController.java | 13 +++++++++++++ .../citizensnpcs/nms/v1_8_R3/util/NMSImpl.java | 3 ++- 23 files changed, 182 insertions(+), 14 deletions(-) diff --git a/main/src/main/java/net/citizensnpcs/trait/versioned/EnderDragonTrait.java b/main/src/main/java/net/citizensnpcs/trait/versioned/EnderDragonTrait.java index 3e66bd4ed..9fe414d46 100644 --- a/main/src/main/java/net/citizensnpcs/trait/versioned/EnderDragonTrait.java +++ b/main/src/main/java/net/citizensnpcs/trait/versioned/EnderDragonTrait.java @@ -17,6 +17,8 @@ import net.citizensnpcs.api.trait.TraitName; @TraitName("enderdragontrait") public class EnderDragonTrait extends Trait { + @Persist + private boolean destroyWalls; @Persist private EnderDragon.Phase phase; @@ -28,11 +30,19 @@ public class EnderDragonTrait extends Trait { return phase; } + public boolean isDestroyWalls() { + return destroyWalls; + } + @Override public void onSpawn() { updateModifiers(); } + public void setDestroyWalls(boolean destroyWalls) { + this.destroyWalls = destroyWalls; + } + public void setPhase(Phase phase) { this.phase = phase; updateModifiers(); @@ -49,7 +59,7 @@ public class EnderDragonTrait extends Trait { @Command( aliases = { "npc" }, - usage = "enderdragon --phase [phase]", + usage = "enderdragon --phase [phase] --destroywalls [true|false]", desc = "Control enderdragon modifiers", modifiers = { "enderdragon" }, min = 1, @@ -57,10 +67,14 @@ public class EnderDragonTrait extends Trait { permission = "citizens.npc.enderdragon") @Requirements(ownership = true, selected = true, types = EntityType.ENDER_DRAGON) public static void enderdragon(CommandContext args, CommandSender sender, NPC npc, - @Flag("phase") EnderDragon.Phase phase) throws CommandException { + @Flag("phase") EnderDragon.Phase phase, @Flag("destroywalls") Boolean destroyWalls) + throws CommandException { EnderDragonTrait trait = npc.getOrAddTrait(EnderDragonTrait.class); if (phase != null) { trait.setPhase(phase); } + if (destroyWalls != null) { + trait.setDestroyWalls(destroyWalls); + } } } diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EnderDragonController.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EnderDragonController.java index 72dc32199..4d1a3a405 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EnderDragonController.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_10_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_10_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_10_R1.AxisAlignedBB; @@ -194,6 +195,18 @@ public class EnderDragonController extends MobEntityController { } setPosition(locX + motX, locY + motY, locZ + motZ); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bG |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.n(); } diff --git a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java index c3e3caf9b..0c189c34f 100644 --- a/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java +++ b/v1_10_R1/src/main/java/net/citizensnpcs/nms/v1_10_R1/util/NMSImpl.java @@ -1898,6 +1898,8 @@ public class NMSImpl implements NMSBridge { private static final float DEFAULT_SPEED = 1F; private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c"); private static final Field ENDERDRAGON_BATTLE_FIELD = NMS.getField(EntityEnderDragon.class, "bK"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static Map, Integer> ENTITY_CLASS_TO_INT; private static Map, String> ENTITY_CLASS_TO_NAME; diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EnderDragonController.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EnderDragonController.java index 82105deac..69b5ac9a9 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EnderDragonController.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_11_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_11_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_11_R1.AxisAlignedBB; @@ -195,6 +196,18 @@ public class EnderDragonController extends MobEntityController { } setPosition(locX + motX, locY + motY, locZ + motZ); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bF |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.n(); } diff --git a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java index 561dddd46..347695ee7 100644 --- a/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java +++ b/v1_11_R1/src/main/java/net/citizensnpcs/nms/v1_11_R1/util/NMSImpl.java @@ -1954,11 +1954,12 @@ public class NMSImpl implements NMSBridge { private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST); - private static final Field CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getField(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c"); private static final Field ENDERDRAGON_BATTLE_FIELD = NMS.getField(EntityEnderDragon.class, "bJ"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static CustomEntityRegistry ENTITY_REGISTRY; private static final Location FROM_LOCATION = new Location(null, 0, 0, 0); diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EnderDragonController.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EnderDragonController.java index c9b187c4c..24d2aba58 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EnderDragonController.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_12_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_12_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_12_R1.AxisAlignedBB; @@ -195,6 +196,18 @@ public class EnderDragonController extends MobEntityController { } setPosition(locX + motX, locY + motY, locZ + motZ); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bG |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.n(); } diff --git a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java index 68fc809ce..ab571b5cf 100644 --- a/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java +++ b/v1_12_R1/src/main/java/net/citizensnpcs/nms/v1_12_R1/util/NMSImpl.java @@ -1958,7 +1958,6 @@ public class NMSImpl implements NMSBridge { navigation.d(); } - private static MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "bY"); private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST); @@ -1966,6 +1965,8 @@ public class NMSImpl implements NMSBridge { private static final float DEFAULT_SPEED = 1F; private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c"); private static final Field ENDERDRAGON_BATTLE_FIELD = NMS.getField(EntityEnderDragon.class, "bK"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static CustomEntityRegistry ENTITY_REGISTRY; private static final Location FROM_LOCATION = new Location(null, 0, 0, 0); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EnderDragonController.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EnderDragonController.java index 9a2ac19c2..f8503de45 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EnderDragonController.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/entity/EnderDragonController.java @@ -14,6 +14,7 @@ import net.citizensnpcs.nms.v1_13_R2.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_13_R2.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_13_R2.AxisAlignedBB; @@ -206,6 +207,18 @@ public class EnderDragonController extends MobEntityController { } setPosition(locX + motX, locY + motY, locZ + motZ); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bN |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { try { super.movementTick(); diff --git a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java index b0400f4ab..8f5c3e08b 100644 --- a/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java +++ b/v1_13_R2/src/main/java/net/citizensnpcs/nms/v1_13_R2/util/NMSImpl.java @@ -2115,6 +2115,8 @@ public class NMSImpl implements NMSBridge { private static final float DEFAULT_SPEED = 1F; private static final Field ENDERDRAGON_BATTLE_BAR_FIELD = NMS.getField(EnderDragonBattle.class, "c", false); private static final Field ENDERDRAGON_BATTLE_FIELD = NMS.getField(EntityEnderDragon.class, "bR"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static Method ENTITY_FISH_METHOD = NMS.getMethod(EntityFish.class, "t", false, boolean.class); private static Field ENTITY_FISH_NUM_IN_SCHOOL; diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EnderDragonController.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EnderDragonController.java index d25258e35..a954cc4ed 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EnderDragonController.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_14_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_14_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_14_R1.AxisAlignedBB; @@ -203,6 +204,18 @@ public class EnderDragonController extends MobEntityController { setPosition(locX + mot.getX(), locY + mot.getY(), locZ + mot.getZ()); setMot(mot); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bK |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.movementTick(); } diff --git a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java index c1f2c2a2d..9938c93b8 100644 --- a/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java +++ b/v1_14_R1/src/main/java/net/citizensnpcs/nms/v1_14_R1/util/NMSImpl.java @@ -2180,7 +2180,6 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "advancementDataPlayer"); - private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, EntityType.SHULKER, @@ -2195,6 +2194,8 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; private static final MethodHandle ENDERDRAGON_BATTLE_FIELD = NMS.getGetter(EntityEnderDragon.class, "bP"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getSetter(EntityFishSchool.class, "c", false); private static final MethodHandle ENTITY_GET_SOUND_FALL = NMS.getMethodHandle(EntityLiving.class, "getSoundFall", diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EnderDragonController.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EnderDragonController.java index 86cd7548b..427af9fca 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EnderDragonController.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/entity/EnderDragonController.java @@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_15_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_15_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_15_R1.AxisAlignedBB; @@ -197,6 +198,17 @@ public class EnderDragonController extends MobEntityController { setPosition(locX() + mot.getX(), locY() + mot.getY(), locZ() + mot.getZ()); setMot(mot); } + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bz |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.movementTick(); } diff --git a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java index 5ae809392..c1403a1f6 100644 --- a/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java +++ b/v1_15_R1/src/main/java/net/citizensnpcs/nms/v1_15_R1/util/NMSImpl.java @@ -2265,7 +2265,6 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "advancementDataPlayer"); - private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, @@ -2278,6 +2277,8 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; private static final MethodHandle ENDERDRAGON_BATTLE_FIELD = NMS.getGetter(EntityEnderDragon.class, "bN"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getSetter(EntityFishSchool.class, "c", false); private static final MethodHandle ENTITY_GET_SOUND_FALL = NMS.getMethodHandle(EntityLiving.class, "getSoundFall", diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EnderDragonController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EnderDragonController.java index a35242e19..d15431a26 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EnderDragonController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EnderDragonController.java @@ -13,6 +13,7 @@ import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_16_R3.AxisAlignedBB; @@ -197,6 +198,18 @@ public class EnderDragonController extends MobEntityController { setPosition(locX() + mot.getX(), locY() + mot.getY(), locZ() + mot.getZ()); setMot(mot); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.br |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.movementTick(); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java index 74d17aa47..d81ee53bf 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/NMSImpl.java @@ -2287,9 +2287,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENT_PLAYER_FIELD = NMS.getFinalSetter(EntityPlayer.class, "advancementDataPlayer"); - private static final MethodHandle ATTRIBUTE_MAP = NMS.getGetter(AttributeMapBase.class, "d"); - private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getGetter(AttributeProvider.class, "a"); private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeProvider.class, "a"); private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE, @@ -2306,6 +2304,8 @@ public class NMSImpl implements NMSBridge { Sound.class); private static final float DEFAULT_SPEED = 1F; private static final MethodHandle ENDERDRAGON_BATTLE_FIELD = NMS.getGetter(EntityEnderDragon.class, "bF"); + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static DataWatcherObject ENDERMAN_ANGRY = null; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getSetter(EntityFishSchool.class, "c", false); private static final MethodHandle ENTITY_GET_SOUND_FALL = NMS.getMethodHandle(EntityLiving.class, "getSoundFall", diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EnderDragonController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EnderDragonController.java index 2174ada79..57b6b1f04 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EnderDragonController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.nbt.CompoundTag; @@ -102,6 +103,18 @@ public class EnderDragonController extends MobEntityController { setPos(getX() + mot.x, getY() + mot.y, getZ() + mot.z); setDeltaMovement(mot); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.inWall |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + subEntities[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.aiStep(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java index a6b4a6719..d69b5a570 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/NMSImpl.java @@ -2275,19 +2275,14 @@ public class NMSImpl implements NMSBridge { } private static final MethodHandle ADVANCEMENTS_PLAYER_FIELD = NMS.getFinalSetter(ServerPlayer.class, "cr"); - private static final MethodHandle ATTRIBUTE_PROVIDER_MAP = NMS.getFirstGetter(AttributeSupplier.class, Map.class); - private static final MethodHandle ATTRIBUTE_PROVIDER_MAP_SETTER = NMS.getFinalSetter(AttributeSupplier.class, "a"); - private static final MethodHandle ATTRIBUTE_SUPPLIER = NMS.getFirstGetter(AttributeMap.class, AttributeSupplier.class); - private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.POLAR_BEAR, EntityType.BEE, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, EntityType.SHULKER, EntityType.PHANTOM); - private static final MethodHandle BEHAVIOR_MAP = NMS.getGetter(Brain.class, "f"); private static final MethodHandle BUKKITENTITY_FIELD_SETTER = NMS.getSetter(Entity.class, "bukkitEntity"); private static final MethodHandle CHUNKMAP_UPDATE_PLAYER_STATUS = NMS.getMethodHandle(ChunkMap.class, "a", true, @@ -2296,6 +2291,8 @@ public class NMSImpl implements NMSBridge { .newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EnderDragon.class, true, + boolean.class, AABB.class); private static EntityDataAccessor ENDERMAN_CREEPY = null; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getSetter(AbstractSchoolingFish.class, "c"); private static final MethodHandle ENTITY_GET_SOUND_FALL = NMS.getMethodHandle(LivingEntity.class, "getSoundFall", diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EnderDragonController.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EnderDragonController.java index 467cf86cb..eb045e898 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EnderDragonController.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_18_R2.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_18_R2.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.core.BlockPos; @@ -104,6 +105,18 @@ public class EnderDragonController extends MobEntityController { setPos(getX() + mot.x, getY() + mot.y, getZ() + mot.z); setDeltaMovement(mot); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.inWall |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + subEntities[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.aiStep(); } diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java index ac4be54c6..774b90b32 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/util/NMSImpl.java @@ -2335,6 +2335,8 @@ public class NMSImpl implements NMSBridge { .newHashMap(); private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getSetter(CraftBossBar.class, "handle"); private static final float DEFAULT_SPEED = 1F; + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EnderDragon.class, true, + boolean.class, AABB.class); private static EntityDataAccessor ENDERMAN_CREEPY = null; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getFirstSetter(AbstractSchoolingFish.class, int.class); diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java index 625f7ddb6..b74461b43 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_19_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_19_R3.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.core.PositionImpl; @@ -96,6 +97,7 @@ public class EnderDragonController extends MobEntityController { if (getFirstPassenger() != null) { setYRot(getFirstPassenger().getBukkitYaw() - 180); } + Vec3 mot = getDeltaMovement(); if (mot.x != 0 || mot.y != 0 || mot.z != 0) { mot = mot.multiply(0.98, 0.91, 0.98); @@ -105,6 +107,18 @@ public class EnderDragonController extends MobEntityController { setPos(getX() + mot.x, getY() + mot.y, getZ() + mot.z); setDeltaMovement(mot); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.inWall |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + subEntities[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.aiStep(); } diff --git a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java index 5757629ef..c1a82cd6f 100644 --- a/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java +++ b/v1_19_R3/src/main/java/net/citizensnpcs/nms/v1_19_R3/util/NMSImpl.java @@ -2453,6 +2453,7 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle ADVANCEMENTS_PLAYER_SETTER = NMS.getFirstFinalSetter(ServerPlayer.class, PlayerAdvancements.class); + 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); @@ -2471,6 +2472,8 @@ public class NMSImpl implements NMSBridge { private static final MethodHandle CRAFT_BOSSBAR_HANDLE_FIELD = NMS.getFirstSetter(CraftBossBar.class, ServerBossEvent.class); private static final float DEFAULT_SPEED = 1F; + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EnderDragon.class, true, + boolean.class, AABB.class); private static EntityDataAccessor ENDERMAN_CREEPY = null; private static final MethodHandle ENTITY_FISH_NUM_IN_SCHOOL = NMS.getFirstSetter(AbstractSchoolingFish.class, int.class); diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EnderDragonController.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EnderDragonController.java index e06ca5e86..490eb1957 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EnderDragonController.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/entity/EnderDragonController.java @@ -12,6 +12,7 @@ import net.citizensnpcs.nms.v1_8_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_8_R3.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; +import net.citizensnpcs.trait.versioned.EnderDragonTrait; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_8_R3.AxisAlignedBB; @@ -185,6 +186,18 @@ public class EnderDragonController extends MobEntityController { } setPosition(locX + motX, locY + motY, locZ + motZ); } + + if (npc.hasTrait(EnderDragonTrait.class) && npc.getOrAddTrait(EnderDragonTrait.class).isDestroyWalls() + && NMSImpl.ENDERDRAGON_CHECK_WALLS != null) { + for (int i = 0; i < 3; i++) { + try { + this.bx |= (boolean) NMSImpl.ENDERDRAGON_CHECK_WALLS.invoke(this, + children[i].getBoundingBox()); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } } else { super.m(); } diff --git a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java index 7bb5a4be9..b641a7493 100644 --- a/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java +++ b/v1_8_R3/src/main/java/net/citizensnpcs/nms/v1_8_R3/util/NMSImpl.java @@ -1752,8 +1752,9 @@ public class NMSImpl implements NMSBridge { private static final Set BAD_CONTROLLER_LOOK = EnumSet.of(EntityType.SILVERFISH, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST); - private static final float DEFAULT_SPEED = 1F; + public static MethodHandle ENDERDRAGON_CHECK_WALLS = NMS.getFirstMethodHandleWithReturnType(EntityEnderDragon.class, + true, boolean.class, AxisAlignedBB.class); private static Method ENTITY_ATTACK_A = NMS.getMethod(Entity.class, "a", true, EntityLiving.class, Entity.class); private static Map, Integer> ENTITY_CLASS_TO_INT; private static Map, String> ENTITY_CLASS_TO_NAME;