diff options
Diffstat (limited to 'paper-server/src/main/java/org')
-rw-r--r-- | paper-server/src/main/java/org/spigotmc/ActivationRange.java | 387 | ||||
-rw-r--r-- | paper-server/src/main/java/org/spigotmc/TrackingRange.java | 9 |
2 files changed, 6 insertions, 390 deletions
diff --git a/paper-server/src/main/java/org/spigotmc/ActivationRange.java b/paper-server/src/main/java/org/spigotmc/ActivationRange.java deleted file mode 100644 index 554d80ddbf..0000000000 --- a/paper-server/src/main/java/org/spigotmc/ActivationRange.java +++ /dev/null @@ -1,387 +0,0 @@ -package org.spigotmc; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerChunkCache; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.ExperienceOrb; -import net.minecraft.world.entity.FlyingMob; -import net.minecraft.world.entity.LightningBolt; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.PathfinderMob; -import net.minecraft.world.entity.ai.Brain; -import net.minecraft.world.entity.ambient.AmbientCreature; -import net.minecraft.world.entity.animal.Animal; -import net.minecraft.world.entity.animal.Bee; -import net.minecraft.world.entity.animal.Sheep; -import net.minecraft.world.entity.animal.WaterAnimal; -import net.minecraft.world.entity.animal.horse.Llama; -import net.minecraft.world.entity.boss.EnderDragonPart; -import net.minecraft.world.entity.boss.enderdragon.EndCrystal; -import net.minecraft.world.entity.boss.enderdragon.EnderDragon; -import net.minecraft.world.entity.boss.wither.WitherBoss; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.item.PrimedTnt; -import net.minecraft.world.entity.monster.Creeper; -import net.minecraft.world.entity.monster.Enemy; -import net.minecraft.world.entity.monster.Pillager; -import net.minecraft.world.entity.npc.Villager; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.AbstractArrow; -import net.minecraft.world.entity.projectile.AbstractHurtingProjectile; -import net.minecraft.world.entity.projectile.EyeOfEnder; -import net.minecraft.world.entity.projectile.FireworkRocketEntity; -import net.minecraft.world.entity.projectile.ThrowableProjectile; -import net.minecraft.world.entity.projectile.ThrownTrident; -import net.minecraft.world.entity.raid.Raider; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.AABB; - -public final class ActivationRange { - - private ActivationRange() { - } - - public enum ActivationType { - WATER, // Paper - FLYING_MONSTER, // Paper - VILLAGER, // Paper - MONSTER, - ANIMAL, - RAIDER, - MISC; - - AABB boundingBox = new AABB(0, 0, 0, 0, 0, 0); - } - // Paper start - - static net.minecraft.world.entity.schedule.Activity[] VILLAGER_PANIC_IMMUNITIES = { - net.minecraft.world.entity.schedule.Activity.HIDE, - net.minecraft.world.entity.schedule.Activity.PRE_RAID, - net.minecraft.world.entity.schedule.Activity.RAID, - net.minecraft.world.entity.schedule.Activity.PANIC - }; - - private static int checkInactiveWakeup(final Entity entity) { - final Level world = entity.level(); - final SpigotWorldConfig config = world.spigotConfig; - final long inactiveFor = MinecraftServer.currentTick - entity.activatedTick; - if (entity.activationType == ActivationType.VILLAGER) { - if (inactiveFor > config.wakeUpInactiveVillagersEvery && world.wakeupInactiveRemainingVillagers > 0) { - world.wakeupInactiveRemainingVillagers--; - return config.wakeUpInactiveVillagersFor; - } - } else if (entity.activationType == ActivationType.ANIMAL) { - if (inactiveFor > config.wakeUpInactiveAnimalsEvery && world.wakeupInactiveRemainingAnimals > 0) { - world.wakeupInactiveRemainingAnimals--; - return config.wakeUpInactiveAnimalsFor; - } - } else if (entity.activationType == ActivationType.FLYING_MONSTER) { - if (inactiveFor > config.wakeUpInactiveFlyingEvery && world.wakeupInactiveRemainingFlying > 0) { - world.wakeupInactiveRemainingFlying--; - return config.wakeUpInactiveFlyingFor; - } - } else if (entity.activationType == ActivationType.MONSTER || entity.activationType == ActivationType.RAIDER) { - if (inactiveFor > config.wakeUpInactiveMonstersEvery && world.wakeupInactiveRemainingMonsters > 0) { - world.wakeupInactiveRemainingMonsters--; - return config.wakeUpInactiveMonstersFor; - } - } - return -1; - } - // Paper end - - static AABB maxBB = new AABB(0, 0, 0, 0, 0, 0); - - /** - * Initializes an entities type on construction to specify what group this - * entity is in for activation ranges. - * - * @param entity - * @return group id - */ - public static ActivationType initializeEntityActivationType(final Entity entity) { - if (entity instanceof WaterAnimal) { - return ActivationType.WATER; - } // Paper - else if (entity instanceof Villager) { - return ActivationType.VILLAGER; - } // Paper - else if (entity instanceof FlyingMob && entity instanceof Enemy) { - return ActivationType.FLYING_MONSTER; - } // Paper - doing & Monster incase Flying no longer includes monster in future - if (entity instanceof Raider) { - return ActivationType.RAIDER; - } else if (entity instanceof Enemy) { // Paper - correct monster check - return ActivationType.MONSTER; - } else if (entity instanceof PathfinderMob || entity instanceof AmbientCreature) { - return ActivationType.ANIMAL; - } else { - return ActivationType.MISC; - } - } - - /** - * These entities are excluded from Activation range checks. - * - * @param entity - * @param config - * @return boolean If it should always tick. - */ - public static boolean initializeEntityActivationState(final Entity entity, final SpigotWorldConfig config) { - return (entity.activationType == ActivationType.MISC && config.miscActivationRange == 0) - || (entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0) - || (entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0) - || (entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0) - || (entity.activationType == ActivationType.VILLAGER && config.villagerActivationRange <= 0) // Paper - || (entity.activationType == ActivationType.WATER && config.waterActivationRange <= 0) // Paper - || (entity.activationType == ActivationType.FLYING_MONSTER && config.flyingMonsterActivationRange <= 0) // Paper - || entity instanceof EyeOfEnder // Paper - || entity instanceof Player - || entity instanceof ThrowableProjectile - || entity instanceof EnderDragon - || entity instanceof EnderDragonPart - || entity instanceof WitherBoss - || entity instanceof AbstractHurtingProjectile - || entity instanceof LightningBolt - || entity instanceof PrimedTnt - || entity instanceof net.minecraft.world.entity.item.FallingBlockEntity // Paper - Always tick falling blocks - || entity instanceof net.minecraft.world.entity.vehicle.AbstractMinecart // Paper - || entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat // Paper - || entity instanceof EndCrystal - || entity instanceof FireworkRocketEntity - || entity instanceof ThrownTrident; - } - - /** - * Find what entities are in range of the players in the world and set - * active if in range. - * - * @param world - */ - public static void activateEntities(final Level world) { - final int miscActivationRange = world.spigotConfig.miscActivationRange; - final int raiderActivationRange = world.spigotConfig.raiderActivationRange; - final int animalActivationRange = world.spigotConfig.animalActivationRange; - final int monsterActivationRange = world.spigotConfig.monsterActivationRange; - // Paper start - final int waterActivationRange = world.spigotConfig.waterActivationRange; - final int flyingActivationRange = world.spigotConfig.flyingMonsterActivationRange; - final int villagerActivationRange = world.spigotConfig.villagerActivationRange; - world.wakeupInactiveRemainingAnimals = Math.min(world.wakeupInactiveRemainingAnimals + 1, world.spigotConfig.wakeUpInactiveAnimals); - world.wakeupInactiveRemainingVillagers = Math.min(world.wakeupInactiveRemainingVillagers + 1, world.spigotConfig.wakeUpInactiveVillagers); - world.wakeupInactiveRemainingMonsters = Math.min(world.wakeupInactiveRemainingMonsters + 1, world.spigotConfig.wakeUpInactiveMonsters); - world.wakeupInactiveRemainingFlying = Math.min(world.wakeupInactiveRemainingFlying + 1, world.spigotConfig.wakeUpInactiveFlying); - final ServerChunkCache chunkProvider = (ServerChunkCache) world.getChunkSource(); - // Paper end - - int maxRange = Math.max(monsterActivationRange, animalActivationRange); - maxRange = Math.max(maxRange, raiderActivationRange); - maxRange = Math.max(maxRange, miscActivationRange); - // Paper start - maxRange = Math.max(maxRange, flyingActivationRange); - maxRange = Math.max(maxRange, waterActivationRange); - maxRange = Math.max(maxRange, villagerActivationRange); - // Paper end - maxRange = Math.min((world.spigotConfig.simulationDistance << 4) - 8, maxRange); - - for (final Player player : world.players()) { - player.activatedTick = MinecraftServer.currentTick; - if (world.spigotConfig.ignoreSpectatorActivation && player.isSpectator()) { - continue; - } - - // Paper start - final int worldHeight = world.getHeight(); - ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, worldHeight, maxRange); - ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, worldHeight, miscActivationRange); - ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate(raiderActivationRange, worldHeight, raiderActivationRange); - ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate(animalActivationRange, worldHeight, animalActivationRange); - ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate(monsterActivationRange, worldHeight, monsterActivationRange); - ActivationType.WATER.boundingBox = player.getBoundingBox().inflate(waterActivationRange, worldHeight, waterActivationRange); - ActivationType.FLYING_MONSTER.boundingBox = player.getBoundingBox().inflate(flyingActivationRange, worldHeight, flyingActivationRange); - ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate(villagerActivationRange, worldHeight, villagerActivationRange); - // Paper end - - // Paper start - final java.util.List<Entity> entities = world.getEntities((Entity) null, ActivationRange.maxBB, null); - final boolean tickMarkers = world.paperConfig().entities.markers.tick; // Paper - Configurable marker ticking - for (final Entity entity : entities) { - // Paper start - Configurable marker ticking - if (!tickMarkers && entity instanceof net.minecraft.world.entity.Marker) { - continue; - } - // Paper end - Configurable marker ticking - ActivationRange.activateEntity(entity); - } - // Paper end - } - } - - /** - * Tries to activate an entity. - * - * @param entity - */ - private static void activateEntity(final Entity entity) { - if (MinecraftServer.currentTick > entity.activatedTick) { - if (entity.defaultActivationState) { - entity.activatedTick = MinecraftServer.currentTick; - return; - } - if (entity.activationType.boundingBox.intersects(entity.getBoundingBox())) { - entity.activatedTick = MinecraftServer.currentTick; - } - } - } - - /** - * If an entity is not in range, do some more checks to see if we should - * give it a shot. - * - * @param entity - * @return - */ - public static int checkEntityImmunities(final Entity entity) { // Paper - return # of ticks to get immunity - // Paper start - final SpigotWorldConfig config = entity.level().spigotConfig; - final int inactiveWakeUpImmunity = checkInactiveWakeup(entity); - if (inactiveWakeUpImmunity > -1) { - return inactiveWakeUpImmunity; - } - if (entity.getRemainingFireTicks() > 0) { - return 2; - } - if (entity.activatedImmunityTick >= MinecraftServer.currentTick) { - return 1; - } - final long inactiveFor = MinecraftServer.currentTick - entity.activatedTick; - // Paper end - // quick checks. - if ((entity.activationType != ActivationType.WATER && entity.isInWater() && entity.isPushedByFluid())) // Paper - { - return 100; // Paper - } - // Paper start - if (!entity.onGround() || entity.getDeltaMovement().horizontalDistanceSqr() > 9.999999747378752E-6D) { - return 100; - } - // Paper end - if (!(entity instanceof final AbstractArrow arrow)) { - if ((!entity.onGround() && !(entity instanceof FlyingMob))) { // Paper - remove passengers logic - return 10; // Paper - } - } else if (!arrow.isInGround()) { - return 1; // Paper - } - // special cases. - if (entity instanceof final LivingEntity living) { - if (living.onClimbable() || living.jumping || living.hurtTime > 0 || !living.activeEffects.isEmpty() || living.isFreezing()) { // Paper - return 1; // Paper - } - if (entity instanceof final Mob mob && mob.getTarget() != null) { // Paper - return 20; // Paper - } - // Paper start - if (entity instanceof final Bee bee) { - final BlockPos movingTarget = bee.getMovingTarget(); - if (bee.isAngry() || - (bee.getHivePos() != null && bee.getHivePos().equals(movingTarget)) || - (bee.getSavedFlowerPos() != null && bee.getSavedFlowerPos().equals(movingTarget)) - ) { - return 20; - } - } - if (entity instanceof final Villager villager) { - final Brain<Villager> behaviorController = villager.getBrain(); - - if (config.villagersActiveForPanic) { - for (final net.minecraft.world.entity.schedule.Activity activity : VILLAGER_PANIC_IMMUNITIES) { - if (behaviorController.isActive(activity)) { - return 20 * 5; - } - } - } - - if (config.villagersWorkImmunityAfter > 0 && inactiveFor >= config.villagersWorkImmunityAfter) { - if (behaviorController.isActive(net.minecraft.world.entity.schedule.Activity.WORK)) { - return config.villagersWorkImmunityFor; - } - } - } - if (entity instanceof final Llama llama && llama.inCaravan()) { - return 1; - } - // Paper end - if (entity instanceof final Animal animal) { - if (animal.isBaby() || animal.isInLove()) { - return 5; // Paper - } - if (entity instanceof final Sheep sheep && sheep.isSheared()) { - return 1; // Paper - } - } - if (entity instanceof final Creeper creeper && creeper.isIgnited()) { // isExplosive - return 20; // Paper - } - // Paper start - if (entity instanceof final Mob mob && mob.targetSelector.hasTasks()) { - return 0; - } - if (entity instanceof final Pillager pillager) { - // TODO:? - } - // Paper end - } - // SPIGOT-6644: Otherwise the target refresh tick will be missed - if (entity instanceof ExperienceOrb) { - return 20; // Paper - } - return -1; // Paper - } - - /** - * Checks if the entity is active for this tick. - * - * @param entity - * @return - */ - public static boolean checkIfActive(final Entity entity) { - // Never safe to skip fireworks or item gravity - if (entity instanceof FireworkRocketEntity || (entity instanceof ItemEntity && (entity.tickCount + entity.getId()) % 4 == 0)) { // Paper - Needed for item gravity, see ItemEntity tick - return true; - } - // Paper start - special case always immunities - // immunize brand new entities, dead entities, and portal scenarios - if (entity.defaultActivationState || entity.tickCount < 20 * 10 || !entity.isAlive() || (entity.portalProcess != null && !entity.portalProcess.hasExpired()) || entity.portalCooldown > 0) { - return true; - } - // immunize leashed entities - if (entity instanceof final Mob mob && mob.getLeashHolder() instanceof Player) { - return true; - } - // Paper end - - boolean isActive = entity.activatedTick >= MinecraftServer.currentTick; - entity.isTemporarilyActive = false; // Paper - - // Should this entity tick? - if (!isActive) { - if ((MinecraftServer.currentTick - entity.activatedTick - 1) % 20 == 0) { - // Check immunities every 20 ticks. - // Paper start - final int immunity = checkEntityImmunities(entity); - if (immunity >= 0) { - entity.activatedTick = MinecraftServer.currentTick + immunity; - } else { - entity.isTemporarilyActive = true; - } - // Paper end - isActive = true; - } - } - // Paper - remove dumb tick skipping for active entities - return isActive; - } -} diff --git a/paper-server/src/main/java/org/spigotmc/TrackingRange.java b/paper-server/src/main/java/org/spigotmc/TrackingRange.java index 039f8abeb5..4835431493 100644 --- a/paper-server/src/main/java/org/spigotmc/TrackingRange.java +++ b/paper-server/src/main/java/org/spigotmc/TrackingRange.java @@ -1,5 +1,6 @@ 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; @@ -25,11 +26,12 @@ public final class TrackingRange { if (defaultRange == 0) { return defaultRange; } + final SpigotWorldConfig config = entity.level().spigotConfig; if (entity instanceof ServerPlayer) { return config.playerTrackingRange; - // Paper start - Simplify and set water mobs to animal tracking range } + switch (entity.activationType) { case RAIDER: case MONSTER: @@ -41,14 +43,15 @@ public final class TrackingRange { return config.animalTrackingRange; case MISC: } + if (entity instanceof ItemFrame || entity instanceof Painting || entity instanceof ItemEntity || entity instanceof ExperienceOrb) { - // Paper end return config.miscTrackingRange; } else if (entity instanceof Display) { return config.displayTrackingRange; } else { if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) { - return ((net.minecraft.server.level.ServerLevel) (entity.getCommandSenderWorld())).getChunkSource().chunkMap.serverViewDistance; // Paper - enderdragon is exempt + // Exempt ender dragon + return ((ServerLevel) entity.getCommandSenderWorld()).getChunkSource().chunkMap.serverViewDistance; } return config.otherTrackingRange; } |