From eac2d33c2121b12a57d3d40d1af2246d2b39e864 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 19 Mar 2023 23:00:20 +0800 Subject: [PATCH] Backport armor stand movement to 1.16-1.17 --- .../v1_16_R3/entity/ArmorStandController.java | 14 +- .../nms/v1_16_R3/entity/CodController.java | 4 +- .../v1_16_R3/entity/DolphinController.java | 4 +- .../nms/v1_16_R3/entity/EntityHumanNPC.java | 113 ++--------- .../v1_16_R3/entity/MagmaCubeController.java | 6 +- .../v1_16_R3/entity/PhantomController.java | 4 +- .../v1_16_R3/entity/PufferFishController.java | 4 +- .../nms/v1_16_R3/entity/SalmonController.java | 4 +- .../nms/v1_16_R3/entity/SlimeController.java | 6 +- .../entity/TropicalFishController.java | 4 +- .../nms/v1_16_R3/entity/TurtleController.java | 4 +- .../nms/v1_16_R3/util/EntityJumpControl.java | 27 +++ ...rollerMove.java => EntityMoveControl.java} | 13 +- ...rNavigation.java => EntityNavigation.java} | 35 ++-- ...rPathfinder.java => EntityPathfinder.java} | 15 +- ...act.java => EntityPathfinderAbstract.java} | 11 +- ...ormal.java => EntityPathfinderNormal.java} | 82 ++++---- .../citizensnpcs/nms/v1_16_R3/util/MobAI.java | 177 ++++++++++++++++++ .../nms/v1_16_R3/util/NMSImpl.java | 87 ++++++--- .../v1_16_R3/util/PlayerControllerJump.java | 21 --- .../v1_17_R1/entity/ArmorStandController.java | 14 +- .../v1_17_R1/entity/AxolotlController.java | 4 +- .../nms/v1_17_R1/entity/CodController.java | 4 +- .../v1_17_R1/entity/DolphinController.java | 4 +- .../nms/v1_17_R1/entity/EntityHumanNPC.java | 115 ++---------- .../v1_17_R1/entity/MagmaCubeController.java | 6 +- .../v1_17_R1/entity/PhantomController.java | 4 +- .../v1_17_R1/entity/PufferFishController.java | 4 +- .../nms/v1_17_R1/entity/SalmonController.java | 4 +- .../nms/v1_17_R1/entity/SlimeController.java | 6 +- .../entity/TropicalFishController.java | 4 +- .../nms/v1_17_R1/entity/TurtleController.java | 4 +- .../nms/v1_17_R1/util/EntityJumpControl.java | 27 +++ ...oveControl.java => EntityMoveControl.java} | 11 +- ...rNavigation.java => EntityNavigation.java} | 33 ++-- ...valuator.java => EntityNodeEvaluator.java} | 46 ++--- ...Base.java => EntityNodeEvaluatorBase.java} | 11 +- ...rPathfinder.java => EntityPathfinder.java} | 14 +- .../citizensnpcs/nms/v1_17_R1/util/MobAI.java | 176 +++++++++++++++++ .../nms/v1_17_R1/util/NMSImpl.java | 91 +++++---- .../v1_17_R1/util/PlayerControllerJump.java | 21 --- .../nms/v1_18_R2/entity/EntityHumanNPC.java | 4 - 42 files changed, 764 insertions(+), 478 deletions(-) create mode 100644 v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityJumpControl.java rename v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/{PlayerControllerMove.java => EntityMoveControl.java} (88%) rename v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/{PlayerNavigation.java => EntityNavigation.java} (94%) rename v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/{PlayerPathfinder.java => EntityPathfinder.java} (93%) rename v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/{PlayerPathfinderAbstract.java => EntityPathfinderAbstract.java} (86%) rename v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/{PlayerPathfinderNormal.java => EntityPathfinderNormal.java} (92%) create mode 100644 v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/MobAI.java delete mode 100644 v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerJump.java create mode 100644 v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityJumpControl.java rename v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/{PlayerMoveControl.java => EntityMoveControl.java} (89%) rename v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/{PlayerNavigation.java => EntityNavigation.java} (94%) rename v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/{PlayerNodeEvaluator.java => EntityNodeEvaluator.java} (93%) rename v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/{PlayerNodeEvaluatorBase.java => EntityNodeEvaluatorBase.java} (88%) rename v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/{PlayerPathfinder.java => EntityPathfinder.java} (93%) create mode 100644 v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/MobAI.java delete mode 100644 v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerControllerJump.java diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/ArmorStandController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/ArmorStandController.java index 2f020d3d0..ebc06cf9f 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/ArmorStandController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/ArmorStandController.java @@ -11,6 +11,8 @@ import org.bukkit.util.Vector; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; +import net.citizensnpcs.nms.v1_16_R3.util.MobAI; +import net.citizensnpcs.nms.v1_16_R3.util.MobAI.ForwardingMobAI; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; @@ -44,7 +46,8 @@ public class ArmorStandController extends MobEntityController { } } - public static class EntityArmorStandNPC extends EntityArmorStand implements NPCHolder { + public static class EntityArmorStandNPC extends EntityArmorStand implements NPCHolder, ForwardingMobAI { + private MobAI ai; private final CitizensNPC npc; public EntityArmorStandNPC(EntityTypes types, World world) { @@ -54,6 +57,9 @@ public class ArmorStandController extends MobEntityController { public EntityArmorStandNPC(EntityTypes types, World world, NPC npc) { super(types, world); this.npc = (CitizensNPC) npc; + if (npc != null) { + ai = new BasicMobAI(this); + } } @Override @@ -92,6 +98,11 @@ public class ArmorStandController extends MobEntityController { return npc == null ? super.d(save) : false; } + @Override + public MobAI getAI() { + return ai; + } + @Override public CraftEntity getBukkitEntity() { if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { @@ -118,6 +129,7 @@ public class ArmorStandController extends MobEntityController { super.tick(); if (npc != null) { npc.update(); + ai.tickAI(); } } } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/CodController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/CodController.java index 95c115274..f3d7e173d 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/CodController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/CodController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -214,7 +214,7 @@ public class CodController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } } super.mobTick(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/DolphinController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/DolphinController.java index 3dee8e7fa..4fb5436d8 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/DolphinController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/DolphinController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -217,7 +217,7 @@ public class DolphinController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java index a28bd2094..3186af9d9 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/EntityHumanNPC.java @@ -1,11 +1,9 @@ package net.citizensnpcs.nms.v1_16_R3.entity; import java.io.IOException; -import java.lang.invoke.MethodHandle; import java.net.Socket; import java.util.List; import java.util.Map; -import java.util.function.Consumer; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -16,7 +14,6 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.mojang.authlib.GameProfile; @@ -24,7 +21,6 @@ import com.mojang.datafixers.util.Pair; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; - import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC.NPCUpdate; import net.citizensnpcs.api.trait.trait.Inventory; @@ -32,10 +28,9 @@ import net.citizensnpcs.api.util.SpigotUtil; import net.citizensnpcs.nms.v1_16_R3.network.EmptyNetHandler; import net.citizensnpcs.nms.v1_16_R3.network.EmptyNetworkManager; import net.citizensnpcs.nms.v1_16_R3.util.EmptyAdvancementDataPlayer; +import net.citizensnpcs.nms.v1_16_R3.util.MobAI; +import net.citizensnpcs.nms.v1_16_R3.util.MobAI.ForwardingMobAI; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerJump; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerNavigation; import net.citizensnpcs.nms.v1_16_R3.util.PlayerlistTracker; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -46,10 +41,6 @@ import net.citizensnpcs.trait.SkinTrait; import net.citizensnpcs.util.EmptySocket; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Util; -import net.minecraft.server.v1_16_R3.AttributeBase; -import net.minecraft.server.v1_16_R3.AttributeMapBase; -import net.minecraft.server.v1_16_R3.AttributeModifiable; -import net.minecraft.server.v1_16_R3.AttributeProvider; import net.minecraft.server.v1_16_R3.AxisAlignedBB; import net.minecraft.server.v1_16_R3.BlockPosition; import net.minecraft.server.v1_16_R3.ChatComponentText; @@ -60,28 +51,22 @@ import net.minecraft.server.v1_16_R3.EntityPlayer; import net.minecraft.server.v1_16_R3.EnumGamemode; import net.minecraft.server.v1_16_R3.EnumItemSlot; import net.minecraft.server.v1_16_R3.EnumProtocolDirection; -import net.minecraft.server.v1_16_R3.GenericAttributes; import net.minecraft.server.v1_16_R3.IBlockData; import net.minecraft.server.v1_16_R3.IChatBaseComponent; import net.minecraft.server.v1_16_R3.ItemStack; import net.minecraft.server.v1_16_R3.MinecraftServer; -import net.minecraft.server.v1_16_R3.NavigationAbstract; import net.minecraft.server.v1_16_R3.NetworkManager; import net.minecraft.server.v1_16_R3.Packet; import net.minecraft.server.v1_16_R3.PacketPlayOutEntityEquipment; -import net.minecraft.server.v1_16_R3.PathType; import net.minecraft.server.v1_16_R3.PlayerInteractManager; import net.minecraft.server.v1_16_R3.SoundEffect; import net.minecraft.server.v1_16_R3.Vec3D; import net.minecraft.server.v1_16_R3.WorldServer; -public class EntityHumanNPC extends EntityPlayer implements NPCHolder, SkinnableEntity { - private final Map bz = Maps.newEnumMap(PathType.class); - private PlayerControllerJump controllerJump; - private PlayerControllerMove controllerMove; +public class EntityHumanNPC extends EntityPlayer implements NPCHolder, SkinnableEntity, ForwardingMobAI { + private MobAI ai; private final Map equipmentCache = Maps.newEnumMap(EnumItemSlot.class); private int jumpTicks = 0; - private PlayerNavigation navigation; private final CitizensNPC npc; private final Location packetLocationCache = new Location(null, 0, 0, 0); private PlayerlistTracker playerlistTracker; @@ -92,6 +77,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable super(minecraftServer, world, gameProfile, playerInteractManager); this.npc = (CitizensNPC) npc; if (npc != null) { + ai = new BasicMobAI(this); skinTracker = new SkinPacketTracker(this); playerInteractManager.setGameMode(EnumGamemode.SURVIVAL); initialise(minecraftServer); @@ -115,14 +101,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable return super.a(entityplayer); } - public float a(PathType pathtype) { - return this.bz.containsKey(pathtype) ? this.bz.get(pathtype) : pathtype.a(); - } - - public void a(PathType pathtype, float f) { - this.bz.put(pathtype, f); - } - @Override public boolean b(float f, float f1) { if (npc == null || !npc.isFlyable()) { @@ -131,11 +109,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable return false; } - public boolean b(PathType pathtype) { - return (pathtype != PathType.DANGER_FIRE && pathtype != PathType.DANGER_CACTUS - && pathtype != PathType.DANGER_OTHER); - } - @Override public void collide(net.minecraft.server.v1_16_R3.Entity entity) { // this method is called by both the entities involved - cancelling @@ -186,8 +159,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable }, 15); // give enough time for death and smoke animation } - - @Override public void g(Vec3D vec3d) { if (npc == null || !npc.isFlyable()) { @@ -197,6 +168,11 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } } + @Override + public MobAI getAI() { + return ai; + } + @Override public CraftPlayer getBukkitEntity() { if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { @@ -205,18 +181,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable return super.getBukkitEntity(); } - public PlayerControllerJump getControllerJump() { - return controllerJump; - } - - public PlayerControllerMove getControllerMove() { - return controllerMove; - } - - public NavigationAbstract getNavigation() { - return navigation; - } - @Override public NPC getNPC() { return npc; @@ -281,30 +245,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } catch (IOException e) { // swallow } - AttributeModifiable range = getAttributeInstance(GenericAttributes.FOLLOW_RANGE); - if (range == null) { - try { - AttributeProvider provider = (AttributeProvider) ATTRIBUTE_MAP.invoke(getAttributeMap()); - Map all = Maps - .newHashMap((Map) ATTRIBUTE_PROVIDER_MAP.invoke(provider)); - all.put(GenericAttributes.FOLLOW_RANGE, - new AttributeModifiable(GenericAttributes.FOLLOW_RANGE, new Consumer() { - @Override - public void accept(AttributeModifiable att) { - throw new UnsupportedOperationException( - "Tried to change value for default attribute instance FOLLOW_RANGE"); - } - })); - ATTRIBUTE_PROVIDER_MAP_SETTER.invoke(provider, ImmutableMap.copyOf(all)); - } catch (Throwable e) { - e.printStackTrace(); - } - range = getAttributeMap().a(GenericAttributes.FOLLOW_RANGE); - } - range.setValue(Setting.DEFAULT_PATHFINDING_RANGE.asDouble()); - controllerJump = new PlayerControllerJump(this); - controllerMove = new PlayerControllerMove(this); - navigation = new PlayerNavigation(this, world); invulnerableTicks = 0; NMS.setStepHeight(getBukkitEntity(), 1); // the default (0) breaks step climbing setSkinFlags((byte) 0xFF); @@ -330,10 +270,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable : !npc.isProtected(); } - public boolean isNavigating() { - return npc.getNavigator().isNavigating(); - } - private void moveOnCurrentHeading() { if (jumping) { if (onGround && jumpTicks == 0) { @@ -375,7 +311,7 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable return; } entityBaseTick(); - boolean navigating = npc.getNavigator().isNavigating() || controllerMove.b(); + boolean navigating = npc.getNavigator().isNavigating() || ai.getMoveControl().b(); if (!navigating && getBukkitEntity() != null && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION)) @@ -387,25 +323,18 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable setMot(new Vec3D(0, 0, 0)); } if (navigating) { - if (!NMSImpl.isNavigationFinished(navigation)) { - NMSImpl.updateNavigation(navigation); + if (!NMSImpl.isNavigationFinished(ai.getNavigation())) { + NMSImpl.updateNavigation(ai.getNavigation()); } moveOnCurrentHeading(); } - updateAI(); + ai.getMoveControl().a(); + ai.getJumpControl().b(); if (npc.data().get(NPC.Metadata.COLLIDABLE, !npc.isProtected())) { collideNearby(); } } - public void setMoveDestination(double x, double y, double z, double speed) { - controllerMove.a(x, y, z, speed); - } - - public void setShouldJump() { - controllerJump.jump(); - } - @Override public void setSkinFlags(byte flags) { // set skin flag byte @@ -466,11 +395,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable */ } - public void updateAI() { - controllerMove.a(); - controllerJump.b(); - } - private void updatePackets(boolean navigating) { if (!npc.isUpdating(NPCUpdate.PACKET)) return; @@ -497,10 +421,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable NMSImpl.sendPacketsNearby(getBukkitEntity(), current, packets); } - public void updatePathfindingRange(float pathfindingRange) { - this.navigation.setRange(pathfindingRange); - } - public static class PlayerNPC extends CraftPlayer implements NPCHolder, SkinnableEntity { private final CraftServer cserver; private final CitizensNPC npc; @@ -578,9 +498,6 @@ public class EntityHumanNPC extends EntityPlayer implements NPCHolder, Skinnable } } - 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 float EPSILON = 0.003F; private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/MagmaCubeController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/MagmaCubeController.java index 0fa7f9136..de5adc3d7 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/MagmaCubeController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/MagmaCubeController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -59,7 +59,7 @@ public class MagmaCubeController extends MobEntityController { if (npc != null) { setSize(3, true); this.oldMoveController = this.moveController; - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } } @@ -205,7 +205,7 @@ public class MagmaCubeController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PhantomController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PhantomController.java index d389fe10d..612a3b84a 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PhantomController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PhantomController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -216,7 +216,7 @@ public class PhantomController extends MobEntityController { this.lookController = this.oldLookController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); this.lookController = new ControllerLook(this); } if (npc.isProtected()) { diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PufferFishController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PufferFishController.java index c030f336f..fea40510e 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PufferFishController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/PufferFishController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.trait.versioned.PufferFishTrait; @@ -218,7 +218,7 @@ public class PufferFishController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SalmonController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SalmonController.java index 64b405ece..942f957bb 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SalmonController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SalmonController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -206,7 +206,7 @@ public class SalmonController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } } super.mobTick(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SlimeController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SlimeController.java index 90f457372..864f68731 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SlimeController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/SlimeController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -59,7 +59,7 @@ public class SlimeController extends MobEntityController { if (npc != null) { setSize(3, true); this.oldMoveController = this.moveController; - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } } @@ -206,7 +206,7 @@ public class SlimeController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TropicalFishController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TropicalFishController.java index 1f2a2296e..410d37d2e 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TropicalFishController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TropicalFishController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -208,7 +208,7 @@ public class TropicalFishController extends MobEntityController { this.moveController = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); } } super.mobTick(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TurtleController.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TurtleController.java index f04f29646..468006c66 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TurtleController.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/entity/TurtleController.java @@ -11,7 +11,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_16_R3.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_16_R3.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_16_R3.util.NMSImpl; -import net.citizensnpcs.nms.v1_16_R3.util.PlayerControllerMove; +import net.citizensnpcs.nms.v1_16_R3.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -196,7 +196,7 @@ public class TurtleController extends MobEntityController { this.bi = this.oldJumpController; } if (!npc.useMinecraftAI() && this.moveController == this.oldMoveController) { - this.moveController = new PlayerControllerMove(this); + this.moveController = new EntityMoveControl(this); this.bi = new EmptyControllerJump(this); } npc.update(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityJumpControl.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityJumpControl.java new file mode 100644 index 000000000..2830550f1 --- /dev/null +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityJumpControl.java @@ -0,0 +1,27 @@ +package net.citizensnpcs.nms.v1_16_R3.util; + +import net.minecraft.server.v1_16_R3.ControllerJump; +import net.minecraft.server.v1_16_R3.EntityLiving; +import net.minecraft.server.v1_16_R3.EntitySlime; +import net.minecraft.server.v1_16_R3.EntityTypes; + +public class EntityJumpControl extends ControllerJump { + private boolean a; + private final EntityLiving b; + + public EntityJumpControl(EntityLiving entityinsentient) { + super(new EntitySlime(EntityTypes.SLIME, entityinsentient.world)); + this.b = entityinsentient; + } + + @Override + public void b() { + this.b.setJumping(this.a); + this.a = false; + } + + @Override + public void jump() { + this.a = true; + } +} diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerMove.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityMoveControl.java similarity index 88% rename from v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerMove.java rename to v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityMoveControl.java index 7c7735871..4a97fe5e8 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerMove.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityMoveControl.java @@ -2,7 +2,6 @@ package net.citizensnpcs.nms.v1_16_R3.util; import java.util.Random; -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; import net.citizensnpcs.util.NMS; import net.minecraft.server.v1_16_R3.AttributeModifiable; import net.minecraft.server.v1_16_R3.ControllerMove; @@ -13,8 +12,9 @@ import net.minecraft.server.v1_16_R3.EntityTypes; import net.minecraft.server.v1_16_R3.GenericAttributes; import net.minecraft.server.v1_16_R3.MathHelper; -public class PlayerControllerMove extends ControllerMove { +public class EntityMoveControl extends ControllerMove { protected EntityLiving a; + private final MobAI ai; protected double b; protected double c; protected double d; @@ -22,10 +22,11 @@ public class PlayerControllerMove extends ControllerMove { protected boolean f; private int h; - public PlayerControllerMove(EntityLiving entityinsentient) { + public EntityMoveControl(EntityLiving entityinsentient) { super(entityinsentient instanceof EntityInsentient ? (EntityInsentient) entityinsentient : new EntitySlime(EntityTypes.SLIME, entityinsentient.world)); this.a = entityinsentient; + this.ai = MobAI.from(entityinsentient); this.b = entityinsentient.locX(); this.c = entityinsentient.locY(); this.d = entityinsentient.locZ(); @@ -56,11 +57,7 @@ public class PlayerControllerMove extends ControllerMove { if (shouldSlimeJump() || (d2 >= NMS.getStepHeight(a.getBukkitEntity()) && (d0 * d0 + d1 * d1) < 1.0D)) { this.h = cg(); this.h /= 3; - if (this.a instanceof EntityHumanNPC) { - ((EntityHumanNPC) this.a).getControllerJump().jump(); - } else { - ((EntityInsentient) this.a).getControllerJump().jump(); - } + ai.getJumpControl().jump(); } } } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerNavigation.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityNavigation.java similarity index 94% rename from v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerNavigation.java rename to v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityNavigation.java index e6ee8a1d0..45b6b5df2 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerNavigation.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityNavigation.java @@ -8,7 +8,6 @@ import java.util.stream.Stream; import com.google.common.collect.ImmutableSet; import net.citizensnpcs.Settings.Setting; -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; import net.minecraft.server.v1_16_R3.AttributeModifiable; import net.minecraft.server.v1_16_R3.BaseBlockPosition; import net.minecraft.server.v1_16_R3.Block; @@ -17,6 +16,7 @@ import net.minecraft.server.v1_16_R3.Blocks; import net.minecraft.server.v1_16_R3.ChunkCache; import net.minecraft.server.v1_16_R3.Entity; import net.minecraft.server.v1_16_R3.EntityInsentient; +import net.minecraft.server.v1_16_R3.EntityLiving; import net.minecraft.server.v1_16_R3.EntityTypes; import net.minecraft.server.v1_16_R3.GenericAttributes; import net.minecraft.server.v1_16_R3.IBlockData; @@ -33,9 +33,8 @@ import net.minecraft.server.v1_16_R3.SystemUtils; import net.minecraft.server.v1_16_R3.Vec3D; import net.minecraft.server.v1_16_R3.World; -public class PlayerNavigation extends NavigationAbstract { - protected final EntityHumanNPC a; - protected final World b; +public class EntityNavigation extends NavigationAbstract { + protected final EntityLiving a; protected PathEntity c; protected double d; protected int e; @@ -48,26 +47,27 @@ public class PlayerNavigation extends NavigationAbstract { protected double k; protected float l = 0.5F; protected boolean m; + private final MobAI mvmt; protected long n; - protected PlayerPathfinderNormal o; + protected EntityPathfinderNormal o; private BlockPosition p; private boolean pp; private int q; private float r = 1.0F; - private final PlayerPathfinder s; + private final EntityPathfinder s; private boolean t; - public PlayerNavigation(EntityHumanNPC entityinsentient, World world) { + public EntityNavigation(EntityLiving entityinsentient, World world) { super(getDummyInsentient(entityinsentient, world), world); this.g = Vec3D.ORIGIN; this.l = 0.5F; this.r = 1.0F; + this.mvmt = MobAI.from(entityinsentient); this.a = entityinsentient; - this.b = world; this.followRange = entityinsentient.getAttributeInstance(GenericAttributes.FOLLOW_RANGE); - this.o = new PlayerPathfinderNormal(); + this.o = new EntityPathfinderNormal(); this.o.a(true); - this.s = new PlayerPathfinder(this.o, Setting.MAXIMUM_VISITED_NODES.asInt()); + this.s = new EntityPathfinder(this.o, Setting.MAXIMUM_VISITED_NODES.asInt()); this.setRange(24); // this.b.C().a(this); } @@ -154,7 +154,7 @@ public class PlayerNavigation extends NavigationAbstract { if (!a(var19)) return false; var19 = this.o.a(this.b, var13, var1, var14, this.a, var3, var4, var5, true, true); - float var20 = this.a.a(var19); + float var20 = mvmt.getPathfindingMalus(var19); if (var20 < 0.0F || var20 >= 8.0F) return false; if (var19 == PathType.DAMAGE_FIRE || var19 == PathType.DANGER_FIRE @@ -332,6 +332,11 @@ public class PlayerNavigation extends NavigationAbstract { return true; } + public boolean b(PathType pathtype) { + return (pathtype != PathType.DANGER_FIRE && pathtype != PathType.DANGER_CACTUS + && pathtype != PathType.DANGER_OTHER); + } + private boolean b(Vec3D var0) { if (this.c.f() + 1 >= this.c.e()) return false; @@ -364,8 +369,8 @@ public class PlayerNavigation extends NavigationAbstract { return; Vec3D var0 = this.c.a(this.a); BlockPosition var1 = new BlockPosition(var0); - this.a.getControllerMove().a(var0.x, - this.b.getType(var1.down()).isAir() ? var0.y : PathfinderNormal.a(this.b, var1), var0.z, this.d); + mvmt.getMoveControl().a(var0.x, this.b.getType(var1.down()).isAir() ? var0.y : PathfinderNormal.a(this.b, var1), + var0.z, this.d); } public void c(boolean var0) { @@ -450,7 +455,7 @@ public class PlayerNavigation extends NavigationAbstract { boolean b2 = Math.abs(this.a.locX() - (var1.getX() + 0.5D)) < this.l && Math.abs(this.a.locZ() - (var1.getZ() + 0.5D)) < this.l && Math.abs(this.a.locY() - var1.getY()) < 1.0D; // old-style calc - if (var8 || b2 || (this.a.b((this.c.h()).l) && b(var0))) + if (var8 || b2 || (b((this.c.h()).l) && b(var0))) this.c.a(); a(var0); } @@ -528,7 +533,7 @@ public class PlayerNavigation extends NavigationAbstract { return var0; } - private static EntityInsentient getDummyInsentient(EntityHumanNPC from, World world) { + private static EntityInsentient getDummyInsentient(EntityLiving from, World world) { return new EntityInsentient(EntityTypes.VILLAGER, world) { }; } diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinder.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinder.java similarity index 93% rename from v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinder.java rename to v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinder.java index da395f5eb..6f62dc354 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinder.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinder.java @@ -14,29 +14,30 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.citizensnpcs.Settings.Setting; -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; import net.minecraft.server.v1_16_R3.BlockPosition; import net.minecraft.server.v1_16_R3.ChunkCache; import net.minecraft.server.v1_16_R3.EntityInsentient; +import net.minecraft.server.v1_16_R3.EntityLiving; import net.minecraft.server.v1_16_R3.Path; import net.minecraft.server.v1_16_R3.PathDestination; import net.minecraft.server.v1_16_R3.PathEntity; import net.minecraft.server.v1_16_R3.PathPoint; import net.minecraft.server.v1_16_R3.Pathfinder; -public class PlayerPathfinder extends Pathfinder { +public class EntityPathfinder extends Pathfinder { private final PathPoint[] a = new PathPoint[32]; private final int b; - private final PlayerPathfinderNormal c; + private final EntityPathfinderNormal c; private final Path d = new Path(); - public PlayerPathfinder(PlayerPathfinderNormal var0, int var1) { + public EntityPathfinder(EntityPathfinderNormal var0, int var1) { super(var0, var1); this.c = var0; this.b = var1; } - public PathEntity a(ChunkCache var0, EntityHumanNPC var1, Set var2, float var3, int var4, + @Override + public PathEntity a(ChunkCache var0, EntityInsentient var1, Set var2, float var3, int var4, float var5) { this.d.a(); this.c.a(var0, var1); @@ -49,9 +50,7 @@ public class PlayerPathfinder extends Pathfinder { return var8; } - @Override - public PathEntity a(ChunkCache var0, EntityInsentient var1, Set var2, float var3, int var4, - float var5) { + public PathEntity a(ChunkCache var0, EntityLiving var1, Set var2, float var3, int var4, float var5) { this.d.a(); this.c.a(var0, var1); PathPoint var6 = this.c.b(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderAbstract.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderAbstract.java similarity index 86% rename from v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderAbstract.java rename to v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderAbstract.java index d34451ff8..36ec028d9 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderAbstract.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderAbstract.java @@ -3,16 +3,16 @@ package net.citizensnpcs.nms.v1_16_R3.util; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; import net.minecraft.server.v1_16_R3.BlockPosition; import net.minecraft.server.v1_16_R3.ChunkCache; +import net.minecraft.server.v1_16_R3.EntityLiving; import net.minecraft.server.v1_16_R3.MathHelper; import net.minecraft.server.v1_16_R3.PathPoint; import net.minecraft.server.v1_16_R3.PathfinderAbstract; -public abstract class PlayerPathfinderAbstract extends PathfinderAbstract { +public abstract class EntityPathfinderAbstract extends PathfinderAbstract { protected ChunkCache a; - protected EntityHumanNPC b; + protected EntityLiving b; protected final Int2ObjectMap c = new Int2ObjectOpenHashMap(); protected int d; protected int e; @@ -20,11 +20,13 @@ public abstract class PlayerPathfinderAbstract extends PathfinderAbstract { protected boolean g; protected boolean h; protected boolean i; + protected MobAI mvmt; @Override public void a() { this.a = null; this.b = null; + mvmt = null; } @Override @@ -37,7 +39,8 @@ public abstract class PlayerPathfinderAbstract extends PathfinderAbstract { this.g = var0; } - public void a(ChunkCache var0, EntityHumanNPC var1) { + public void a(ChunkCache var0, EntityLiving var1) { + this.mvmt = MobAI.from(var1); this.a = var0; this.b = var1; this.c.clear(); diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderNormal.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderNormal.java similarity index 92% rename from v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderNormal.java rename to v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderNormal.java index 4e3d8ebd3..4a64a9c86 100644 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerPathfinderNormal.java +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/EntityPathfinderNormal.java @@ -7,7 +7,6 @@ import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.longs.Long2ObjectOpenHa import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.Object2BooleanMap; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; import net.minecraft.server.v1_16_R3.AxisAlignedBB; import net.minecraft.server.v1_16_R3.Block; import net.minecraft.server.v1_16_R3.BlockCampfire; @@ -19,6 +18,7 @@ import net.minecraft.server.v1_16_R3.BlockPosition; import net.minecraft.server.v1_16_R3.Blocks; import net.minecraft.server.v1_16_R3.ChunkCache; import net.minecraft.server.v1_16_R3.EntityInsentient; +import net.minecraft.server.v1_16_R3.EntityLiving; import net.minecraft.server.v1_16_R3.EnumDirection; import net.minecraft.server.v1_16_R3.Fluid; import net.minecraft.server.v1_16_R3.FluidTypes; @@ -35,14 +35,14 @@ import net.minecraft.server.v1_16_R3.TagsFluid; import net.minecraft.server.v1_16_R3.Vec3D; import net.minecraft.server.v1_16_R3.VoxelShape; -public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { +public class EntityPathfinderNormal extends EntityPathfinderAbstract { protected float j; private final Long2ObjectMap k = new Long2ObjectOpenHashMap(); private final Object2BooleanMap l = new Object2BooleanOpenHashMap(); @Override public void a() { - this.b.a(PathType.WATER, this.j); + this.mvmt.setPathfindingMalus(PathType.WATER, this.j); this.k.clear(); this.l.clear(); super.a(); @@ -53,15 +53,15 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { } @Override - public void a(ChunkCache var0, EntityHumanNPC var1) { + public void a(ChunkCache var0, EntityInsentient var1) { super.a(var0, var1); this.j = var1.a(PathType.WATER); } @Override - public void a(ChunkCache var0, EntityInsentient var1) { + public void a(ChunkCache var0, EntityLiving var1) { super.a(var0, var1); - this.j = var1.a(PathType.WATER); + this.j = mvmt.getPathfindingMalus(PathType.WATER); } @Override @@ -69,11 +69,11 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { return new PathDestination(a(MathHelper.floor(var0), MathHelper.floor(var2), MathHelper.floor(var4))); } - private PathType a(EntityHumanNPC var0, BlockPosition var1) { + private PathType a(EntityLiving var0, BlockPosition var1) { return a(var0, var1.getX(), var1.getY(), var1.getZ()); } - private PathType a(EntityHumanNPC var0, int var1, int var2, int var3) { + private PathType a(EntityLiving var0, int var1, int var2, int var3) { return this.k.computeIfAbsent(BlockPosition.a(var1, var2, var3), (var4) -> { return this.a(this.a, var1, var2, var3, var0, this.d, this.e, this.f, this.d(), this.c()); }); @@ -97,28 +97,6 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { return a(var0, new BlockPosition.MutableBlockPosition(var1, var2, var3)); } - public PathType a(IBlockAccess var0, int var1, int var2, int var3, EntityHumanNPC var4, int var5, int var6, - int var7, boolean var8, boolean var9) { - EnumSet var10 = EnumSet.noneOf(PathType.class); - PathType var11 = PathType.BLOCKED; - BlockPosition var12 = var4.getChunkCoordinates(); - var11 = a(var0, var1, var2, var3, var5, var6, var7, var8, var9, var10, var11, var12); - if (var10.contains(PathType.FENCE)) - return PathType.FENCE; - if (var10.contains(PathType.UNPASSABLE_RAIL)) - return PathType.UNPASSABLE_RAIL; - PathType var13 = PathType.BLOCKED; - for (PathType var15 : var10) { - if (var4.a(var15) < 0.0F) - return var15; - if (var4.a(var15) >= var4.a(var13)) - var13 = var15; - } - if (var11 == PathType.OPEN && var4.a(var13) == 0.0F && var5 <= 1) - return PathType.OPEN; - return var13; - } - @Override public PathType a(IBlockAccess var0, int var1, int var2, int var3, EntityInsentient var4, int var5, int var6, int var7, boolean var8, boolean var9) { @@ -132,12 +110,34 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { return PathType.UNPASSABLE_RAIL; PathType var13 = PathType.BLOCKED; for (PathType var15 : var10) { - if (var4.a(var15) < 0.0F) + if (mvmt.getPathfindingMalus(var15) < 0.0F) return var15; - if (var4.a(var15) >= var4.a(var13)) + if (mvmt.getPathfindingMalus(var15) >= mvmt.getPathfindingMalus(var13)) var13 = var15; } - if (var11 == PathType.OPEN && var4.a(var13) == 0.0F && var5 <= 1) + if (var11 == PathType.OPEN && mvmt.getPathfindingMalus(var13) == 0.0F && var5 <= 1) + return PathType.OPEN; + return var13; + } + + public PathType a(IBlockAccess var0, int var1, int var2, int var3, EntityLiving var4, int var5, int var6, int var7, + boolean var8, boolean var9) { + EnumSet var10 = EnumSet.noneOf(PathType.class); + PathType var11 = PathType.BLOCKED; + BlockPosition var12 = var4.getChunkCoordinates(); + var11 = a(var0, var1, var2, var3, var5, var6, var7, var8, var9, var10, var11, var12); + if (var10.contains(PathType.FENCE)) + return PathType.FENCE; + if (var10.contains(PathType.UNPASSABLE_RAIL)) + return PathType.UNPASSABLE_RAIL; + PathType var13 = PathType.BLOCKED; + for (PathType var15 : var10) { + if (mvmt.getPathfindingMalus(var15) < 0.0F) + return var15; + if (mvmt.getPathfindingMalus(var15) >= mvmt.getPathfindingMalus(var13)) + var13 = var15; + } + if (var11 == PathType.OPEN && mvmt.getPathfindingMalus(var13) == 0.0F && var5 <= 1) return PathType.OPEN; return var13; } @@ -168,7 +168,7 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { if (var10 - var4 > 1.125D) return null; PathType var12 = a(this.b, var0, var1, var2); - float var13 = this.b.a(var12); + float var13 = this.mvmt.getPathfindingMalus(var12); double var14 = this.b.getWidth() / 2.0D; if (var13 >= 0.0F) { var8 = a(var0, var1, var2); @@ -201,7 +201,7 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { if (var12 == PathType.WATER) { var8 = a(var0, var1, var2); var8.l = var12; - var8.k = Math.max(var8.k, this.b.a(var12)); + var8.k = Math.max(var8.k, mvmt.getPathfindingMalus(var12)); continue; } return var8; @@ -225,7 +225,7 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { return var18; } var12 = a(this.b, var0, var1, var2); - var13 = this.b.a(var12); + var13 = mvmt.getPathfindingMalus(var12); if (var12 != PathType.OPEN && var13 >= 0.0F) { var8 = a(var0, var1, var2); var8.l = var12; @@ -284,7 +284,7 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { int var3 = 0; PathType var4 = a(this.b, var1.a, var1.b + 1, var1.c); PathType var5 = a(this.b, var1.a, var1.b, var1.c); - if (this.b.a(var4) >= 0.0F && var5 != PathType.STICKY_HONEY) + if (mvmt.getPathfindingMalus(var4) >= 0.0F && var5 != PathType.STICKY_HONEY) var3 = MathHelper.d(Math.max(1.0F, this.b.G)); double var6 = aa(this.a, new BlockPosition(var1.a, var1.b, var1.c)); PathPoint var8 = a(var1.a, var1.b, var1.c + 1, var3, var6, EnumDirection.SOUTH, var5); @@ -343,7 +343,7 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { } BlockPosition var3 = this.b.getChunkCoordinates(); PathType var4 = a(this.b, var3.getX(), var0, var3.getZ()); - if (this.b.a(var4) < 0.0F) { + if (mvmt.getPathfindingMalus(var4) < 0.0F) { AxisAlignedBB axisAlignedBB = this.b.getBoundingBox(); if (b(var1.c(axisAlignedBB.minX, var0, axisAlignedBB.minZ)) || b(var1.c(axisAlignedBB.minX, var0, axisAlignedBB.maxZ)) @@ -351,19 +351,19 @@ public class PlayerPathfinderNormal extends PlayerPathfinderAbstract { || b(var1.c(axisAlignedBB.maxX, var0, axisAlignedBB.maxZ))) { PathPoint var6 = a(var1); var6.l = a(this.b, var6.a()); - var6.k = this.b.a(var6.l); + var6.k = mvmt.getPathfindingMalus(var6.l); return var6; } } PathPoint var5 = a(var3.getX(), var0, var3.getZ()); var5.l = a(this.b, var5.a()); - var5.k = this.b.a(var5.l); + var5.k = mvmt.getPathfindingMalus(var5.l); return var5; } private boolean b(BlockPosition var0) { PathType var1 = a(this.b, var0); - return (this.b.a(var1) >= 0.0F); + return (mvmt.getPathfindingMalus(var1) >= 0.0F); } public static PathType a(IBlockAccess var0, BlockPosition.MutableBlockPosition var1) { diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/MobAI.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/MobAI.java new file mode 100644 index 000000000..03903a91f --- /dev/null +++ b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/MobAI.java @@ -0,0 +1,177 @@ +package net.citizensnpcs.nms.v1_16_R3.util; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.citizensnpcs.Settings.Setting; +import net.minecraft.server.v1_16_R3.ControllerJump; +import net.minecraft.server.v1_16_R3.ControllerMove; +import net.minecraft.server.v1_16_R3.Entity; +import net.minecraft.server.v1_16_R3.EntityInsentient; +import net.minecraft.server.v1_16_R3.EntityLiving; +import net.minecraft.server.v1_16_R3.GenericAttributes; +import net.minecraft.server.v1_16_R3.NavigationAbstract; +import net.minecraft.server.v1_16_R3.PathType; + +public interface MobAI { + org.bukkit.entity.Entity getBukkitEntity(); + + ControllerJump getJumpControl(); + + Map getMalus(); + + ControllerMove getMoveControl(); + + NavigationAbstract getNavigation(); + + default float getPathfindingMalus(PathType var1) { + Map malus = getMalus(); + return malus.containsKey(var1) ? malus.get(var1) : var1.a(); + } + + default void setPathfindingMalus(PathType water, float oldWaterCost) { + getMalus().put(water, oldWaterCost); + } + + default void tickAI() { + getJumpControl().b(); + getMoveControl().a(); + NavigationAbstract navigation = getNavigation(); + if (!NMSImpl.isNavigationFinished(navigation)) { + NMSImpl.updateNavigation(navigation); + } + } + + default void updatePathfindingRange(float range) { + ((EntityLiving) NMSImpl.getHandle(getBukkitEntity())).getAttributeInstance(GenericAttributes.FOLLOW_RANGE) + .setValue(range); + } + + public static class BasicMobAI implements MobAI { + private final EntityJumpControl controllerJump; + private final EntityMoveControl controllerMove; + private final EntityLiving entity; + private final Map malus; + private final EntityNavigation navigation; + + public BasicMobAI(EntityLiving entity) { + this.entity = entity; + NMSImpl.setAttribute(entity, GenericAttributes.FOLLOW_RANGE, Setting.DEFAULT_PATHFINDING_RANGE.asDouble()); + entity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.3D); + controllerJump = new EntityJumpControl(entity); + controllerMove = new EntityMoveControl(entity); + navigation = new EntityNavigation(entity, entity.world); + malus = Maps.newEnumMap(PathType.class); + } + + @Override + public org.bukkit.entity.Entity getBukkitEntity() { + return entity.getBukkitEntity(); + } + + @Override + public ControllerJump getJumpControl() { + return controllerJump; + } + + @Override + public Map getMalus() { + return malus; + } + + @Override + public ControllerMove getMoveControl() { + return controllerMove; + } + + @Override + public NavigationAbstract getNavigation() { + return navigation; + } + + } + + public static interface ForwardingMobAI extends MobAI { + MobAI getAI(); + + @Override + default org.bukkit.entity.Entity getBukkitEntity() { + return getAI().getBukkitEntity(); + } + + @Override + default ControllerJump getJumpControl() { + return getAI().getJumpControl(); + } + + @Override + default Map getMalus() { + return getAI().getMalus(); + } + + @Override + default ControllerMove getMoveControl() { + return getAI().getMoveControl(); + } + + @Override + default NavigationAbstract getNavigation() { + return getAI().getNavigation(); + } + } + + public static MobAI from(Entity handle) { + if (handle instanceof EntityInsentient) { + EntityInsentient mob = (EntityInsentient) handle; + return new MobAI() { + @Override + public org.bukkit.entity.Entity getBukkitEntity() { + return mob.getBukkitEntity(); + } + + @Override + public ControllerJump getJumpControl() { + return mob.getControllerJump(); + } + + @Override + public Map getMalus() { + return null; + } + + @Override + public ControllerMove getMoveControl() { + return mob.getControllerMove(); + } + + @Override + public NavigationAbstract getNavigation() { + return mob.getNavigation(); + } + + @Override + public float getPathfindingMalus(PathType var1) { + return mob.a(var1); + } + + @Override + public void setPathfindingMalus(PathType water, float oldWaterCost) { + mob.a(water, oldWaterCost); + } + + @Override + public void tickAI() { + mob.getEntitySenses().a(); + NMSImpl.updateNavigation(mob.getNavigation()); + mob.getControllerMove().a(); + mob.getControllerLook().a(); + mob.getControllerJump().b(); + } + }; + } else if (handle instanceof MobAI) { + return (MobAI) handle; + } + return null; + } +} 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 2c7ef39cf..78d6aca71 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 @@ -57,6 +57,7 @@ import org.bukkit.util.Vector; import com.google.common.base.Function; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -238,7 +239,10 @@ import net.citizensnpcs.util.NMSBridge; import net.citizensnpcs.util.PlayerAnimation; import net.citizensnpcs.util.Util; import net.minecraft.server.v1_16_R3.AdvancementDataPlayer; +import net.minecraft.server.v1_16_R3.AttributeBase; +import net.minecraft.server.v1_16_R3.AttributeMapBase; import net.minecraft.server.v1_16_R3.AttributeModifiable; +import net.minecraft.server.v1_16_R3.AttributeProvider; import net.minecraft.server.v1_16_R3.AxisAlignedBB; import net.minecraft.server.v1_16_R3.BehaviorController; import net.minecraft.server.v1_16_R3.Block; @@ -414,14 +418,15 @@ public class NMSImpl implements NMSBridge { @Override public void cancelMoveDestination(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); - if (handle instanceof EntityInsentient) { + MobAI ai = MobAI.from(handle); + if (ai.getMoveControl() instanceof EntityMoveControl) { + ((EntityMoveControl) ai.getMoveControl()).f = false; + } else { try { - MOVE_CONTROLLER_MOVING.invoke(((EntityInsentient) handle).getControllerMove(), null); + MOVE_CONTROLLER_MOVING.invoke(ai.getMoveControl(), null); } catch (Throwable t) { t.printStackTrace(); } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getControllerMove().f = false; } } @@ -548,7 +553,7 @@ public class NMSImpl implements NMSBridge { public Location getDestination(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); ControllerMove controller = handle instanceof EntityInsentient ? ((EntityInsentient) handle).getControllerMove() - : handle instanceof EntityHumanNPC ? ((EntityHumanNPC) handle).getControllerMove() : null; + : handle instanceof MobAI ? ((MobAI) handle).getMoveControl() : null; if (controller == null || !controller.b()) { return null; } @@ -709,11 +714,11 @@ public class NMSImpl implements NMSBridge { // navigation won't execute, and calling entity.move doesn't // entirely fix the problem. final NavigationAbstract navigation = NMSImpl.getNavigation(entity); - final float oldWater = raw instanceof EntityPlayer ? ((EntityHumanNPC) raw).a(PathType.WATER) + final float oldWater = raw instanceof EntityPlayer ? ((MobAI) raw).getPathfindingMalus(PathType.WATER) : ((EntityInsentient) raw).a(PathType.WATER); if (params.avoidWater() && oldWater >= 0) { - if (raw instanceof EntityPlayer) { - ((EntityHumanNPC) raw).a(PathType.WATER, oldWater + 1F); + if (raw instanceof MobAI) { + ((MobAI) raw).setPathfindingMalus(PathType.WATER, oldWater + 1F); } else { ((EntityInsentient) raw).a(PathType.WATER, oldWater + 1F); } @@ -750,8 +755,8 @@ public class NMSImpl implements NMSBridge { Util.sendBlockChanges(blocks, null); } if (oldWater >= 0) { - if (raw instanceof EntityPlayer) { - ((EntityHumanNPC) raw).a(PathType.WATER, oldWater); + if (raw instanceof MobAI) { + ((MobAI) raw).setPathfindingMalus(PathType.WATER, oldWater); } else { ((EntityInsentient) raw).a(PathType.WATER, oldWater); } @@ -993,7 +998,7 @@ public class NMSImpl implements NMSBridge { public void look(org.bukkit.entity.Entity entity, Location to, boolean headOnly, boolean immediate) { Entity handle = NMSImpl.getHandle(entity); if (immediate || headOnly || BAD_CONTROLLER_LOOK.contains(handle.getBukkitEntity().getType()) - || (!(handle instanceof EntityInsentient) && !(handle instanceof EntityHumanNPC))) { + || (!(handle instanceof EntityInsentient) && !(handle instanceof MobAI))) { Location fromLocation = entity.getLocation(FROM_LOCATION); double xDiff, yDiff, zDiff; xDiff = to.getX() - fromLocation.getX(); @@ -1027,8 +1032,8 @@ public class NMSImpl implements NMSBridge { while (((EntityLiving) handle).aC < -180F) { ((EntityLiving) handle).aC += 360F; } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); + } else if (handle instanceof NPCHolder) { + ((NPCHolder) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); } } @@ -1036,7 +1041,7 @@ public class NMSImpl implements NMSBridge { public void look(org.bukkit.entity.Entity from, org.bukkit.entity.Entity to) { Entity handle = NMSImpl.getHandle(from), target = NMSImpl.getHandle(to); if (BAD_CONTROLLER_LOOK.contains(handle.getBukkitEntity().getType()) - || (!(handle instanceof EntityInsentient) && !(handle instanceof EntityHumanNPC))) { + || (!(handle instanceof EntityInsentient) && !(handle instanceof MobAI))) { if (to instanceof LivingEntity) { look(from, ((LivingEntity) to).getEyeLocation(), false, true); } else { @@ -1051,8 +1056,8 @@ public class NMSImpl implements NMSBridge { while (((EntityLiving) handle).aC < -180F) { ((EntityLiving) handle).aC += 360F; } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); + } else if (handle instanceof NPCHolder) { + ((NPCHolder) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); } } @@ -1304,8 +1309,8 @@ public class NMSImpl implements NMSBridge { return; if (handle instanceof EntityInsentient) { ((EntityInsentient) handle).getControllerMove().a(x, y, z, speed); - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).setMoveDestination(x, y, z, speed); + } else if (handle instanceof MobAI) { + ((MobAI) handle).getMoveControl().a(x, y, z, speed); } } @@ -1431,8 +1436,8 @@ public class NMSImpl implements NMSBridge { if (handle instanceof EntityInsentient) { ControllerJump controller = ((EntityInsentient) handle).getControllerJump(); controller.jump(); - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).setShouldJump(); + } else if (handle instanceof MobAI) { + ((MobAI) handle).getJumpControl().jump(); } } @@ -1642,10 +1647,8 @@ public class NMSImpl implements NMSBridge { if (!npc.isSpawned() || !npc.getEntity().getType().isAlive()) return; EntityLiving en = NMSImpl.getHandle((LivingEntity) npc.getEntity()); - if (!(en instanceof EntityInsentient)) { - if (en instanceof EntityHumanNPC) { - ((EntityHumanNPC) en).updatePathfindingRange(pathfindingRange); - } + if (en instanceof MobAI) { + ((MobAI) en).updatePathfindingRange(pathfindingRange); return; } if (NAVIGATION_S == null) @@ -2005,7 +2008,7 @@ public class NMSImpl implements NMSBridge { public static NavigationAbstract getNavigation(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); return handle instanceof EntityInsentient ? ((EntityInsentient) handle).getNavigation() - : handle instanceof EntityHumanNPC ? ((EntityHumanNPC) handle).getNavigation() : null; + : handle instanceof MobAI ? ((MobAI) handle).getNavigation() : null; } public static DataWatcherObject getRabbitTypeField() { @@ -2153,6 +2156,30 @@ public class NMSImpl implements NMSBridge { } } + public static void setAttribute(EntityLiving entity, AttributeBase attribute, double value) { + AttributeModifiable range = entity.getAttributeInstance(attribute); + if (range == null) { + try { + AttributeProvider provider = (AttributeProvider) ATTRIBUTE_MAP.invoke(entity.getAttributeMap()); + Map all = Maps + .newHashMap((Map) ATTRIBUTE_PROVIDER_MAP.invoke(provider)); + all.put(GenericAttributes.FOLLOW_RANGE, + new AttributeModifiable(GenericAttributes.FOLLOW_RANGE, new Consumer() { + @Override + public void accept(AttributeModifiable att) { + throw new UnsupportedOperationException( + "Tried to change value for default attribute instance FOLLOW_RANGE"); + } + })); + ATTRIBUTE_PROVIDER_MAP_SETTER.invoke(provider, ImmutableMap.copyOf(all)); + } catch (Throwable e) { + e.printStackTrace(); + } + range = entity.getAttributeMap().a(attribute); + } + range.setValue(value); + } + public static void setBukkitEntity(Entity entity, CraftEntity bukkitEntity) { try { BUKKITENTITY_FIELD_SETTER.invoke(entity, bukkitEntity); @@ -2218,8 +2245,8 @@ public class NMSImpl implements NMSBridge { handle.getControllerMove().a(); handle.getControllerLook().a(); handle.getControllerJump().b(); - } else if (entity instanceof EntityHumanNPC) { - ((EntityHumanNPC) entity).updateAI(); + } else if (entity instanceof MobAI) { + ((MobAI) entity).tickAI(); } } @@ -2249,6 +2276,12 @@ 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, EntityType.SILVERFISH, EntityType.SHULKER, EntityType.ENDERMITE, EntityType.ENDER_DRAGON, EntityType.BAT, EntityType.SLIME, EntityType.DOLPHIN, EntityType.MAGMA_CUBE, EntityType.HORSE, EntityType.GHAST, diff --git a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerJump.java b/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerJump.java deleted file mode 100644 index a2402193e..000000000 --- a/v1_16_R3/src/main/java/net/citizensnpcs/nms/v1_16_R3/util/PlayerControllerJump.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.citizensnpcs.nms.v1_16_R3.util; - -import net.citizensnpcs.nms.v1_16_R3.entity.EntityHumanNPC; - -public class PlayerControllerJump { - private boolean a; - private final EntityHumanNPC b; - - public PlayerControllerJump(EntityHumanNPC entityinsentient) { - this.b = entityinsentient; - } - - public void b() { - this.b.setJumping(this.a); - this.a = false; - } - - public void jump() { - this.a = true; - } -} diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/ArmorStandController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/ArmorStandController.java index a96927dc8..9dc8a94c4 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/ArmorStandController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/ArmorStandController.java @@ -9,6 +9,8 @@ import org.bukkit.util.Vector; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; +import net.citizensnpcs.nms.v1_17_R1.util.MobAI; +import net.citizensnpcs.nms.v1_17_R1.util.MobAI.ForwardingMobAI; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; import net.citizensnpcs.npc.CitizensNPC; @@ -43,7 +45,8 @@ public class ArmorStandController extends MobEntityController { } } - public static class EntityArmorStandNPC extends ArmorStand implements NPCHolder { + public static class EntityArmorStandNPC extends ArmorStand implements NPCHolder, ForwardingMobAI { + private MobAI ai; private final CitizensNPC npc; public EntityArmorStandNPC(EntityType types, Level level) { @@ -53,6 +56,14 @@ public class ArmorStandController extends MobEntityController { public EntityArmorStandNPC(EntityType types, Level level, NPC npc) { super(types, level); this.npc = (CitizensNPC) npc; + if (ai != null) { + ai = new BasicMobAI(this); + } + } + + @Override + public MobAI getAI() { + return ai; } @Override @@ -118,6 +129,7 @@ public class ArmorStandController extends MobEntityController { super.tick(); if (npc != null) { npc.update(); + ai.tickAI(); } } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/AxolotlController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/AxolotlController.java index fb9566e67..c707cb14e 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/AxolotlController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/AxolotlController.java @@ -12,7 +12,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -223,7 +223,7 @@ public class AxolotlController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/CodController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/CodController.java index bf31d3bec..282b580fc 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/CodController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/CodController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -124,7 +124,7 @@ public class CodController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } } super.customServerAiStep(); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/DolphinController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/DolphinController.java index 9b6306dfb..6fe0e0dde 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/DolphinController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/DolphinController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -206,7 +206,7 @@ public class DolphinController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java index 01a03249c..c7da868ad 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/EntityHumanNPC.java @@ -5,7 +5,6 @@ import java.lang.invoke.MethodHandle; import java.net.Socket; import java.util.List; import java.util.Map; -import java.util.function.Consumer; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -16,7 +15,6 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.util.Vector; -import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.mojang.authlib.GameProfile; @@ -24,7 +22,6 @@ import com.mojang.datafixers.util.Pair; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; - import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPC.NPCUpdate; import net.citizensnpcs.api.trait.trait.Inventory; @@ -33,10 +30,9 @@ import net.citizensnpcs.nms.v1_17_R1.network.EmptyNetHandler; import net.citizensnpcs.nms.v1_17_R1.network.EmptyNetworkManager; import net.citizensnpcs.nms.v1_17_R1.util.EmptyAdvancementDataPlayer; import net.citizensnpcs.nms.v1_17_R1.util.EmptyServerStatsCounter; +import net.citizensnpcs.nms.v1_17_R1.util.MobAI; +import net.citizensnpcs.nms.v1_17_R1.util.MobAI.ForwardingMobAI; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerControllerJump; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerNavigation; import net.citizensnpcs.nms.v1_17_R1.util.PlayerlistTracker; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; @@ -62,26 +58,16 @@ import net.minecraft.stats.ServerStatsCounter; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attribute; -import net.minecraft.world.entity.ai.attributes.AttributeInstance; -import net.minecraft.world.entity.ai.attributes.AttributeMap; -import net.minecraft.world.entity.ai.attributes.AttributeSupplier; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.ai.navigation.PathNavigation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.pathfinder.BlockPathTypes; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -public class EntityHumanNPC extends ServerPlayer implements NPCHolder, SkinnableEntity { - private PlayerControllerJump controllerJump; - private PlayerMoveControl controllerMove; +public class EntityHumanNPC extends ServerPlayer implements NPCHolder, SkinnableEntity, ForwardingMobAI { + private MobAI ai; private final Map equipmentCache = Maps.newEnumMap(EquipmentSlot.class); private int jumpTicks = 0; - private final Map malus = Maps.newEnumMap(BlockPathTypes.class); - private PlayerNavigation navigation; private final CitizensNPC npc; private final Location packetLocationCache = new Location(null, 0, 0, 0); private PlayerlistTracker playerlistTracker; @@ -93,6 +79,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable this.npc = (CitizensNPC) npc; if (npc != null) { skinTracker = new SkinPacketTracker(this); + ai = new BasicMobAI(this); try { GAMEMODE_SETTING.invoke(gameMode, GameType.SURVIVAL, null); } catch (Throwable e) { @@ -112,11 +99,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return super.broadcastToPlayer(entityplayer); } - public boolean canCutCorner(BlockPathTypes pathtype) { - return (pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_CACTUS - && pathtype != BlockPathTypes.DANGER_OTHER && pathtype != BlockPathTypes.WALKABLE_DOOR); - } - @Override public boolean causeFallDamage(float f, float f1, DamageSource damagesource) { if (npc == null || !npc.isFlyable()) { @@ -149,8 +131,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable }, 15); // give enough time for death and smoke animation } - - @Override public void doTick() { if (npc == null) { @@ -158,7 +138,7 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return; } super.baseTick(); - boolean navigating = npc.getNavigator().isNavigating() || controllerMove.hasWanted(); + boolean navigating = npc.getNavigator().isNavigating() || ai.getMoveControl().hasWanted(); if (!navigating && getBukkitEntity() != null && (!npc.hasTrait(Gravity.class) || npc.getOrAddTrait(Gravity.class).hasGravity()) && Util.isLoaded(getBukkitEntity().getLocation(LOADED_LOCATION)) @@ -170,12 +150,13 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable setDeltaMovement(Vec3.ZERO); } if (navigating) { - if (!navigation.isDone()) { - navigation.tick(); + if (!ai.getNavigation().isDone()) { + ai.getNavigation().tick(); } moveOnCurrentHeading(); } - updateAI(); + ai.getJumpControl().tick(); + ai.getMoveControl().tick(); if (isSpectator()) { this.noPhysics = true; this.onGround = false; @@ -204,6 +185,11 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return super.getAddEntityPacket(); } + @Override + public MobAI getAI() { + return ai; + } + @Override public CraftPlayer getBukkitEntity() { if (npc != null && !(super.getBukkitEntity() instanceof NPCHolder)) { @@ -212,10 +198,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return super.getBukkitEntity(); } - public PlayerControllerJump getControllerJump() { - return controllerJump; - } - @Override protected SoundEvent getDeathSound() { return NMSImpl.getSoundEffect(npc, super.getDeathSound(), NPC.Metadata.DEATH_SOUND); @@ -226,23 +208,11 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return NMSImpl.getSoundEffect(npc, super.getHurtSound(damagesource), NPC.Metadata.HURT_SOUND); } - public PlayerMoveControl getMoveControl() { - return controllerMove; - } - - public PathNavigation getNavigation() { - return navigation; - } - @Override public NPC getNPC() { return npc; } - public float getPathfindingMalus(BlockPathTypes pathtype) { - return this.malus.containsKey(pathtype) ? this.malus.get(pathtype) : pathtype.getMalus(); - } - @Override public GameProfile getProfile() { return super.getGameProfile(); @@ -304,31 +274,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } catch (IOException e) { // swallow } - AttributeInstance range = getAttribute(Attributes.FOLLOW_RANGE); - if (range == null) { - try { - AttributeSupplier provider = (AttributeSupplier) ATTRIBUTE_SUPPLIER.invoke(getAttributes()); - Map all = Maps - .newHashMap((Map) ATTRIBUTE_PROVIDER_MAP.invoke(provider)); - all.put(Attributes.FOLLOW_RANGE, - new AttributeInstance(Attributes.FOLLOW_RANGE, new Consumer() { - @Override - public void accept(AttributeInstance att) { - throw new UnsupportedOperationException( - "Tried to change value for default attribute instance FOLLOW_RANGE"); - } - })); - ATTRIBUTE_PROVIDER_MAP_SETTER.invoke(provider, ImmutableMap.copyOf(all)); - } catch (Throwable e) { - e.printStackTrace(); - } - range = getAttribute(Attributes.FOLLOW_RANGE); - } - getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.3D); - range.setBaseValue(Setting.DEFAULT_PATHFINDING_RANGE.asDouble()); - controllerJump = new PlayerControllerJump(this); - controllerMove = new PlayerMoveControl(this); - navigation = new PlayerNavigation(this, level); this.invulnerableTime = 0; NMS.setStepHeight(getBukkitEntity(), 1); // the default (0) breaks step climbing setSkinFlags((byte) 0xFF); @@ -346,10 +291,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return Util.inBlock(getBukkitEntity()); } - public boolean isNavigating() { - return npc.getNavigator().isNavigating(); - } - @Override public boolean isPushable() { return npc == null ? super.isPushable() @@ -416,18 +357,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable getAdvancements().save(); } - public void setMoveDestination(double x, double y, double z, double speed) { - controllerMove.setWantedPosition(x, y, z, speed); - } - - public void setPathfindingMalus(BlockPathTypes pathtype, float f) { - this.malus.put(pathtype, f); - } - - public void setShouldJump() { - controllerJump.jump(); - } - @Override public void setSkinFlags(byte flags) { this.getEntityData().set(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION, flags); @@ -472,11 +401,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } } - public void updateAI() { - controllerMove.tick(); - controllerJump.b(); - } - private void updatePackets(boolean navigating) { if (!npc.isUpdating(NPCUpdate.PACKET)) return; @@ -502,10 +426,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable NMSImpl.sendPacketsNearby(getBukkitEntity(), current, packets); } - public void updatePathfindingRange(float pathfindingRange) { - this.navigation.setRange(pathfindingRange); - } - public static class PlayerNPC extends CraftPlayer implements NPCHolder, SkinnableEntity { private final CraftServer cserver; private final CitizensNPC npc; @@ -583,12 +503,9 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable } } - 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 float EPSILON = 0.003F; private static final MethodHandle GAMEMODE_SETTING = NMS.getFirstMethodHandle(ServerPlayerGameMode.class, true, GameType.class, GameType.class); + private static final Location LOADED_LOCATION = new Location(null, 0, 0, 0); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/MagmaCubeController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/MagmaCubeController.java index 025594706..22ea4fc56 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/MagmaCubeController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/MagmaCubeController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -58,7 +58,7 @@ public class MagmaCubeController extends MobEntityController { if (npc != null) { setSize(3, true); this.oldMoveController = this.moveControl; - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } } @@ -205,7 +205,7 @@ public class MagmaCubeController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PhantomController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PhantomController.java index 6bbeda3fe..f0e9ddff5 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PhantomController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PhantomController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -76,7 +76,7 @@ public class PhantomController extends MobEntityController { this.lookControl = this.oldLookController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); this.lookControl = new LookControl(this); } if (npc.isProtected()) { diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PufferFishController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PufferFishController.java index d2c921153..c7d364c3a 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PufferFishController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/PufferFishController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.trait.versioned.PufferFishTrait; @@ -122,7 +122,7 @@ public class PufferFishController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SalmonController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SalmonController.java index e5eb95c3d..b7d4840e5 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SalmonController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SalmonController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -116,7 +116,7 @@ public class SalmonController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } } super.customServerAiStep(); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SlimeController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SlimeController.java index 5d27ed944..5dbd84f1b 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SlimeController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/SlimeController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -58,7 +58,7 @@ public class SlimeController extends MobEntityController { if (npc != null) { setSize(3, true); this.oldMoveController = this.moveControl; - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } } @@ -206,7 +206,7 @@ public class SlimeController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } npc.update(); } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TropicalFishController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TropicalFishController.java index 9ff933b16..b23924b97 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TropicalFishController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TropicalFishController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -118,7 +118,7 @@ public class TropicalFishController extends MobEntityController { this.moveControl = this.oldMoveController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); } } super.customServerAiStep(); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TurtleController.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TurtleController.java index 63db10c59..b9838ede1 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TurtleController.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/entity/TurtleController.java @@ -10,7 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.nms.v1_17_R1.util.ForwardingNPCHolder; import net.citizensnpcs.nms.v1_17_R1.util.NMSBoundingBox; import net.citizensnpcs.nms.v1_17_R1.util.NMSImpl; -import net.citizensnpcs.nms.v1_17_R1.util.PlayerMoveControl; +import net.citizensnpcs.nms.v1_17_R1.util.EntityMoveControl; import net.citizensnpcs.npc.CitizensNPC; import net.citizensnpcs.npc.ai.NPCHolder; import net.citizensnpcs.util.NMS; @@ -105,7 +105,7 @@ public class TurtleController extends MobEntityController { this.jumpControl = this.oldJumpController; } if (!npc.useMinecraftAI() && this.moveControl == this.oldMoveController) { - this.moveControl = new PlayerMoveControl(this); + this.moveControl = new EntityMoveControl(this); this.jumpControl = new EmptyControllerJump(this); } npc.update(); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityJumpControl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityJumpControl.java new file mode 100644 index 000000000..c619339ba --- /dev/null +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityJumpControl.java @@ -0,0 +1,27 @@ +package net.citizensnpcs.nms.v1_17_R1.util; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.control.JumpControl; +import net.minecraft.world.entity.monster.Slime; + +public class EntityJumpControl extends JumpControl { + private boolean a; + private final LivingEntity b; + + public EntityJumpControl(LivingEntity entityinsentient) { + super(new Slime(EntityType.SLIME, entityinsentient.level)); + this.b = entityinsentient; + } + + @Override + public void jump() { + this.a = true; + } + + @Override + public void tick() { + this.b.setJumping(this.a); + this.a = false; + } +} diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerMoveControl.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityMoveControl.java similarity index 89% rename from v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerMoveControl.java rename to v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityMoveControl.java index 22b4276bc..83fa4009f 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerMoveControl.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityMoveControl.java @@ -2,7 +2,6 @@ package net.citizensnpcs.nms.v1_17_R1.util; import java.util.Random; -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; import net.citizensnpcs.util.NMS; import net.minecraft.util.Mth; import net.minecraft.world.entity.EntityType; @@ -13,7 +12,7 @@ import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.monster.Slime; -public class PlayerMoveControl extends MoveControl { +public class EntityMoveControl extends MoveControl { protected LivingEntity entity; private int jumpTicks; protected boolean moving; @@ -22,7 +21,7 @@ public class PlayerMoveControl extends MoveControl { protected double ty; protected double tz; - public PlayerMoveControl(LivingEntity entityinsentient) { + public EntityMoveControl(LivingEntity entityinsentient) { super(entityinsentient instanceof Mob ? (Mob) entityinsentient : new Slime(EntityType.SLIME, entityinsentient.level)); this.entity = entityinsentient; @@ -122,11 +121,7 @@ public class PlayerMoveControl extends MoveControl { if (shouldJump() || (dY >= NMS.getStepHeight(entity.getBukkitEntity()) && dXZ < 1.0D)) { this.jumpTicks = jumpTicks(); this.jumpTicks /= 3; - if (this.entity instanceof EntityHumanNPC) { - ((EntityHumanNPC) this.entity).getControllerJump().jump(); - } else { - ((Mob) this.entity).getJumpControl().jump(); - } + entity.setJumping(true); } } } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNavigation.java similarity index 94% rename from v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java rename to v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNavigation.java index 0752cac8f..62185e3d2 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNavigation.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNavigation.java @@ -7,13 +7,13 @@ import java.util.stream.Stream; import com.google.common.collect.ImmutableSet; import net.citizensnpcs.Settings.Setting; -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.tags.BlockTags; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; @@ -31,7 +31,7 @@ import net.minecraft.world.level.pathfinder.PathFinder; import net.minecraft.world.level.pathfinder.WalkNodeEvaluator; import net.minecraft.world.phys.Vec3; -public class PlayerNavigation extends PathNavigation { +public class EntityNavigation extends PathNavigation { private boolean avoidSun; private final AttributeInstance followRange; protected boolean hasDelayedRecomputation; @@ -39,13 +39,13 @@ public class PlayerNavigation extends PathNavigation { protected int lastStuckCheck; protected Vec3 lastStuckCheckPos = Vec3.ZERO; protected long lastTimeoutCheck; - protected final Level level; protected float maxDistanceToWaypoint = 0.5F; private float maxVisitedNodesMultiplier = 1.0F; - protected final EntityHumanNPC mob; - protected PlayerNodeEvaluator nodeEvaluator; + protected final LivingEntity mob; + private final MobAI mvmt; + protected EntityNodeEvaluator nodeEvaluator; protected Path path; - private final PlayerPathfinder pathFinder; + private final EntityPathfinder pathFinder; private int reachRange; protected double speedModifier; private BlockPos targetPos; @@ -55,17 +55,22 @@ public class PlayerNavigation extends PathNavigation { protected double timeoutLimit; protected long timeoutTimer; - public PlayerNavigation(EntityHumanNPC entityinsentient, Level world) { + public EntityNavigation(LivingEntity entityinsentient, Level world) { super(getDummyInsentient(entityinsentient, world), world); this.mob = entityinsentient; - this.level = world; + this.mvmt = MobAI.from(entityinsentient); this.followRange = entityinsentient.getAttribute(Attributes.FOLLOW_RANGE); - this.nodeEvaluator = new PlayerNodeEvaluator(); + this.nodeEvaluator = new EntityNodeEvaluator(); this.nodeEvaluator.setCanPassDoors(true); - this.pathFinder = new PlayerPathfinder(this.nodeEvaluator, Setting.MAXIMUM_VISITED_NODES.asInt()); + this.pathFinder = new EntityPathfinder(this.nodeEvaluator, Setting.MAXIMUM_VISITED_NODES.asInt()); this.setRange(24); } + public boolean canCutCorner(BlockPathTypes pathtype) { + return (pathtype != BlockPathTypes.DANGER_FIRE && pathtype != BlockPathTypes.DANGER_CACTUS + && pathtype != BlockPathTypes.DANGER_OTHER && pathtype != BlockPathTypes.WALKABLE_DOOR); + } + @Override public boolean canFloat() { return this.nodeEvaluator.canFloat(); @@ -165,7 +170,7 @@ public class PlayerNavigation extends PathNavigation { return false; var19 = this.nodeEvaluator.getBlockPathType(this.level, var13, var1, var14, this.mob, var3, var4, var5, true, true); - float var20 = this.mob.getPathfindingMalus(var19); + float var20 = this.mvmt.getPathfindingMalus(var19); if (var20 < 0.0F || var20 >= 8.0F) return false; if (var19 == BlockPathTypes.DAMAGE_FIRE || var19 == BlockPathTypes.DANGER_FIRE @@ -287,7 +292,7 @@ public class PlayerNavigation extends PathNavigation { double var4 = Math.abs(this.mob.getY() - blockPos.getY()); double var6 = Math.abs(this.mob.getZ() - (blockPos.getZ() + 0.5D)); boolean var8 = (var2 < this.maxDistanceToWaypoint && var6 < this.maxDistanceToWaypoint && var4 < 1.0D); - if (var8 || (this.mob.canCutCorner((this.path.getNextNode()).type) && shouldTargetNextNodeInDirection(var0))) + if (var8 || (canCutCorner((this.path.getNextNode()).type) && shouldTargetNextNodeInDirection(var0))) this.path.advance(); doStuckDetection(var0); } @@ -529,7 +534,7 @@ public class PlayerNavigation extends PathNavigation { return; Vec3 var0 = this.path.getNextEntityPos(this.mob); BlockPos var1 = new BlockPos(var0); - this.mob.getMoveControl().setWantedPosition(var0.x, this.level.getBlockState(var1.down()).isAir() ? var0.y + this.mvmt.getMoveControl().setWantedPosition(var0.x, this.level.getBlockState(var1.down()).isAir() ? var0.y : WalkNodeEvaluator.getFloorLevel(this.level, var1), var0.z, this.speedModifier); } @@ -554,7 +559,7 @@ public class PlayerNavigation extends PathNavigation { } } - private static Mob getDummyInsentient(EntityHumanNPC from, Level world) { + private static Mob getDummyInsentient(LivingEntity from, Level world) { return new Mob(EntityType.VILLAGER, world) { }; } diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluator.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluator.java similarity index 93% rename from v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluator.java rename to v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluator.java index 979783f22..a0167e0db 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluator.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluator.java @@ -7,12 +7,12 @@ import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.longs.Long2ObjectOpenHa import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.Object2BooleanMap; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.Object2BooleanOpenHashMap; -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; import net.minecraft.tags.FluidTags; import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.PathNavigationRegion; @@ -34,7 +34,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.VoxelShape; -public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { +public class EntityNodeEvaluator extends EntityNodeEvaluatorBase { private final Long2ObjectMap l = new Long2ObjectOpenHashMap(); private final Object2BooleanMap m = new Object2BooleanOpenHashMap(); protected float oldWaterCost; @@ -54,7 +54,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { @Override public void done() { - this.mob.setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost); + this.mvmt.setPathfindingMalus(BlockPathTypes.WATER, this.oldWaterCost); this.l.clear(); this.m.clear(); super.done(); @@ -84,7 +84,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { if (var10 - var4 > 1.125D) return null; BlockPathTypes var12 = getCachedBlockType(this.mob, var0, var1, var2); - float var13 = this.mob.getPathfindingMalus(var12); + float var13 = this.mvmt.getPathfindingMalus(var12); double var14 = this.mob.getBbWidth() / 2.0D; if (var13 >= 0.0F) { var8 = getNode(var0, var1, var2); @@ -121,7 +121,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { if (var12 == BlockPathTypes.WATER) { var8 = getNode(var0, var1, var2); var8.type = var12; - var8.costMalus = Math.max(var8.costMalus, this.mob.getPathfindingMalus(var12)); + var8.costMalus = Math.max(var8.costMalus, this.mvmt.getPathfindingMalus(var12)); continue; } return var8; @@ -145,7 +145,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return var18; } var12 = getCachedBlockType(this.mob, var0, var1, var2); - var13 = this.mob.getPathfindingMalus(var12); + var13 = this.mvmt.getPathfindingMalus(var12); if (var12 != BlockPathTypes.OPEN && var13 >= 0.0F) { var8 = getNode(var0, var1, var2); var8.type = var12; @@ -174,8 +174,8 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return getBlockPathTypeStatic(var0, new BlockPos.MutableBlockPos(var1, var2, var3)); } - public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, EntityHumanNPC var4, - int var5, int var6, int var7, boolean var8, boolean var9) { + public BlockPathTypes getBlockPathType(BlockGetter var0, int var1, int var2, int var3, LivingEntity var4, int var5, + int var6, int var7, boolean var8, boolean var9) { EnumSet var10 = EnumSet.noneOf(BlockPathTypes.class); BlockPathTypes var11 = BlockPathTypes.BLOCKED; BlockPos var12 = var4.blockPosition(); @@ -186,12 +186,12 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return BlockPathTypes.UNPASSABLE_RAIL; BlockPathTypes var13 = BlockPathTypes.BLOCKED; for (BlockPathTypes var15 : var10) { - if (var4.getPathfindingMalus(var15) < 0.0F) + if (mvmt.getPathfindingMalus(var15) < 0.0F) return var15; - if (var4.getPathfindingMalus(var15) >= var4.getPathfindingMalus(var13)) + if (mvmt.getPathfindingMalus(var15) >= mvmt.getPathfindingMalus(var13)) var13 = var15; } - if (var11 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var13) == 0.0F && var5 <= 1) + if (var11 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var13) == 0.0F && var5 <= 1) return BlockPathTypes.OPEN; return var13; } @@ -219,12 +219,12 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return var13; } - private BlockPathTypes getBlockPathType(EntityHumanNPC var0, BlockPos var1) { + private BlockPathTypes getBlockPathType(LivingEntity var0, BlockPos var1) { return getCachedBlockType(var0, var1.getX(), var1.getY(), var1.getZ()); } - public BlockPathTypes getBlockPathTypee(BlockGetter var0, int var1, int var2, int var3, EntityHumanNPC var4, - int var5, int var6, int var7, boolean var8, boolean var9) { + public BlockPathTypes getBlockPathTypee(BlockGetter var0, int var1, int var2, int var3, LivingEntity var4, int var5, + int var6, int var7, boolean var8, boolean var9) { EnumSet var10 = EnumSet.noneOf(BlockPathTypes.class); BlockPathTypes var11 = BlockPathTypes.BLOCKED; BlockPos var12 = var4.blockPosition(); @@ -235,12 +235,12 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return BlockPathTypes.UNPASSABLE_RAIL; BlockPathTypes var13 = BlockPathTypes.BLOCKED; for (BlockPathTypes var15 : var10) { - if (var4.getPathfindingMalus(var15) < 0.0F) + if (mvmt.getPathfindingMalus(var15) < 0.0F) return var15; - if (var4.getPathfindingMalus(var15) >= var4.getPathfindingMalus(var13)) + if (mvmt.getPathfindingMalus(var15) >= mvmt.getPathfindingMalus(var13)) var13 = var15; } - if (var11 == BlockPathTypes.OPEN && var4.getPathfindingMalus(var13) == 0.0F && var5 <= 1) + if (var11 == BlockPathTypes.OPEN && mvmt.getPathfindingMalus(var13) == 0.0F && var5 <= 1) return BlockPathTypes.OPEN; return var13; } @@ -264,7 +264,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { return var10; } - protected BlockPathTypes getCachedBlockType(EntityHumanNPC var0, int var1, int var2, int var3) { + protected BlockPathTypes getCachedBlockType(LivingEntity var0, int var1, int var2, int var3) { return this.l.computeIfAbsent(BlockPos.asLong(var1, var2, var3), var4 -> getBlockPathType(this.level, var1, var2, var3, var0, this.entityWidth, this.entityHeight, this.entityDepth, canOpenDoors(), canPassDoors())); @@ -291,7 +291,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { int var3 = 0; BlockPathTypes var4 = getCachedBlockType(this.mob, var1.x, var1.y + 1, var1.z); BlockPathTypes var5 = getCachedBlockType(this.mob, var1.x, var1.y, var1.z); - if (this.mob.getPathfindingMalus(var4) >= 0.0F && var5 != BlockPathTypes.STICKY_HONEY) + if (this.mvmt.getPathfindingMalus(var4) >= 0.0F && var5 != BlockPathTypes.STICKY_HONEY) var3 = Mth.floor(Math.max(1.0F, this.mob.maxUpStep)); double var6 = getFloorLevel(new BlockPos(var1.x, var1.y, var1.z)); Node var8 = findAcceptedNode(var1.x, var1.y, var1.z + 1, var3, var6, Direction.SOUTH, var5); @@ -350,7 +350,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { } BlockPos var3 = this.mob.blockPosition(); BlockPathTypes var4 = getCachedBlockType(this.mob, var3.getX(), var0, var3.getZ()); - if (this.mob.getPathfindingMalus(var4) < 0.0F) { + if (this.mvmt.getPathfindingMalus(var4) < 0.0F) { AABB aABB = this.mob.getBoundingBox(); if (hasPositiveMalus(var1.set(aABB.minX, var0, aABB.minZ)) || hasPositiveMalus(var1.set(aABB.minX, var0, aABB.maxZ)) @@ -358,13 +358,13 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { || hasPositiveMalus(var1.set(aABB.maxX, var0, aABB.maxZ))) { Node var6 = getNode(var1); var6.type = getBlockPathType(this.mob, var6.asBlockPos()); - var6.costMalus = this.mob.getPathfindingMalus(var6.type); + var6.costMalus = this.mvmt.getPathfindingMalus(var6.type); return var6; } } Node var5 = getNode(var3.getX(), var0, var3.getZ()); var5.type = getBlockPathType(this.mob, var5.asBlockPos()); - var5.costMalus = this.mob.getPathfindingMalus(var5.type); + var5.costMalus = this.mvmt.getPathfindingMalus(var5.type); return var5; } @@ -374,7 +374,7 @@ public class PlayerNodeEvaluator extends PlayerNodeEvaluatorBase { private boolean hasPositiveMalus(BlockPos var0) { BlockPathTypes var1 = getBlockPathType(this.mob, var0); - return (this.mob.getPathfindingMalus(var1) >= 0.0F); + return (this.mvmt.getPathfindingMalus(var1) >= 0.0F); } protected boolean isAmphibious() { diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluatorBase.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluatorBase.java similarity index 88% rename from v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluatorBase.java rename to v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluatorBase.java index a3c68866c..e8a099223 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerNodeEvaluatorBase.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityNodeEvaluatorBase.java @@ -3,15 +3,15 @@ package net.citizensnpcs.nms.v1_17_R1.util; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.level.PathNavigationRegion; import net.minecraft.world.level.pathfinder.Node; import net.minecraft.world.level.pathfinder.NodeEvaluator; -public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator { +public abstract class EntityNodeEvaluatorBase extends NodeEvaluator { protected final Int2ObjectMap c = new Int2ObjectOpenHashMap(); protected boolean canFloat; protected boolean canOpenDoors; @@ -20,7 +20,8 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator { protected int entityHeight; protected int entityWidth; protected PathNavigationRegion level; - protected EntityHumanNPC mob; + protected LivingEntity mob; + protected MobAI mvmt; @Override public boolean canFloat() { @@ -41,6 +42,7 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator { public void done() { this.level = null; this.mob = null; + this.mvmt = null; } @Override @@ -53,9 +55,10 @@ public abstract class PlayerNodeEvaluatorBase extends NodeEvaluator { return this.c.computeIfAbsent(Node.createHash(var0, var1, var2), var3 -> new Node(var0, var1, var2)); } - public void prepare(PathNavigationRegion var0, EntityHumanNPC var1) { + public void prepare(PathNavigationRegion var0, LivingEntity var1) { this.level = var0; this.mob = var1; + this.mvmt = MobAI.from(var1); this.c.clear(); this.entityWidth = Mth.floor(var1.getBbWidth() + 1.0F); this.entityHeight = Mth.floor(var1.getBbHeight() + 1.0F); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityPathfinder.java similarity index 93% rename from v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java rename to v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityPathfinder.java index 586b74dea..823bf6a0d 100644 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerPathfinder.java +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/EntityPathfinder.java @@ -14,10 +14,10 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import net.citizensnpcs.Settings.Setting; -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; import net.minecraft.core.BlockPos; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.metrics.MetricCategory; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.level.PathNavigationRegion; import net.minecraft.world.level.pathfinder.BinaryHeap; @@ -26,27 +26,27 @@ import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.level.pathfinder.PathFinder; import net.minecraft.world.level.pathfinder.Target; -public class PlayerPathfinder extends PathFinder { +public class EntityPathfinder extends PathFinder { private final int maxVisitedNodes; private final Node[] neighbors = new Node[32]; - private final PlayerNodeEvaluator nodeEvaluator; + private final EntityNodeEvaluator nodeEvaluator; private final BinaryHeap openSet; - public PlayerPathfinder() { + public EntityPathfinder() { super(null, Setting.MAXIMUM_VISITED_NODES.asInt()); - this.nodeEvaluator = new PlayerNodeEvaluator(); + this.nodeEvaluator = new EntityNodeEvaluator(); this.openSet = new BinaryHeap(); this.maxVisitedNodes = Setting.MAXIMUM_VISITED_NODES.asInt(); } - public PlayerPathfinder(PlayerNodeEvaluator var0, int var1) { + public EntityPathfinder(EntityNodeEvaluator var0, int var1) { super(var0, var1); this.openSet = new BinaryHeap(); this.nodeEvaluator = var0; this.maxVisitedNodes = var1; } - public Path findPath(PathNavigationRegion var0, EntityHumanNPC var1, Set var2, float var3, int var4, + public Path findPath(PathNavigationRegion var0, LivingEntity var1, Set var2, float var3, int var4, float var5) { this.openSet.clear(); this.nodeEvaluator.prepare(var0, var1); diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/MobAI.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/MobAI.java new file mode 100644 index 000000000..2489824a1 --- /dev/null +++ b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/MobAI.java @@ -0,0 +1,176 @@ +package net.citizensnpcs.nms.v1_17_R1.util; + +import java.util.Map; + +import com.google.common.collect.Maps; + +import net.citizensnpcs.Settings.Setting; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.JumpControl; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.level.pathfinder.BlockPathTypes; + +public interface MobAI { + org.bukkit.entity.Entity getBukkitEntity(); + + JumpControl getJumpControl(); + + Map getMalus(); + + MoveControl getMoveControl(); + + PathNavigation getNavigation(); + + default float getPathfindingMalus(BlockPathTypes var1) { + Map malus = getMalus(); + return malus.containsKey(var1) ? malus.get(var1) : var1.getMalus(); + } + + default void setPathfindingMalus(BlockPathTypes water, float oldWaterCost) { + getMalus().put(water, oldWaterCost); + } + + default void tickAI() { + getJumpControl().tick(); + getMoveControl().tick(); + PathNavigation nav = getNavigation(); + if (!nav.isDone()) { + nav.tick(); + } + } + + default void updatePathfindingRange(float range) { + ((LivingEntity) NMSImpl.getHandle(getBukkitEntity())).getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(range); + } + + public static class BasicMobAI implements MobAI { + private final EntityJumpControl controllerJump; + private final EntityMoveControl controllerMove; + private final LivingEntity entity; + private final Map malus; + private final EntityNavigation navigation; + + public BasicMobAI(LivingEntity entity) { + this.entity = entity; + NMSImpl.setAttribute(entity, Attributes.FOLLOW_RANGE, Setting.DEFAULT_PATHFINDING_RANGE.asDouble()); + entity.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.3D); + controllerJump = new EntityJumpControl(entity); + controllerMove = new EntityMoveControl(entity); + navigation = new EntityNavigation(entity, entity.level); + malus = Maps.newEnumMap(BlockPathTypes.class); + } + + @Override + public org.bukkit.entity.Entity getBukkitEntity() { + return entity.getBukkitEntity(); + } + + @Override + public JumpControl getJumpControl() { + return controllerJump; + } + + @Override + public Map getMalus() { + return malus; + } + + @Override + public MoveControl getMoveControl() { + return controllerMove; + } + + @Override + public PathNavigation getNavigation() { + return navigation; + } + + } + + public static interface ForwardingMobAI extends MobAI { + MobAI getAI(); + + @Override + default org.bukkit.entity.Entity getBukkitEntity() { + return getAI().getBukkitEntity(); + } + + @Override + default JumpControl getJumpControl() { + return getAI().getJumpControl(); + } + + @Override + default Map getMalus() { + return getAI().getMalus(); + } + + @Override + default MoveControl getMoveControl() { + return getAI().getMoveControl(); + } + + @Override + default PathNavigation getNavigation() { + return getAI().getNavigation(); + } + } + + public static MobAI from(Entity handle) { + if (handle instanceof Mob) { + Mob mob = (Mob) handle; + return new MobAI() { + @Override + public org.bukkit.entity.Entity getBukkitEntity() { + return mob.getBukkitEntity(); + } + + @Override + public JumpControl getJumpControl() { + return mob.getJumpControl(); + } + + @Override + public Map getMalus() { + return null; + } + + @Override + public MoveControl getMoveControl() { + return mob.getMoveControl(); + } + + @Override + public PathNavigation getNavigation() { + return mob.getNavigation(); + } + + @Override + public float getPathfindingMalus(BlockPathTypes var1) { + return mob.getPathfindingMalus(var1); + } + + @Override + public void setPathfindingMalus(BlockPathTypes water, float oldWaterCost) { + mob.setPathfindingMalus(water, oldWaterCost); + } + + @Override + public void tickAI() { + mob.getSensing().tick(); + mob.getNavigation().tick(); + mob.getMoveControl().tick(); + mob.getLookControl().tick(); + mob.getJumpControl().tick(); + } + }; + } else if (handle instanceof MobAI) { + return (MobAI) handle; + } + return null; + } +} 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 24d93d379..f49e1aa44 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 @@ -54,6 +54,7 @@ import org.bukkit.util.Vector; import com.google.common.base.Function; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -278,10 +279,12 @@ import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.TamableAnimal; import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeMap; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.ai.control.FlyingMoveControl; -import net.minecraft.world.entity.ai.control.JumpControl; import net.minecraft.world.entity.ai.control.MoveControl; import net.minecraft.world.entity.ai.goal.GoalSelector; import net.minecraft.world.entity.ai.navigation.PathNavigation; @@ -429,14 +432,15 @@ public class NMSImpl implements NMSBridge { @Override public void cancelMoveDestination(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); - if (handle instanceof Mob) { + MobAI ai = MobAI.from(handle); + if (ai.getMoveControl() instanceof EntityMoveControl) { + ((EntityMoveControl) ai.getMoveControl()).moving = false; + } else { try { - MOVE_CONTROLLER_MOVING.invoke(((Mob) handle).getMoveControl(), null); + MOVE_CONTROLLER_MOVING.invoke(ai.getMoveControl(), null); } catch (Throwable t) { t.printStackTrace(); } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getMoveControl().moving = false; } } @@ -560,7 +564,7 @@ public class NMSImpl implements NMSBridge { public Location getDestination(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); MoveControl controller = handle instanceof Mob ? ((Mob) handle).getMoveControl() - : handle instanceof EntityHumanNPC ? ((EntityHumanNPC) handle).getMoveControl() : null; + : handle instanceof MobAI ? ((MobAI) handle).getMoveControl() : null; if (controller == null || !controller.hasWanted()) { return null; } @@ -702,12 +706,11 @@ public class NMSImpl implements NMSBridge { // navigation won't execute, and calling entity.move doesn't // entirely fix the problem. final PathNavigation navigation = NMSImpl.getNavigation(entity); - final float oldWater = raw instanceof ServerPlayer - ? ((EntityHumanNPC) raw).getPathfindingMalus(BlockPathTypes.WATER) + final float oldWater = raw instanceof MobAI ? ((MobAI) raw).getPathfindingMalus(BlockPathTypes.WATER) : ((Mob) raw).getPathfindingMalus(BlockPathTypes.WATER); if (params.avoidWater() && oldWater >= 0) { if (raw instanceof ServerPlayer) { - ((EntityHumanNPC) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater + 1F); + ((MobAI) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater + 1F); } else { ((Mob) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater + 1F); } @@ -744,8 +747,8 @@ public class NMSImpl implements NMSBridge { Util.sendBlockChanges(blocks, null); } if (oldWater >= 0) { - if (raw instanceof ServerPlayer) { - ((EntityHumanNPC) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater); + if (raw instanceof MobAI) { + ((MobAI) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater); } else { ((Mob) raw).setPathfindingMalus(BlockPathTypes.WATER, oldWater); } @@ -995,7 +998,7 @@ public class NMSImpl implements NMSBridge { public void look(org.bukkit.entity.Entity entity, Location to, boolean headOnly, boolean immediate) { Entity handle = NMSImpl.getHandle(entity); if (immediate || headOnly || BAD_CONTROLLER_LOOK.contains(handle.getBukkitEntity().getType()) - || (!(handle instanceof Mob) && !(handle instanceof EntityHumanNPC))) { + || (!(handle instanceof Mob) && !(handle instanceof MobAI))) { Location fromLocation = entity.getLocation(FROM_LOCATION); double xDiff, yDiff, zDiff; xDiff = to.getX() - fromLocation.getX(); @@ -1029,8 +1032,8 @@ public class NMSImpl implements NMSBridge { while (((LivingEntity) handle).yHeadRot < -180F) { ((LivingEntity) handle).yHeadRot += 360F; } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); + } else if (handle instanceof NPCHolder) { + ((NPCHolder) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); } } @@ -1038,7 +1041,7 @@ public class NMSImpl implements NMSBridge { public void look(org.bukkit.entity.Entity from, org.bukkit.entity.Entity to) { Entity handle = NMSImpl.getHandle(from), target = NMSImpl.getHandle(to); if (BAD_CONTROLLER_LOOK.contains(handle.getBukkitEntity().getType()) - || (!(handle instanceof Mob) && !(handle instanceof EntityHumanNPC))) { + || (!(handle instanceof Mob) && !(handle instanceof MobAI))) { if (to instanceof org.bukkit.entity.LivingEntity) { look(from, ((org.bukkit.entity.LivingEntity) to).getEyeLocation(), false, true); } else { @@ -1053,8 +1056,8 @@ public class NMSImpl implements NMSBridge { while (((LivingEntity) handle).yHeadRot < -180F) { ((LivingEntity) handle).yHeadRot += 360F; } - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); + } else if (handle instanceof NPCHolder) { + ((NPCHolder) handle).getNPC().getOrAddTrait(RotationTrait.class).getPhysicalSession().rotateToFace(to); } } @@ -1299,8 +1302,8 @@ public class NMSImpl implements NMSBridge { return; if (handle instanceof Mob) { ((Mob) handle).getMoveControl().setWantedPosition(x, y, z, speed); - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).setMoveDestination(x, y, z, speed); + } else if (handle instanceof MobAI) { + ((MobAI) handle).getMoveControl().setWantedPosition(x, y, z, speed); } } @@ -1422,11 +1425,9 @@ public class NMSImpl implements NMSBridge { Entity handle = NMSImpl.getHandle(entity); if (handle == null) return; - if (handle instanceof Mob) { - JumpControl controller = ((Mob) handle).getJumpControl(); - controller.jump(); - } else if (handle instanceof EntityHumanNPC) { - ((EntityHumanNPC) handle).setShouldJump(); + MobAI ai = MobAI.from(handle); + if (ai != null) { + ai.getJumpControl().jump(); } } @@ -1633,10 +1634,9 @@ public class NMSImpl implements NMSBridge { if (!npc.isSpawned() || !npc.getEntity().getType().isAlive()) return; LivingEntity en = NMSImpl.getHandle((org.bukkit.entity.LivingEntity) npc.getEntity()); - if (!(en instanceof Mob)) { - if (en instanceof EntityHumanNPC) { - ((EntityHumanNPC) en).updatePathfindingRange(pathfindingRange); - } + + if (en instanceof MobAI) { + ((MobAI) en).updatePathfindingRange(pathfindingRange); return; } if (NAVIGATION_PATHFINDER == null) @@ -2003,12 +2003,12 @@ public class NMSImpl implements NMSBridge { public static PathNavigation getNavigation(org.bukkit.entity.Entity entity) { Entity handle = getHandle(entity); return handle instanceof Mob ? ((Mob) handle).getNavigation() - : handle instanceof EntityHumanNPC ? ((EntityHumanNPC) handle).getNavigation() : null; + : handle instanceof MobAI ? ((MobAI) handle).getNavigation() : null; } private static Path getPathEntity(PathNavigation nav) { try { - return nav instanceof PlayerNavigation ? ((PlayerNavigation) nav).getPathEntity() + return nav instanceof EntityNavigation ? ((EntityNavigation) nav).getPathEntity() : (Path) NAVIGATION_PATH.invoke(nav); } catch (Throwable e) { e.printStackTrace(); @@ -2148,6 +2148,26 @@ public class NMSImpl implements NMSBridge { } } + public static void setAttribute(LivingEntity entity, Attribute attribute, double value) { + AttributeInstance attr = entity.getAttribute(attribute); + if (attr == null) { + try { + AttributeSupplier provider = (AttributeSupplier) ATTRIBUTE_SUPPLIER.invoke(entity.getAttributes()); + Map all = Maps + .newHashMap((Map) ATTRIBUTE_PROVIDER_MAP.invoke(provider)); + all.put(attribute, new AttributeInstance(attribute, att -> { + throw new UnsupportedOperationException( + "Tried to change value for default attribute instance FOLLOW_RANGE"); + })); + ATTRIBUTE_PROVIDER_MAP_SETTER.invoke(provider, ImmutableMap.copyOf(all)); + } catch (Throwable e) { + e.printStackTrace(); + } + attr = entity.getAttribute(attribute); + } + attr.setBaseValue(value); + } + public static void setBukkitEntity(Entity entity, CraftEntity bukkitEntity) { try { BUKKITENTITY_FIELD_SETTER.invoke(entity, bukkitEntity); @@ -2218,8 +2238,8 @@ public class NMSImpl implements NMSBridge { handle.getMoveControl().tick(); handle.getLookControl().tick(); handle.getJumpControl().tick(); - } else if (entity instanceof EntityHumanNPC) { - ((EntityHumanNPC) entity).updateAI(); + } else if (entity instanceof MobAI) { + ((MobAI) entity).tickAI(); } } @@ -2244,6 +2264,13 @@ 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, diff --git a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerControllerJump.java b/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerControllerJump.java deleted file mode 100644 index de4d1fc2b..000000000 --- a/v1_17_R1/src/main/java/net/citizensnpcs/nms/v1_17_R1/util/PlayerControllerJump.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.citizensnpcs.nms.v1_17_R1.util; - -import net.citizensnpcs.nms.v1_17_R1.entity.EntityHumanNPC; - -public class PlayerControllerJump { - private boolean a; - private final EntityHumanNPC b; - - public PlayerControllerJump(EntityHumanNPC entityinsentient) { - this.b = entityinsentient; - } - - public void b() { - this.b.setJumping(this.a); - this.a = false; - } - - public void jump() { - this.a = true; - } -} diff --git a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java index b82002350..42e6a550d 100644 --- a/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java +++ b/v1_18_R2/src/main/java/net/citizensnpcs/nms/v1_18_R2/entity/EntityHumanNPC.java @@ -292,10 +292,6 @@ public class EntityHumanNPC extends ServerPlayer implements NPCHolder, Skinnable return Util.inBlock(getBukkitEntity()); } - public boolean isNavigating() { - return npc.getNavigator().isNavigating(); - } - @Override public boolean isPushable() { return npc == null ? super.isPushable() : npc.data(). get(NPC.Metadata.COLLIDABLE, !npc.isProtected());