63 lines
2.3 KiB
Java
63 lines
2.3 KiB
Java
package org.spigotmc;
|
|
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.server.level.ServerPlayer;
|
|
import net.minecraft.world.entity.Display;
|
|
import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.entity.ExperienceOrb;
|
|
import net.minecraft.world.entity.decoration.ItemFrame;
|
|
import net.minecraft.world.entity.decoration.Painting;
|
|
import net.minecraft.world.entity.item.ItemEntity;
|
|
|
|
public final class TrackingRange {
|
|
|
|
private TrackingRange() {
|
|
}
|
|
|
|
/**
|
|
* Gets the range an entity should be 'tracked' by players and visible in
|
|
* the client.
|
|
*
|
|
* @param defaultRange Default range defined by Mojang
|
|
*/
|
|
public static int getEntityTrackingRange(final Entity entity, final int defaultRange) {
|
|
if (defaultRange == 0) {
|
|
return defaultRange;
|
|
}
|
|
|
|
final SpigotWorldConfig config = entity.level().spigotConfig;
|
|
if (entity instanceof ServerPlayer) {
|
|
return config.playerTrackingRange;
|
|
}
|
|
|
|
switch (entity.activationType) {
|
|
case RAIDER:
|
|
case MONSTER:
|
|
case FLYING_MONSTER:
|
|
return config.monsterTrackingRange;
|
|
case WATER:
|
|
case VILLAGER:
|
|
case ANIMAL:
|
|
return config.animalTrackingRange;
|
|
case MISC:
|
|
}
|
|
|
|
if (entity instanceof ItemFrame || entity instanceof Painting || entity instanceof ItemEntity || entity instanceof ExperienceOrb) {
|
|
return config.miscTrackingRange;
|
|
} else if (entity instanceof Display) {
|
|
// Delta start - optional Display range budget (paper-global.yml -> delta)
|
|
// Display entities have no physics, collision or gameplay meaning, so trimming
|
|
// their tracking range is safe: the client stops seeing them, server state
|
|
// stays correct. Off by default so stock Paper behaviour is unchanged.
|
|
return me.sashegdev.delta.DeltaTracking.clampDisplayRange(config.displayTrackingRange);
|
|
// Delta end
|
|
} else {
|
|
if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) {
|
|
// Exempt ender dragon
|
|
return ((ServerLevel) entity.level()).getChunkSource().chunkMap.serverViewDistance;
|
|
}
|
|
return config.otherTrackingRange;
|
|
}
|
|
}
|
|
}
|