Remove Itemframe filter

This commit is contained in:
Esmorall 2019-12-23 16:00:47 -03:00
parent 2e3e3f3037
commit 0e216bd724
2 changed files with 233 additions and 235 deletions

View File

@ -1,123 +1,122 @@
package net.minemora.entitytrackerfixer.v1_14_R1.tasks; package net.minemora.entitytrackerfixer.v1_14_R1.tasks;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.craftbukkit.v1_14_R1.CraftWorld;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import net.minecraft.server.v1_14_R1.ChunkProviderServer; import net.minecraft.server.v1_14_R1.ChunkProviderServer;
import net.minecraft.server.v1_14_R1.EntityPlayer; import net.minecraft.server.v1_14_R1.EntityPlayer;
import net.minecraft.server.v1_14_R1.MinecraftServer; import net.minecraft.server.v1_14_R1.MinecraftServer;
import net.minecraft.server.v1_14_R1.WorldServer; import net.minecraft.server.v1_14_R1.WorldServer;
import net.minecraft.server.v1_14_R1.PlayerChunkMap.EntityTracker; import net.minecraft.server.v1_14_R1.PlayerChunkMap.EntityTracker;
import net.minecraft.server.v1_14_R1.EntityArmorStand; import net.minecraft.server.v1_14_R1.EntityArmorStand;
import net.minecraft.server.v1_14_R1.EntityEnderDragon; import net.minecraft.server.v1_14_R1.EntityEnderDragon;
import net.minecraft.server.v1_14_R1.EntityItemFrame; import net.minemora.entitytrackerfixer.EntityTrackerFixer;
import net.minemora.entitytrackerfixer.EntityTrackerFixer; import net.minemora.entitytrackerfixer.config.ConfigMain;
import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.util.ReflectionUtils;
import net.minemora.entitytrackerfixer.util.ReflectionUtils; import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager;
import net.minemora.entitytrackerfixer.v1_14_R1.entityTick.EntityTickManager;
public class UntrackerTask extends BukkitRunnable {
public class UntrackerTask extends BukkitRunnable {
private static boolean running = false;
private static boolean running = false;
private static Field trackerField;
private static Field trackerField;
static {
static { try {
try { trackerField = ReflectionUtils.getClassPrivateField(EntityTracker.class, "tracker");
trackerField = ReflectionUtils.getClassPrivateField(EntityTracker.class, "tracker"); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace();
e.printStackTrace(); }
} }
}
@SuppressWarnings("deprecation")
@SuppressWarnings("deprecation") @Override
@Override public void run() {
public void run() { if(MinecraftServer.getServer().recentTps[0] > ConfigMain.getMinTps()) {
if(MinecraftServer.getServer().recentTps[0] > ConfigMain.getMinTps()) { //String tps = String.format("%.2f", MinecraftServer.getServer().recentTps[0]);
//String tps = String.format("%.2f", MinecraftServer.getServer().recentTps[0]); //EntityTrackerFixer.plugin.getLogger().info("Not untraking because tps = " + tps);
//EntityTrackerFixer.plugin.getLogger().info("Not untraking because tps = " + tps); return;
return; }
} running = true;
running = true; for(String worldName : ConfigMain.getWorlds()) {
for(String worldName : ConfigMain.getWorlds()) { untrackProcess(worldName);
untrackProcess(worldName); }
} running = false;
running = false; }
}
private void untrackProcess(String worldName) {
private void untrackProcess(String worldName) { if(Bukkit.getWorld(worldName) == null) {
if(Bukkit.getWorld(worldName) == null) { return;
return; }
} //Set<net.minecraft.server.v1_14_R1.Entity> toRemove = new HashSet<>();
//Set<net.minecraft.server.v1_14_R1.Entity> toRemove = new HashSet<>(); Set<Integer> toRemove = new HashSet<>();
Set<Integer> toRemove = new HashSet<>(); int removed = 0;
int removed = 0; WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle();
WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle(); ChunkProviderServer cps = ws.getChunkProvider();
ChunkProviderServer cps = ws.getChunkProvider();
try {
try { for(EntityTracker et : cps.playerChunkMap.trackedEntities.values()) {
for(EntityTracker et : cps.playerChunkMap.trackedEntities.values()) { net.minecraft.server.v1_14_R1.Entity nmsEnt = (net.minecraft.server.v1_14_R1.Entity) trackerField.get(et);
net.minecraft.server.v1_14_R1.Entity nmsEnt = (net.minecraft.server.v1_14_R1.Entity) trackerField.get(et); if(nmsEnt instanceof EntityPlayer || nmsEnt instanceof EntityEnderDragon) {
if(nmsEnt instanceof EntityPlayer || nmsEnt instanceof EntityItemFrame || nmsEnt instanceof EntityEnderDragon) { continue;
continue; }
} if(nmsEnt instanceof EntityArmorStand && nmsEnt.getBukkitEntity().getCustomName() != null) {
if(nmsEnt instanceof EntityArmorStand && nmsEnt.getBukkitEntity().getCustomName() != null) { continue;
continue; }
} boolean remove = false;
boolean remove = false; if(et.trackedPlayers.size() == 0) {
if(et.trackedPlayers.size() == 0) { remove = true;
remove = true; }
} else if(et.trackedPlayers.size() == 1) {
else if(et.trackedPlayers.size() == 1) { for(EntityPlayer ep : et.trackedPlayers) {
for(EntityPlayer ep : et.trackedPlayers) { if(!ep.getBukkitEntity().isOnline()) {
if(!ep.getBukkitEntity().isOnline()) { remove = true;
remove = true; }
} }
} if(!remove) {
if(!remove) { continue;
continue; }
} }
} if(remove) {
if(remove) { //System.out.println("untracked: " + nmsEnt.getBukkitEntity().getType().name());
//System.out.println("untracked: " + nmsEnt.getBukkitEntity().getType().name()); toRemove.add(nmsEnt.getId());
toRemove.add(nmsEnt.getId()); removed++;
removed++; }
} }
} } catch (IllegalArgumentException | IllegalAccessException e) {
} catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace();
e.printStackTrace(); }
}
for(int id : toRemove) {
for(int id : toRemove) { cps.playerChunkMap.trackedEntities.remove(id);
cps.playerChunkMap.trackedEntities.remove(id); if(ConfigMain.isDisableTickUntracked()) {
if(ConfigMain.isDisableTickUntracked()) { EntityTickManager.getInstance().disableTicking(id, worldName);
EntityTickManager.getInstance().disableTicking(id, worldName); }
} }
}
/*
/* new BukkitRunnable() {
new BukkitRunnable() { @Override
@Override public void run() {
public void run() { NMSEntityTracker.untrackEntities(cps, toRemove);
NMSEntityTracker.untrackEntities(cps, toRemove); }
} }.runTask(EntityTrackerFixer.plugin);
}.runTask(EntityTrackerFixer.plugin); */
*/
if(ConfigMain.isLogToConsole()) {
if(ConfigMain.isLogToConsole()) { EntityTrackerFixer.plugin.getLogger().info("Untracked " + removed + " entities in " + worldName);
EntityTrackerFixer.plugin.getLogger().info("Untracked " + removed + " entities in " + worldName); }
}
//System.out.println("cache now contains " + UntrackedEntitiesCache.getInstance().getCache(worldName).size() + " entities");
//System.out.println("cache now contains " + UntrackedEntitiesCache.getInstance().getCache(worldName).size() + " entities"); }
}
public static boolean isRunning() {
public static boolean isRunning() { return running;
return running; }
}
}
}

View File

@ -1,112 +1,111 @@
package net.minemora.entitytrackerfixer.v1_15_R1.tasks; package net.minemora.entitytrackerfixer.v1_15_R1.tasks;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; import org.bukkit.craftbukkit.v1_15_R1.CraftWorld;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import net.minecraft.server.v1_15_R1.EntityItemFrame; import net.minecraft.server.v1_15_R1.ChunkProviderServer;
import net.minecraft.server.v1_15_R1.ChunkProviderServer; import net.minecraft.server.v1_15_R1.EntityArmorStand;
import net.minecraft.server.v1_15_R1.EntityArmorStand; import net.minecraft.server.v1_15_R1.EntityEnderDragon;
import net.minecraft.server.v1_15_R1.EntityEnderDragon; import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.EntityPlayer; import net.minecraft.server.v1_15_R1.MinecraftServer;
import net.minecraft.server.v1_15_R1.MinecraftServer; import net.minecraft.server.v1_15_R1.WorldServer;
import net.minecraft.server.v1_15_R1.WorldServer; import net.minecraft.server.v1_15_R1.PlayerChunkMap.EntityTracker;
import net.minecraft.server.v1_15_R1.PlayerChunkMap.EntityTracker; import net.minemora.entitytrackerfixer.EntityTrackerFixer;
import net.minemora.entitytrackerfixer.EntityTrackerFixer; import net.minemora.entitytrackerfixer.config.ConfigMain;
import net.minemora.entitytrackerfixer.config.ConfigMain; import net.minemora.entitytrackerfixer.util.ReflectionUtils;
import net.minemora.entitytrackerfixer.util.ReflectionUtils; import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickManager;
import net.minemora.entitytrackerfixer.v1_15_R1.entityTick.EntityTickManager;
public class UntrackerTask extends BukkitRunnable {
public class UntrackerTask extends BukkitRunnable {
private static boolean running = false;
private static boolean running = false;
private static Field trackerField;
private static Field trackerField;
static {
static { try {
try { trackerField = ReflectionUtils.getClassPrivateField(EntityTracker.class, "tracker");
trackerField = ReflectionUtils.getClassPrivateField(EntityTracker.class, "tracker"); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace();
e.printStackTrace(); }
} }
}
@SuppressWarnings("deprecation")
@SuppressWarnings("deprecation") @Override
@Override public void run() {
public void run() { if(MinecraftServer.getServer().recentTps[0] > ConfigMain.getMinTps()) {
if(MinecraftServer.getServer().recentTps[0] > ConfigMain.getMinTps()) { return;
return; }
} running = true;
running = true; for(String worldName : ConfigMain.getWorlds()) {
for(String worldName : ConfigMain.getWorlds()) { untrackProcess(worldName);
untrackProcess(worldName); }
} running = false;
running = false; }
}
private void untrackProcess(String worldName) {
private void untrackProcess(String worldName) { if(Bukkit.getWorld(worldName) == null) {
if(Bukkit.getWorld(worldName) == null) { return;
return; }
} //Set<net.minecraft.server.v1_14_R1.Entity> toRemove = new HashSet<>();
//Set<net.minecraft.server.v1_14_R1.Entity> toRemove = new HashSet<>(); Set<Integer> toRemove = new HashSet<>();
Set<Integer> toRemove = new HashSet<>(); int removed = 0;
int removed = 0; WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle();
WorldServer ws = ((CraftWorld)Bukkit.getWorld(worldName)).getHandle(); ChunkProviderServer cps = ws.getChunkProvider();
ChunkProviderServer cps = ws.getChunkProvider();
try {
try { for(EntityTracker et : cps.playerChunkMap.trackedEntities.values()) {
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);
net.minecraft.server.v1_15_R1.Entity nmsEnt = (net.minecraft.server.v1_15_R1.Entity) trackerField.get(et); if(nmsEnt instanceof EntityPlayer || nmsEnt instanceof EntityEnderDragon) {
if(nmsEnt instanceof EntityPlayer || nmsEnt instanceof EntityItemFrame || nmsEnt instanceof EntityEnderDragon) { continue;
continue; }
} if(nmsEnt instanceof EntityArmorStand && nmsEnt.getBukkitEntity().getCustomName() != null) {
if(nmsEnt instanceof EntityArmorStand && nmsEnt.getBukkitEntity().getCustomName() != null) { continue;
continue; }
} boolean remove = false;
boolean remove = false; if(et.trackedPlayers.size() == 0) {
if(et.trackedPlayers.size() == 0) { remove = true;
remove = true; }
} else if(et.trackedPlayers.size() == 1) {
else if(et.trackedPlayers.size() == 1) { for(EntityPlayer ep : et.trackedPlayers) {
for(EntityPlayer ep : et.trackedPlayers) { if(!ep.getBukkitEntity().isOnline()) {
if(!ep.getBukkitEntity().isOnline()) { remove = true;
remove = true; }
} }
} if(!remove) {
if(!remove) { continue;
continue; }
} }
} if(remove) {
if(remove) { //System.out.println("untracked: " + nmsEnt.getBukkitEntity().getType().name());
//System.out.println("untracked: " + nmsEnt.getBukkitEntity().getType().name()); toRemove.add(nmsEnt.getId());
toRemove.add(nmsEnt.getId()); removed++;
removed++; }
} }
} } catch (IllegalArgumentException | IllegalAccessException e) {
} catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace();
e.printStackTrace(); }
}
for(int id : toRemove) {
for(int id : toRemove) { cps.playerChunkMap.trackedEntities.remove(id);
cps.playerChunkMap.trackedEntities.remove(id); if(ConfigMain.isDisableTickUntracked()) {
if(ConfigMain.isDisableTickUntracked()) { EntityTickManager.getInstance().disableTicking(id, worldName);
EntityTickManager.getInstance().disableTicking(id, worldName); }
} }
}
if(ConfigMain.isLogToConsole()) {
if(ConfigMain.isLogToConsole()) { EntityTrackerFixer.plugin.getLogger().info("Untracked " + removed + " entities in " + worldName);
EntityTrackerFixer.plugin.getLogger().info("Untracked " + removed + " entities in " + worldName); }
}
//System.out.println("cache now contains " + UntrackedEntitiesCache.getInstance().getCache(worldName).size() + " entities");
//System.out.println("cache now contains " + UntrackedEntitiesCache.getInstance().getCache(worldName).size() + " entities"); }
}
public static boolean isRunning() {
public static boolean isRunning() { return running;
return running; }
}
}
}