Skip to content

Commit

Permalink
EntityTag.tracking_range
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Feb 21, 2022
1 parent c4e5136 commit 4e54a58
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 0 deletions.
Expand Up @@ -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();
}
}
Expand Up @@ -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);
}
Expand Down
Expand Up @@ -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);
}
}
}
Expand Up @@ -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);
}
}
}

0 comments on commit 4e54a58

Please sign in to comment.