diff --git a/EntityTrackerFixer/config.yml b/EntityTrackerFixer/config.yml index 5e89b1c..5180700 100644 --- a/EntityTrackerFixer/config.yml +++ b/EntityTrackerFixer/config.yml @@ -9,7 +9,7 @@ log-to-console: true #disable tick for untracked entities (experimental, use at your own risk) -disable-tick-for-untracked-entities: false +disable-tick-for-untracked-entities: true #How many ticks between untrack process #The untrack process will check for untracked entities by players but still by the server, and untrack them. diff --git a/EntityTrackerFixer/plugin.yml b/EntityTrackerFixer/plugin.yml index cabf5e5..fb347bd 100644 --- a/EntityTrackerFixer/plugin.yml +++ b/EntityTrackerFixer/plugin.yml @@ -1,7 +1,7 @@ name: EntityTrackerFixer main: net.minemora.entitytrackerfixer.EntityTrackerFixer -version: 1.2.3 -api-version: 1.14 +version: 1.2.4 +api-version: 1.16 author: Esmorall description: Untrack entities that are not used at all by the server. commands: \ No newline at end of file diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/EntityTrackerFixer.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/EntityTrackerFixer.java index 48b0cb4..4e72fb6 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/EntityTrackerFixer.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/EntityTrackerFixer.java @@ -15,9 +15,6 @@ public class EntityTrackerFixer extends JavaPlugin { plugin = this; ConfigMain.getInstance().setup(this); NMS nms = NMSCheck.getNMS(this); - if(ConfigMain.isDisableTickUntracked()) { - nms.loadWorldCache(); - } nms.startTasks(this); } } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/config/ConfigMain.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/config/ConfigMain.java index 07041d5..78a3aa7 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/config/ConfigMain.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/config/ConfigMain.java @@ -29,7 +29,7 @@ public final class ConfigMain extends Config { minTps = getConfig().getDouble("tps-limit", 18.5); worlds = getConfig().getStringList("worlds"); logToConsole = getConfig().getBoolean("log-to-console", true); - disableTickUntracked = getConfig().getBoolean("disable-tick-for-untracked-entities", false); + disableTickUntracked = getConfig().getBoolean("disable-tick-for-untracked-entities", true); } public static FileConfiguration get() { diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/nms/NMS.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/nms/NMS.java index a33f59d..9a54ef4 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/nms/NMS.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/nms/NMS.java @@ -5,7 +5,4 @@ import org.bukkit.plugin.Plugin; public interface NMS { public void startTasks(Plugin plugin); - - public void loadWorldCache(); - } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java index 31d45a7..7d94f21 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/NMSHandler.java @@ -1,13 +1,9 @@ package net.minemora.entitytrackerfixer.v1_14_R1; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.plugin.Plugin; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.nms.NMS; -import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager; -import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickWorldCache; import net.minemora.entitytrackerfixer.v1_14_R1.tasks.CheckTask; import net.minemora.entitytrackerfixer.v1_14_R1.tasks.UntrackerTask; @@ -19,15 +15,4 @@ public class NMSHandler implements NMS { new CheckTask().runTaskTimer(plugin, ConfigMain.getUntrackTicks() + 1, ConfigMain.getCheckFrequency()); } - @Override - public void loadWorldCache() { - for(String worldName : ConfigMain.getWorlds()) { - if(Bukkit.getWorld(worldName) == null) { - continue; - } - EntityTickManager.getInstance().getCache().put(worldName, - new EntityTickWorldCache(((CraftWorld)Bukkit.getWorld(worldName)).getHandle())); - } - } - } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java deleted file mode 100644 index 674deb3..0000000 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickManager.java +++ /dev/null @@ -1,105 +0,0 @@ -package net.minemora.entitytrackerfixer.v1_14_R1.entityTick; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; - -import net.minecraft.server.v1_14_R1.WorldServer; -import net.minemora.entitytrackerfixer.EntityTrackerFixer; -import net.minemora.entitytrackerfixer.util.ReflectionUtils; -import net.minemora.entitytrackerfixer.v1_14_R1.tasks.UntrackerTask; - -public class EntityTickManager extends BukkitRunnable { - - private static Field tickingEntitiesField; - private static Field entityCount; - - static { - try { - tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities"); - entityCount = ReflectionUtils.getClassPrivateField(net.minecraft.server.v1_14_R1.Entity.class, "entityCount"); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - private static EntityTickManager instance; - - private Map cache = new HashMap<>(); - - private EntityTickManager(Plugin plugin) { - this.runTaskTimer(plugin, 61, 61); - } - - public void disableTicking(int id, String worldName) { - cache.get(worldName).getToTick().remove(id); - cache.get(worldName).getToUntick().add(id); - } - - public void enableTicking(net.minecraft.server.v1_14_R1.Entity entity, String worldName) { - cache.get(worldName).getToUntick().remove(entity.getId()); - cache.get(worldName).getToTick().put(entity.getId(), entity); - } - - @Override - public void run() { - if(UntrackerTask.isRunning()) { - return; - } - for(String worldName : cache.keySet()) { - EntityTickWorldCache ewc = cache.get(worldName); - WorldServer ws = ewc.getWorldServer(); - if(ws.b()) { - continue; - } - try { - if(tickingEntitiesField.getBoolean(ws)) { - continue; - } - //System.out.println("unticking: " + ewc.getToUntick().size() + " entities, ticking again: " + ewc.getToTick().size() + " entities"); - for(int i : ewc.getToUntick()) { - ws.entitiesById.remove(i); - } - ewc.getToUntick().clear(); - for(int i : ewc.getToTick().keySet()) { - net.minecraft.server.v1_14_R1.Entity entity = ewc.getToTick().get(i); - if(entity == null) { - continue; - } - if(!entity.valid) { - continue; - } - if(ws.entitiesById.containsValue(entity)) { - continue; - } - if(ws.entitiesById.containsKey(i)) { - int id = ((AtomicInteger)entityCount.get(null)).incrementAndGet(); - ws.entitiesById.put(id, entity); - } - else { - ws.entitiesById.put(i, entity); - } - } - ewc.getToTick().clear(); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - } - - public static EntityTickManager getInstance() { - if(instance == null) { - instance = new EntityTickManager(EntityTrackerFixer.plugin); - } - return instance; - } - - public Map getCache() { - return cache; - } - -} diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java deleted file mode 100644 index c097cf5..0000000 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/entityTick/EntityTickWorldCache.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.minemora.entitytrackerfixer.v1_14_R1.entityTick; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import net.minecraft.server.v1_14_R1.WorldServer; - -public class EntityTickWorldCache { - - private String worldName; - private WorldServer worldServer; - - private Set toUntick = new HashSet<>(); - private Map toTick = new HashMap<>(); - - public EntityTickWorldCache(WorldServer worldServer) { - this.worldName = worldServer.getWorld().getName(); - this.worldServer = worldServer; - } - - public Set getToUntick() { - return toUntick; - } - - public Map getToTick() { - return toTick; - } - - public String getWorldName() { - return worldName; - } - - public WorldServer getWorldServer() { - return worldServer; - } -} diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/CheckTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/CheckTask.java index 03874d0..4671212 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/CheckTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/CheckTask.java @@ -14,7 +14,6 @@ import net.minecraft.server.v1_14_R1.ChunkProviderServer; import net.minecraft.server.v1_14_R1.WorldServer; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.v1_14_R1.NMSEntityTracker; -import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager; public class CheckTask extends BukkitRunnable { @@ -41,9 +40,6 @@ public class CheckTask extends BukkitRunnable { for(Player player : Bukkit.getWorld(worldName).getPlayers()) { for(Entity ent : player.getNearbyEntities(d, d, d)) { trackAgain.add(((CraftEntity)ent).getHandle()); - if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().enableTicking(((CraftEntity)ent).getHandle(), worldName); - } } } NMSEntityTracker.trackEntities(cps, trackAgain); diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/UntrackerTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/UntrackerTask.java index 8c9f6e9..2e8825b 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/UntrackerTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_14_R1/tasks/UntrackerTask.java @@ -18,7 +18,6 @@ import net.minecraft.server.v1_14_R1.EntityEnderDragon; import net.minemora.entitytrackerfixer.EntityTrackerFixer; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.util.ReflectionUtils; -import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager; public class UntrackerTask extends BukkitRunnable { @@ -94,9 +93,6 @@ public class UntrackerTask extends BukkitRunnable { for(int id : toRemove) { cps.playerChunkMap.trackedEntities.remove(id); - if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().disableTicking(id, worldName); - } } /* diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java index f6332ef..ac9c6a3 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/NMSHandler.java @@ -6,8 +6,6 @@ import org.bukkit.plugin.Plugin; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.nms.NMS; -import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickManager; -import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickWorldCache; import net.minemora.entitytrackerfixer.v1_15_R1.tasks.CheckTask; import net.minemora.entitytrackerfixer.v1_15_R1.tasks.UntrackerTask; @@ -19,15 +17,4 @@ public class NMSHandler implements NMS { new CheckTask().runTaskTimer(plugin, ConfigMain.getUntrackTicks() + 1, ConfigMain.getCheckFrequency()); } - @Override - public void loadWorldCache() { - for(String worldName : ConfigMain.getWorlds()) { - if(Bukkit.getWorld(worldName) == null) { - continue; - } - EntityTickManager.getInstance().getCache().put(worldName, - new EntityTickWorldCache(((CraftWorld)Bukkit.getWorld(worldName)).getHandle())); - } - } - } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java deleted file mode 100644 index 8437984..0000000 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickManager.java +++ /dev/null @@ -1,105 +0,0 @@ -package net.minemora.entitytrackerfixer.v1_15_R1.entityTick; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; - -import net.minecraft.server.v1_15_R1.WorldServer; -import net.minemora.entitytrackerfixer.EntityTrackerFixer; -import net.minemora.entitytrackerfixer.util.ReflectionUtils; -import net.minemora.entitytrackerfixer.v1_15_R1.tasks.UntrackerTask; - -public class EntityTickManager extends BukkitRunnable { - - private static Field tickingEntitiesField; - private static Field entityCount; - - static { - try { - tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities"); - entityCount = ReflectionUtils.getClassPrivateField(net.minecraft.server.v1_15_R1.Entity.class, "entityCount"); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - private static EntityTickManager instance; - - private Map cache = new HashMap<>(); - - private EntityTickManager(Plugin plugin) { - this.runTaskTimer(plugin, 61, 61); - } - - public void disableTicking(int id, String worldName) { - cache.get(worldName).getToTick().remove(id); - cache.get(worldName).getToUntick().add(id); - } - - public void enableTicking(net.minecraft.server.v1_15_R1.Entity entity, String worldName) { - cache.get(worldName).getToUntick().remove(entity.getId()); - cache.get(worldName).getToTick().put(entity.getId(), entity); - } - - @Override - public void run() { - if(UntrackerTask.isRunning()) { - return; - } - for(String worldName : cache.keySet()) { - EntityTickWorldCache ewc = cache.get(worldName); - WorldServer ws = ewc.getWorldServer(); - if(ws.b()) { - continue; - } - try { - if(tickingEntitiesField.getBoolean(ws)) { - continue; - } - //System.out.println("unticking: " + ewc.getToUntick().size() + " entities, ticking again: " + ewc.getToTick().size() + " entities"); - for(int i : ewc.getToUntick()) { - ws.entitiesById.remove(i); - } - ewc.getToUntick().clear(); - for(int i : ewc.getToTick().keySet()) { - net.minecraft.server.v1_15_R1.Entity entity = ewc.getToTick().get(i); - if(entity == null) { - continue; - } - if(!entity.valid) { - continue; - } - if(ws.entitiesById.containsValue(entity)) { - continue; - } - if(ws.entitiesById.containsKey(i)) { - int id = ((AtomicInteger)entityCount.get(null)).incrementAndGet(); - ws.entitiesById.put(id, entity); - } - else { - ws.entitiesById.put(i, entity); - } - } - ewc.getToTick().clear(); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - } - - public static EntityTickManager getInstance() { - if(instance == null) { - instance = new EntityTickManager(EntityTrackerFixer.plugin); - } - return instance; - } - - public Map getCache() { - return cache; - } - -} diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java deleted file mode 100644 index 7fd4880..0000000 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/entityTick/EntityTickWorldCache.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.minemora.entitytrackerfixer.v1_15_R1.entityTick; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import net.minecraft.server.v1_15_R1.WorldServer; - -public class EntityTickWorldCache { - - private String worldName; - private WorldServer worldServer; - - private Set toUntick = new HashSet<>(); - private Map toTick = new HashMap<>(); - - public EntityTickWorldCache(WorldServer worldServer) { - this.worldName = worldServer.getWorld().getName(); - this.worldServer = worldServer; - } - - public Set getToUntick() { - return toUntick; - } - - public Map getToTick() { - return toTick; - } - - public String getWorldName() { - return worldName; - } - - public WorldServer getWorldServer() { - return worldServer; - } -} diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/CheckTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/CheckTask.java index 73d5ff6..b50cc40 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/CheckTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/CheckTask.java @@ -14,7 +14,6 @@ import net.minecraft.server.v1_15_R1.ChunkProviderServer; import net.minecraft.server.v1_15_R1.WorldServer; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.v1_15_R1.NMSEntityTracker; -import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickManager; public class CheckTask extends BukkitRunnable { @@ -41,9 +40,6 @@ public class CheckTask extends BukkitRunnable { for(Player player : Bukkit.getWorld(worldName).getPlayers()) { for(Entity ent : player.getNearbyEntities(d, d, d)) { trackAgain.add(((CraftEntity)ent).getHandle()); - if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().enableTicking(((CraftEntity)ent).getHandle(), worldName); - } } } NMSEntityTracker.trackEntities(cps, trackAgain); diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/UntrackerTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/UntrackerTask.java index b479d3f..7bb543f 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/UntrackerTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_15_R1/tasks/UntrackerTask.java @@ -18,7 +18,6 @@ import net.minecraft.server.v1_15_R1.PlayerChunkMap.EntityTracker; import net.minemora.entitytrackerfixer.EntityTrackerFixer; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.util.ReflectionUtils; -import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickManager; public class UntrackerTask extends BukkitRunnable { @@ -92,9 +91,6 @@ public class UntrackerTask extends BukkitRunnable { for(int id : toRemove) { cps.playerChunkMap.trackedEntities.remove(id); - if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().disableTicking(id, worldName); - } } if(ConfigMain.isLogToConsole()) { diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSEntityTracker.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSEntityTracker.java index 3ac893b..098f752 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSEntityTracker.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSEntityTracker.java @@ -29,9 +29,6 @@ public final class NMSEntityTracker { public static void trackEntities(ChunkProviderServer cps, Set trackList) { try { for(net.minecraft.server.v1_16_R1.Entity entity : trackList) { - if(cps.playerChunkMap.trackedEntities.containsKey(entity.getId())) { - continue; - } addEntityMethod.invoke(cps.playerChunkMap, entity); } } catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSHandler.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSHandler.java index 0dad050..9550d05 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSHandler.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/NMSHandler.java @@ -1,13 +1,9 @@ package net.minemora.entitytrackerfixer.v1_16_R1; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; import org.bukkit.plugin.Plugin; import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.nms.NMS; -import net.minemora.entitytrackerfixer.v1_16_R1.entityTick.EntityTickManager; -import net.minemora.entitytrackerfixer.v1_16_R1.entityTick.EntityTickWorldCache; import net.minemora.entitytrackerfixer.v1_16_R1.tasks.CheckTask; import net.minemora.entitytrackerfixer.v1_16_R1.tasks.UntrackerTask; @@ -18,16 +14,4 @@ public class NMSHandler implements NMS { new UntrackerTask().runTaskTimer(plugin, ConfigMain.getUntrackTicks(), ConfigMain.getUntrackTicks()); new CheckTask().runTaskTimer(plugin, ConfigMain.getUntrackTicks() + 1, ConfigMain.getCheckFrequency()); } - - @Override - public void loadWorldCache() { - for(String worldName : ConfigMain.getWorlds()) { - if(Bukkit.getWorld(worldName) == null) { - continue; - } - EntityTickManager.getInstance().getCache().put(worldName, - new EntityTickWorldCache(((CraftWorld)Bukkit.getWorld(worldName)).getHandle())); - } - } - } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickManager.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickManager.java index 827abe9..8b30b8c 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickManager.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickManager.java @@ -1,105 +1,51 @@ package net.minemora.entitytrackerfixer.v1_16_R1.entityTick; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.Set; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; +import net.minecraft.server.v1_16_R1.EntityInsentient; +import net.minecraft.server.v1_16_R1.MinecraftServer; -import net.minecraft.server.v1_16_R1.WorldServer; -import net.minemora.entitytrackerfixer.EntityTrackerFixer; -import net.minemora.entitytrackerfixer.util.ReflectionUtils; -import net.minemora.entitytrackerfixer.v1_16_R1.tasks.UntrackerTask; - -public class EntityTickManager extends BukkitRunnable { - - private static Field tickingEntitiesField; - private static Field entityCount; - - static { - try { - tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities"); - entityCount = ReflectionUtils.getClassPrivateField(net.minecraft.server.v1_16_R1.Entity.class, "entityCount"); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } +public class EntityTickManager { private static EntityTickManager instance; - private Map cache = new HashMap<>(); - - private EntityTickManager(Plugin plugin) { - this.runTaskTimer(plugin, 61, 61); - } + private EntityTickManager() {} - public void disableTicking(int id, String worldName) { - cache.get(worldName).getToTick().remove(id); - cache.get(worldName).getToUntick().add(id); - } - - public void enableTicking(net.minecraft.server.v1_16_R1.Entity entity, String worldName) { - cache.get(worldName).getToUntick().remove(entity.getId()); - cache.get(worldName).getToTick().put(entity.getId(), entity); - } - - @Override - public void run() { - if(UntrackerTask.isRunning()) { + public void disableTicking(net.minecraft.server.v1_16_R1.Entity entity) { + if(entity == null) { return; } - for(String worldName : cache.keySet()) { - EntityTickWorldCache ewc = cache.get(worldName); - WorldServer ws = ewc.getWorldServer(); - if(ws.m_()) { - continue; - } - try { - if(tickingEntitiesField.getBoolean(ws)) { - continue; - } - //System.out.println("unticking: " + ewc.getToUntick().size() + " entities, ticking again: " + ewc.getToTick().size() + " entities"); - for(int i : ewc.getToUntick()) { - ws.entitiesById.remove(i); - } - ewc.getToUntick().clear(); - for(int i : ewc.getToTick().keySet()) { - net.minecraft.server.v1_16_R1.Entity entity = ewc.getToTick().get(i); - if(entity == null) { - continue; - } - if(!entity.valid) { - continue; - } - if(ws.entitiesById.containsValue(entity)) { - continue; - } - if(ws.entitiesById.containsKey(i)) { - int id = ((AtomicInteger)entityCount.get(null)).incrementAndGet(); - ws.entitiesById.put(id, entity); - } - else { - ws.entitiesById.put(i, entity); - } - } - ewc.getToTick().clear(); - } catch (IllegalArgumentException | IllegalAccessException e) { - e.printStackTrace(); - } - } - } + if(!entity.valid) { + return; + } + entity.activatedTick = -2147483648L; + if(entity instanceof EntityInsentient) { + //System.out.println("disable tick for insentient entity currently aware is = " + ((EntityInsentient)entity).aware + " should be true"); + ((EntityInsentient)entity).aware = false; + } + } + + public void enableTicking(Set entities) { + for(net.minecraft.server.v1_16_R1.Entity entity : entities) { + if(entity == null) { + continue; + } + if(!entity.valid) { + continue; + } + entity.activatedTick = MinecraftServer.currentTick; + if(entity instanceof EntityInsentient) { + //System.out.println("enabling tick for insentient entity currently aware is = " + ((EntityInsentient)entity).aware + " should be false"); + ((EntityInsentient)entity).aware = true; + } + } + } public static EntityTickManager getInstance() { if(instance == null) { - instance = new EntityTickManager(EntityTrackerFixer.plugin); + instance = new EntityTickManager(); } return instance; } - - public Map getCache() { - return cache; - } } diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickWorldCache.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickWorldCache.java deleted file mode 100644 index 61cef5c..0000000 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/entityTick/EntityTickWorldCache.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.minemora.entitytrackerfixer.v1_16_R1.entityTick; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import net.minecraft.server.v1_16_R1.WorldServer; - -public class EntityTickWorldCache { - - private String worldName; - private WorldServer worldServer; - - private Set toUntick = new HashSet<>(); - private Map toTick = new HashMap<>(); - - public EntityTickWorldCache(WorldServer worldServer) { - this.worldName = worldServer.getWorld().getName(); - this.worldServer = worldServer; - } - - public Set getToUntick() { - return toUntick; - } - - public Map getToTick() { - return toTick; - } - - public String getWorldName() { - return worldName; - } - - public WorldServer getWorldServer() { - return worldServer; - } -} diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/CheckTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/CheckTask.java index 865a99e..e3e6d14 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/CheckTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/CheckTask.java @@ -40,13 +40,17 @@ public class CheckTask extends BukkitRunnable { int d = ConfigMain.getTrackingRange(); for(Player player : Bukkit.getWorld(worldName).getPlayers()) { for(Entity ent : player.getNearbyEntities(d, d, d)) { - trackAgain.add(((CraftEntity)ent).getHandle()); - if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().enableTicking(((CraftEntity)ent).getHandle(), worldName); + net.minecraft.server.v1_16_R1.Entity nms = ((CraftEntity)ent).getHandle(); + if(cps.playerChunkMap.trackedEntities.containsKey(nms.getId())) { + continue; } + trackAgain.add(nms); } } NMSEntityTracker.trackEntities(cps, trackAgain); + if(ConfigMain.isDisableTickUntracked()) { + EntityTickManager.getInstance().enableTicking(trackAgain); + } } } \ No newline at end of file diff --git a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/UntrackerTask.java b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/UntrackerTask.java index 7572768..659afac 100644 --- a/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/UntrackerTask.java +++ b/EntityTrackerFixer/src/net/minemora/entitytrackerfixer/v1_16_R1/tasks/UntrackerTask.java @@ -94,7 +94,7 @@ public class UntrackerTask extends BukkitRunnable { for(int id : toRemove) { cps.playerChunkMap.trackedEntities.remove(id); if(ConfigMain.isDisableTickUntracked()) { - EntityTickManager.getInstance().disableTicking(id, worldName); + EntityTickManager.getInstance().disableTicking(ws.entitiesById.get(id)); } }