Making compatibility with Minecraft 1.15
This commit is contained in:
parent
0ff91139e7
commit
8c08bcd81f
|
@ -1,6 +1,6 @@
|
|||
name: EntityTrackerFixer
|
||||
main: net.minemora.entitytrackerfixer.EntityTrackerFixer
|
||||
version: 1.2.0
|
||||
version: 1.2.1
|
||||
api-version: 1.14
|
||||
author: Esmorall
|
||||
commands:
|
||||
|
|
|
@ -1,11 +1,10 @@
|
|||
package net.minemora.entitytrackerfixer;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import net.minemora.entitytrackerfixer.config.ConfigMain;
|
||||
import net.minemora.entitytrackerfixer.entitytick.EntityTickManager;
|
||||
import net.minemora.entitytrackerfixer.entitytick.EntityTickWorldCache;
|
||||
import net.minemora.entitytrackerfixer.nms.NMS;
|
||||
import net.minemora.entitytrackerfixer.nms.NMSCheck;
|
||||
|
||||
public class EntityTrackerFixer extends JavaPlugin {
|
||||
|
||||
|
@ -15,15 +14,10 @@ public class EntityTrackerFixer extends JavaPlugin {
|
|||
public void onEnable() {
|
||||
plugin = this;
|
||||
ConfigMain.getInstance().setup(this);
|
||||
NMS nms = NMSCheck.getNMS(this);
|
||||
if(ConfigMain.isDisableTickUntracked()) {
|
||||
for(String worldName : ConfigMain.getWorlds()) {
|
||||
if(Bukkit.getWorld(worldName) == null) {
|
||||
continue;
|
||||
}
|
||||
EntityTickManager.getInstance().getCache().put(worldName, new EntityTickWorldCache(worldName));
|
||||
}
|
||||
nms.loadWorldCache();
|
||||
}
|
||||
new UntrackerTask().runTaskTimer(this, ConfigMain.getUntrackTicks(), ConfigMain.getUntrackTicks());
|
||||
new CheckTask().runTaskTimer(this, ConfigMain.getUntrackTicks() + 1, ConfigMain.getCheckFrequency());
|
||||
nms.startTasks(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
package net.minemora.entitytrackerfixer.nms;
|
||||
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public interface NMS {
|
||||
|
||||
public void startTasks(Plugin plugin);
|
||||
|
||||
public void loadWorldCache();
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package net.minemora.entitytrackerfixer.nms;
|
||||
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public final class NMSCheck {
|
||||
|
||||
private NMSCheck() {}
|
||||
|
||||
public static NMS getNMS(Plugin plugin) {
|
||||
String packageName = plugin.getServer().getClass().getPackage().getName();
|
||||
String version = packageName.substring(packageName.lastIndexOf('.') + 1);
|
||||
|
||||
try {
|
||||
final Class<?> clazz = Class.forName("net.minemora.entitytrackerfixer." + version + ".NMSHandler");
|
||||
if (NMS.class.isAssignableFrom(clazz)) {
|
||||
return (NMS) clazz.getConstructor().newInstance();
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
plugin.getLogger().severe("Could not find support for this Spigot version.");
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
package net.minemora.entitytrackerfixer.util;
|
||||
|
||||
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||
|
||||
public final class Util {
|
||||
|
||||
private Util() {}
|
||||
|
||||
public static boolean isChunkLoaded(WorldServer ws, int x, int z) {
|
||||
net.minecraft.server.v1_14_R1.Chunk chunk = ws.getChunkProvider().getChunkAt(x, z, false);
|
||||
return chunk != null;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package net.minemora.entitytrackerfixer;
|
||||
package net.minemora.entitytrackerfixer.v1_14_R1;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
|
@ -0,0 +1,31 @@
|
|||
package net.minemora.entitytrackerfixer.v1_14_R1;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
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;
|
||||
|
||||
public class NMSHandler implements NMS {
|
||||
|
||||
@Override
|
||||
public void startTasks(Plugin plugin) {
|
||||
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(worldName));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package net.minemora.entitytrackerfixer.entitytick;
|
||||
package net.minemora.entitytrackerfixer.v1_14_R1.entityTick;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
|
@ -11,8 +11,8 @@ import org.bukkit.Bukkit;
|
|||
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
|
||||
|
||||
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||
import net.minemora.entitytrackerfixer.UntrackerTask;
|
||||
import net.minemora.entitytrackerfixer.util.ReflectionUtils;
|
||||
import net.minemora.entitytrackerfixer.v1_14_R1.tasks.UntrackerTask;
|
||||
|
||||
public class EntityTickManager extends TimerTask {
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package net.minemora.entitytrackerfixer.entitytick;
|
||||
package net.minemora.entitytrackerfixer.v1_14_R1.entityTick;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
|
@ -1,4 +1,4 @@
|
|||
package net.minemora.entitytrackerfixer;
|
||||
package net.minemora.entitytrackerfixer.v1_14_R1.tasks;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
@ -13,7 +13,8 @@ import org.bukkit.scheduler.BukkitRunnable;
|
|||
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.entitytick.EntityTickManager;
|
||||
import net.minemora.entitytrackerfixer.v1_14_R1.NMSEntityTracker;
|
||||
import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager;
|
||||
|
||||
public class CheckTask extends BukkitRunnable {
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package net.minemora.entitytrackerfixer;
|
||||
package net.minemora.entitytrackerfixer.v1_14_R1.tasks;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashSet;
|
||||
|
@ -13,9 +13,10 @@ import net.minecraft.server.v1_14_R1.EntityPlayer;
|
|||
import net.minecraft.server.v1_14_R1.MinecraftServer;
|
||||
import net.minecraft.server.v1_14_R1.WorldServer;
|
||||
import net.minecraft.server.v1_14_R1.PlayerChunkMap.EntityTracker;
|
||||
import net.minemora.entitytrackerfixer.EntityTrackerFixer;
|
||||
import net.minemora.entitytrackerfixer.config.ConfigMain;
|
||||
import net.minemora.entitytrackerfixer.entitytick.EntityTickManager;
|
||||
import net.minemora.entitytrackerfixer.util.ReflectionUtils;
|
||||
import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager;
|
||||
|
||||
public class UntrackerTask extends BukkitRunnable {
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Set;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.ChunkProviderServer;
|
||||
import net.minecraft.server.v1_15_R1.PlayerChunkMap;
|
||||
import net.minemora.entitytrackerfixer.util.ReflectionUtils;
|
||||
|
||||
public final class NMSEntityTracker {
|
||||
|
||||
private static Method addEntityMethod;
|
||||
private static Method removeEntityMethod;
|
||||
|
||||
static {
|
||||
try {
|
||||
addEntityMethod = ReflectionUtils.getPrivateMethod(PlayerChunkMap.class, "addEntity",
|
||||
new Class[] {net.minecraft.server.v1_15_R1.Entity.class});
|
||||
removeEntityMethod = ReflectionUtils.getPrivateMethod(PlayerChunkMap.class, "removeEntity",
|
||||
new Class[] {net.minecraft.server.v1_15_R1.Entity.class});
|
||||
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private NMSEntityTracker() {}
|
||||
|
||||
public static void trackEntities(ChunkProviderServer cps, Set<net.minecraft.server.v1_15_R1.Entity> trackList) {
|
||||
try {
|
||||
for(net.minecraft.server.v1_15_R1.Entity entity : trackList) {
|
||||
if(cps.playerChunkMap.trackedEntities.containsKey(entity.getId())) {
|
||||
continue;
|
||||
}
|
||||
addEntityMethod.invoke(cps.playerChunkMap, entity);
|
||||
}
|
||||
} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void untrackEntities(ChunkProviderServer cps, Set<net.minecraft.server.v1_15_R1.Entity> untrackList) {
|
||||
try {
|
||||
for(net.minecraft.server.v1_15_R1.Entity entity : untrackList) {
|
||||
removeEntityMethod.invoke(cps.playerChunkMap, entity);
|
||||
}
|
||||
} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
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;
|
||||
|
||||
public class NMSHandler implements NMS {
|
||||
|
||||
@Override
|
||||
public void startTasks(Plugin plugin) {
|
||||
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(worldName));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1.entityTick;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.WorldServer;
|
||||
import net.minemora.entitytrackerfixer.util.ReflectionUtils;
|
||||
import net.minemora.entitytrackerfixer.v1_15_R1.tasks.UntrackerTask;
|
||||
|
||||
public class EntityTickManager extends TimerTask {
|
||||
|
||||
private static Field tickingField;
|
||||
private static Field tickingEntitiesField;
|
||||
private static Field entityCount;
|
||||
|
||||
static {
|
||||
try {
|
||||
tickingEntitiesField = ReflectionUtils.getClassPrivateField(WorldServer.class, "tickingEntities");
|
||||
tickingField = ReflectionUtils.getClassPrivateField(WorldServer.class, "ticking");
|
||||
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<String, EntityTickWorldCache> cache = new HashMap<>();
|
||||
|
||||
private Timer timer;
|
||||
|
||||
private EntityTickManager() {
|
||||
this.timer = new Timer();
|
||||
timer.schedule(this, 2069, 2069);
|
||||
}
|
||||
|
||||
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()) {
|
||||
WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle();
|
||||
try {
|
||||
if(tickingEntitiesField.getBoolean(ws) || tickingField.getBoolean(ws)) {
|
||||
//System.out.println("ticking");
|
||||
continue;
|
||||
}
|
||||
EntityTickWorldCache ewc = cache.get(worldName);
|
||||
//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(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();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public Map<String, EntityTickWorldCache> getCache() {
|
||||
return cache;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1.entityTick;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class EntityTickWorldCache {
|
||||
|
||||
private String worldName;
|
||||
|
||||
private Set<Integer> toUntick = new HashSet<>();
|
||||
private Map<Integer, net.minecraft.server.v1_15_R1.Entity> toTick = new HashMap<>();
|
||||
|
||||
public EntityTickWorldCache(String worldName) {
|
||||
this.worldName = worldName;
|
||||
}
|
||||
|
||||
public Set<Integer> getToUntick() {
|
||||
return toUntick;
|
||||
}
|
||||
|
||||
public Map<Integer, net.minecraft.server.v1_15_R1.Entity> getToTick() {
|
||||
return toTick;
|
||||
}
|
||||
|
||||
public String getWorldName() {
|
||||
return worldName;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1.tasks;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
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 {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if(UntrackerTask.isRunning()) {
|
||||
return;
|
||||
}
|
||||
for(String worldName : ConfigMain.getWorlds()) {
|
||||
if(Bukkit.getWorld(worldName) == null) {
|
||||
continue;
|
||||
}
|
||||
checkWorld(worldName);
|
||||
}
|
||||
}
|
||||
|
||||
public void checkWorld(String worldName) {
|
||||
WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle();
|
||||
ChunkProviderServer cps = ws.getChunkProvider();
|
||||
|
||||
Set<net.minecraft.server.v1_15_R1.Entity> trackAgain = new HashSet<>();
|
||||
|
||||
int d = ConfigMain.getTrackingRange();
|
||||
for(Player player : Bukkit.getWorld(worldName).getPlayers()) {
|
||||
for(Entity ent : player.getNearbyEntities(d, d, d)) {
|
||||
if(!cps.playerChunkMap.trackedEntities.containsKey(ent.getEntityId())) {
|
||||
trackAgain.add(((CraftEntity)ent).getHandle());
|
||||
if(ConfigMain.isDisableTickUntracked()) {
|
||||
EntityTickManager.getInstance().enableTicking(((CraftEntity)ent).getHandle(), worldName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NMSEntityTracker.trackEntities(cps, trackAgain);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
package net.minemora.entitytrackerfixer.v1_15_R1.tasks;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import net.minecraft.server.v1_15_R1.ChunkProviderServer;
|
||||
import net.minecraft.server.v1_15_R1.EntityPlayer;
|
||||
import net.minecraft.server.v1_15_R1.MinecraftServer;
|
||||
import net.minecraft.server.v1_15_R1.WorldServer;
|
||||
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 {
|
||||
|
||||
private static boolean running = false;
|
||||
|
||||
private static Field trackerField;
|
||||
|
||||
static {
|
||||
try {
|
||||
trackerField = ReflectionUtils.getClassPrivateField(EntityTracker.class, "tracker");
|
||||
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void run() {
|
||||
if(MinecraftServer.getServer().recentTps[0] > ConfigMain.getMinTps()) {
|
||||
//String tps = String.format("%.2f", MinecraftServer.getServer().recentTps[0]);
|
||||
//EntityTrackerFixer.plugin.getLogger().info("Not untraking because tps = " + tps);
|
||||
return;
|
||||
}
|
||||
running = true;
|
||||
for(String worldName : ConfigMain.getWorlds()) {
|
||||
untrackProcess(worldName);
|
||||
}
|
||||
running = false;
|
||||
}
|
||||
|
||||
private void untrackProcess(String worldName) {
|
||||
if(Bukkit.getWorld(worldName) == null) {
|
||||
return;
|
||||
}
|
||||
//Set<net.minecraft.server.v1_14_R1.Entity> toRemove = new HashSet<>();
|
||||
Set<Integer> toRemove = new HashSet<>();
|
||||
int removed = 0;
|
||||
WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle();
|
||||
ChunkProviderServer cps = ws.getChunkProvider();
|
||||
|
||||
try {
|
||||
for(EntityTracker et : cps.playerChunkMap.trackedEntities.values()) {
|
||||
net.minecraft.server.v1_15_R1.Entity nmsEnt = (net.minecraft.server.v1_15_R1.Entity) trackerField.get(et);
|
||||
if(nmsEnt instanceof EntityPlayer) {
|
||||
continue;
|
||||
}
|
||||
if(nmsEnt.getBukkitEntity().getCustomName() != null) {
|
||||
continue;
|
||||
}
|
||||
boolean remove = false;
|
||||
if(et.trackedPlayers.size() == 0) {
|
||||
remove = true;
|
||||
}
|
||||
else if(et.trackedPlayers.size() == 1) {
|
||||
for(EntityPlayer ep : et.trackedPlayers) {
|
||||
if(!ep.getBukkitEntity().isOnline()) {
|
||||
remove = true;
|
||||
}
|
||||
}
|
||||
if(!remove) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if(remove) {
|
||||
//System.out.println("untracked: " + nmsEnt.getBukkitEntity().getType().name());
|
||||
toRemove.add(nmsEnt.getId());
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
for(int id : toRemove) {
|
||||
cps.playerChunkMap.trackedEntities.remove(id);
|
||||
if(ConfigMain.isDisableTickUntracked()) {
|
||||
EntityTickManager.getInstance().disableTicking(id, worldName);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
NMSEntityTracker.untrackEntities(cps, toRemove);
|
||||
}
|
||||
}.runTask(EntityTrackerFixer.plugin);
|
||||
*/
|
||||
|
||||
if(ConfigMain.isLogToConsole()) {
|
||||
EntityTrackerFixer.plugin.getLogger().info("Untracked " + removed + " entities in " + worldName);
|
||||
}
|
||||
|
||||
//System.out.println("cache now contains " + UntrackedEntitiesCache.getInstance().getCache(worldName).size() + " entities");
|
||||
}
|
||||
|
||||
public static boolean isRunning() {
|
||||
return running;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue