From 3376516a2856a854584bd72de4428c539e4d4b34 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Sun, 3 Nov 2024 18:50:31 +0100 Subject: Fix memory leak in gt++ PlayerUtils (#3411) Co-authored-by: Maya <10861407+serenibyss@users.noreply.github.com> --- .../core/handler/events/EntityDeathHandler.java | 5 +- .../core/util/minecraft/PlayerUtils.java | 63 ++-------------------- 2 files changed, 6 insertions(+), 62 deletions(-) diff --git a/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java b/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java index 35970d9165..cb59db205e 100644 --- a/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java +++ b/src/main/java/gtPlusPlus/core/handler/events/EntityDeathHandler.java @@ -2,7 +2,6 @@ package gtPlusPlus.core.handler.events; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; @@ -27,8 +26,8 @@ import gtPlusPlus.core.util.minecraft.PlayerUtils; @Optional.Interface(iface = "com.kuba6000.mobsinfo.api.IMobExtraInfoProvider", modid = "mobsinfo") public class EntityDeathHandler implements IMobExtraInfoProvider { - private static final HashMap>> mMobDropMap = new HashMap<>(); - private static final HashSet mInternalClassKeyCache = new HashSet<>(); + private static final HashMap, ArrayList>> mMobDropMap = new HashMap<>(); + private static final ArrayList> mInternalClassKeyCache = new ArrayList<>(); /** * Provides the ability to provide custom drops upon the death of EntityLivingBase objects. diff --git a/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java b/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java index 5f639f3739..1108d5d904 100644 --- a/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java +++ b/src/main/java/gtPlusPlus/core/util/minecraft/PlayerUtils.java @@ -1,9 +1,7 @@ package gtPlusPlus.core.util.minecraft; import java.util.List; -import java.util.Map; import java.util.UUID; -import java.util.WeakHashMap; import net.minecraft.client.Minecraft; import net.minecraft.entity.EntityLivingBase; @@ -11,23 +9,16 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.IChatComponent; import net.minecraft.world.World; -import net.minecraftforge.common.util.FakePlayer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.util.GTUtility; -import gregtech.api.util.ReflectionUtil; import gtPlusPlus.core.util.Utils; public class PlayerUtils { - public static final Map mCachedFakePlayers = new WeakHashMap<>(); - private static final Class mThaumcraftFakePlayer = ReflectionUtil - .getClass("thaumcraft.common.lib.FakeThaumcraftPlayer"); - public static List getOnlinePlayers() { return MinecraftServer.getServer() .getConfigurationManager().playerEntityList; @@ -105,55 +96,9 @@ public class PlayerUtils { return !aPlayer.capabilities.disableDamage; } - public static void cacheFakePlayer(EntityPlayer aPlayer) { - ChunkCoordinates aChunkLocation = aPlayer.getPlayerCoordinates(); - // Cache Fake Player - if (aPlayer instanceof FakePlayer - || (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(aPlayer)) - || (aPlayer.getCommandSenderName() == null || aPlayer.getCommandSenderName() - .isEmpty()) - || (aPlayer.isEntityInvulnerable() && !aPlayer.canCommandSenderUseCommand(0, "") && (aChunkLocation == null) - || (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0))) { - mCachedFakePlayers.put( - aPlayer.getUniqueID() - .toString(), - aPlayer); - } - } - - public static boolean isCachedFakePlayer(String aUUID) { - return mCachedFakePlayers.containsKey(aUUID); - } - - public static boolean isRealPlayer(EntityLivingBase aEntity) { - if (aEntity instanceof EntityPlayer p) { - ChunkCoordinates aChunkLocation = p.getPlayerCoordinates(); - if (p instanceof FakePlayer) { - cacheFakePlayer(p); - return false; - } - if (mThaumcraftFakePlayer != null && mThaumcraftFakePlayer.isInstance(p)) { - cacheFakePlayer(p); - return false; - } - if (p.getCommandSenderName() == null) { - cacheFakePlayer(p); - return false; - } - if (p.getCommandSenderName() - .isEmpty()) { - cacheFakePlayer(p); - return false; - } - if (p.isEntityInvulnerable() && !p.canCommandSenderUseCommand(0, "") - && (aChunkLocation.posX == 0 && aChunkLocation.posY == 0 && aChunkLocation.posZ == 0)) { - cacheFakePlayer(p); - return false; - } - return !isCachedFakePlayer( - p.getUniqueID() - .toString()); - } - return false; + public static boolean isRealPlayer(EntityLivingBase entity) { + return entity instanceof EntityPlayer p && !p.getClass() + .getName() + .contains("Fake"); } } -- cgit