From 365305a580cfd1eab46f36add5019dd852aa2b03 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sat, 23 Mar 2013 10:12:04 +1100 Subject: [PATCH] Entity Tracking Ranges --- .../0040-Entity-Tracking-Ranges.patch | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch diff --git a/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch new file mode 100644 index 0000000000..f85bce6710 --- /dev/null +++ b/CraftBukkit-Patches/0040-Entity-Tracking-Ranges.patch @@ -0,0 +1,138 @@ +From f236d3d8b27a9127905563e20c58ac512268e9dc Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 20 Feb 2013 11:58:47 -0500 +Subject: [PATCH] Entity Tracking Ranges + +This will let you configure how far to track entities in range from players, so that the entity does not render on the client if out of this range. +This has multiple benefits: + +1) Less bandwidth. Not sending update packets for entities that are not even close to a player, or even close enough to clearly see. +2) Less lag by maps in item frames - Default range is 160 blocks... Many players can track that item frame and cause lag and not even see it. +3) Less lag in general - Less work for the server to do +4) Less client lag - Not trying to render distant item frames and paintings and entities will reduce entity count on the client, which is major for shop/town worlds which may use tons of item frames. +--- + .../java/net/minecraft/server/EntityTracker.java | 1 + + .../java/org/bukkit/craftbukkit/CraftWorld.java | 21 +++++++++++++++++ + src/main/java/org/bukkit/craftbukkit/Spigot.java | 26 ++++++++++++++++++++++ + src/main/resources/configurations/bukkit.yml | 5 +++++ + 4 files changed, 53 insertions(+) + +diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java +index 4de1273..0bc3733 100644 +--- a/src/main/java/net/minecraft/server/EntityTracker.java ++++ b/src/main/java/net/minecraft/server/EntityTracker.java +@@ -89,6 +89,7 @@ public class EntityTracker { + } + + public void addEntity(Entity entity, int i, int j, boolean flag) { ++ i = org.bukkit.craftbukkit.Spigot.getEntityTrackingRange(entity, i); // Spigot + if (i > this.d) { + i = this.d; + } +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index 3bfc669..804da57 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -106,6 +106,12 @@ public class CraftWorld implements World { + animalEntityActivationRange = configuration.getInt("world-settings.default.entity-activation-range-animals"); + monsterEntityActivationRange = configuration.getInt("world-settings.default.entity-activation-range-monsters"); + ++ playerTrackingRange = configuration.getInt("world-settings.default.entity-tracking-range-players"); ++ miscTrackingRange = configuration.getInt("world-settings.default.entity-tracking-range-misc"); ++ animalTrackingRange = configuration.getInt("world-settings.default.entity-tracking-range-animals"); ++ monsterTrackingRange = configuration.getInt("world-settings.default.entity-tracking-range-monsters"); ++ maxTrackingRange = configuration.getInt("world-settings.default.entity-tracking-range-max"); ++ + //override defaults with world specific, if they exist + growthPerTick = configuration.getInt("world-settings." + name + ".growth-chunks-per-tick", growthPerTick); + itemMergeRadius = configuration.getDouble("world-settings." + name + ".item-merge-radius", itemMergeRadius); +@@ -133,6 +139,14 @@ public class CraftWorld implements World { + animalEntityActivationRange = configuration.getInt("world-settings." + name + ".entity-activation-range-animals", animalEntityActivationRange); + monsterEntityActivationRange = configuration.getInt("world-settings." + name + ".entity-activation-range-monsters", monsterEntityActivationRange); + ++ maxTrackingRange = configuration.getInt("world-settings." + name + ".entity-tracking-range-max", maxTrackingRange); ++ playerTrackingRange = Math.min(maxTrackingRange, configuration.getInt("world-settings." + name + ".entity-tracking-range-players", playerTrackingRange)); ++ miscTrackingRange = Math.min(maxTrackingRange, configuration.getInt("world-settings." + name + ".entity-tracking-range-misc", miscTrackingRange)); ++ animalTrackingRange = Math.min(maxTrackingRange, configuration.getInt("world-settings." + name + ".entity-tracking-range-animals", animalTrackingRange)); ++ monsterTrackingRange = Math.min(maxTrackingRange, configuration.getInt("world-settings." + name + ".entity-tracking-range-monsters", monsterTrackingRange)); ++ if (maxTrackingRange == 0) { ++ System.err.println("Error! Should not have 0 maxRange"); ++ } + server.getLogger().info("-------------- Spigot ----------------"); + server.getLogger().info("-------- World Settings For [" + name + "] --------"); + server.getLogger().info("Growth Per Chunk: " + growthPerTick); +@@ -149,6 +163,7 @@ public class CraftWorld implements World { + server.getLogger().info("View distance: " + viewDistance); + server.getLogger().info("Oreobfuscator: " + obfuscated); + server.getLogger().info("Entity Activation Range: An " + animalEntityActivationRange + " / Mo " + monsterEntityActivationRange + " / Mi " + miscEntityActivationRange); ++ server.getLogger().info("Entity Tracking Range: Pl " + playerTrackingRange + " / An " + animalTrackingRange + " / Mo " + monsterTrackingRange + " / Mi " + miscTrackingRange + " / Max " + maxTrackingRange); + server.getLogger().info("-------------------------------------------------"); + // Spigot end + } +@@ -173,6 +188,12 @@ public class CraftWorld implements World { + public int miscEntityActivationRange = 16; + public int animalEntityActivationRange = 32; + public int monsterEntityActivationRange = 32; ++ ++ public int playerTrackingRange = 64; ++ public int miscTrackingRange = 32; ++ public int animalTrackingRange = 48; ++ public int monsterTrackingRange = 48; ++ public int maxTrackingRange = 64; + // Spigot end + + public Block getBlockAt(int x, int y, int z) { +diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java +index 4b355c9..f3e9e79 100644 +--- a/src/main/java/org/bukkit/craftbukkit/Spigot.java ++++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java +@@ -338,4 +338,30 @@ public class Spigot { + ex.printStackTrace(); + } + } ++ ++ /** ++ * Gets the range an entity should be 'tracked' by players and visible in the client. ++ * @param entity ++ * @param defaultRange Default range defined by Mojang ++ * @return ++ */ ++ public static int getEntityTrackingRange(Entity entity, int defaultRange) { ++ CraftWorld world = entity.world.getWorld(); ++ int range = defaultRange; ++ if (entity instanceof EntityPlayer) { ++ range = world.playerTrackingRange; ++ } else if (entity.defaultActivationState || entity instanceof EntityGhast) { ++ range = defaultRange; ++ } else if (entity.activationType == 1) { ++ range = world.monsterEntityActivationRange; ++ } else if (entity.activationType == 2) { ++ range = world.animalTrackingRange; ++ } else if (entity instanceof EntityItemFrame || entity instanceof EntityPainting || entity instanceof EntityItem || entity instanceof EntityExperienceOrb) { ++ range = world.miscTrackingRange; ++ } ++ if (range == 0) { ++ return defaultRange; ++ } ++ return Math.min(world.maxTrackingRange, range); ++ } + } +diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml +index 472b36b..de93708 100644 +--- a/src/main/resources/configurations/bukkit.yml ++++ b/src/main/resources/configurations/bukkit.yml +@@ -53,6 +53,11 @@ world-settings: + entity-activation-range-animals: 32 + entity-activation-range-monsters: 32 + entity-activation-range-misc: 16 ++ entity-tracking-range-players: 48 ++ entity-tracking-range-animals: 48 ++ entity-tracking-range-monsters: 48 ++ entity-tracking-range-misc: 32 ++ entity-tracking-range-max: 64 + world: + growth-chunks-per-tick: 1000 + world_nether: +-- +1.8.1-rc2 +