diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java index 1473dc3510..667b85fcd7 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/EntityHelper.java @@ -383,4 +383,8 @@ public int getInWaterTime(Zombie zombie) { public void setInWaterTime(Zombie zombie, int ticks) { throw new UnsupportedOperationException(); } + + public void setTrackingRange(Entity entity, int range) { + throw new UnsupportedOperationException(); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index ff91ce6978..dd71e8807a 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -4046,6 +4046,16 @@ else if (getBukkitEntity() instanceof Creeper) { NMSHandler.getEntityHelper().setFallingBlockType((FallingBlock) getBukkitEntity(), mechanism.valueAsType(MaterialTag.class).getModernData()); } + // <--[mechanism] + // @object EntityTag + // @name tracking_range + // @input ElementTag(Number) + // @description + // Sets the range (in blocks) that an entity can be seen at. This is equivalent to the "entity-tracking-range" value in "Spigot.yml". + // --> + if (mechanism.matches("tracking_range") && mechanism.requireInteger()) { + NMSHandler.getEntityHelper().setTrackingRange(getBukkitEntity(), mechanism.getValue().asInt()); + } CoreUtilities.autoPropertyMechanism(this, mechanism); } diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java index 9c147c5910..22388818bf 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/EntityHelperImpl.java @@ -829,4 +829,18 @@ public void setInWaterTime(Zombie zombie, int ticks) { Debug.echoError(ex); } } + + public static final MethodHandle TRACKING_RANGE_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(ChunkMap.TrackedEntity.class, int.class); + + @Override + public void setTrackingRange(Entity entity, int range) { + try { + ChunkMap map = ((CraftWorld) entity.getWorld()).getHandle().getChunkProvider().chunkMap; + ChunkMap.TrackedEntity entry = map.G.get(entity.getEntityId()); + TRACKING_RANGE_SETTER.invoke(entry, range); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } } diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java index 2c0c3ab927..65bf3990e4 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/helpers/EntityHelperImpl.java @@ -829,4 +829,18 @@ public void setInWaterTime(Zombie zombie, int ticks) { Debug.echoError(ex); } } + + public static final MethodHandle TRACKING_RANGE_SETTER = ReflectionHelper.getFinalSetterForFirstOfType(ChunkMap.TrackedEntity.class, int.class); + + @Override + public void setTrackingRange(Entity entity, int range) { + try { + ChunkMap map = ((CraftWorld) entity.getWorld()).getHandle().getChunkSource().chunkMap; + ChunkMap.TrackedEntity entry = map.entityMap.get(entity.getEntityId()); + TRACKING_RANGE_SETTER.invoke(entry, range); + } + catch (Throwable ex) { + Debug.echoError(ex); + } + } }