Skip to content

Commit

Permalink
fix Memory Leak of ServerPlayer by using attachments instead of my ow…
Browse files Browse the repository at this point in the history
…n map (#277)
  • Loading branch information
Mari023 committed Jun 10, 2024
1 parent 46ab0de commit 02229fc
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 22 deletions.
5 changes: 5 additions & 0 deletions src/main/java/de/mari_023/ae2wtlib/AE2wtlib.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.neoforge.attachment.AttachmentType;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.NeoForgeRegistries;

import appeng.api.features.HotkeyAction;
import appeng.core.definitions.AEItems;
Expand All @@ -29,6 +32,8 @@

public class AE2wtlib {
public static final String MOD_NAME = "ae2wtlib";
public static final DeferredRegister<AttachmentType<?>> ATTACHMENT_TYPES = DeferredRegister
.create(NeoForgeRegistries.ATTACHMENT_TYPES, MOD_NAME);

public static void onAe2Initialized() {
AddTerminalEvent.register((event -> {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/de/mari_023/ae2wtlib/AE2wtlibForge.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ public AE2wtlibForge(IEventBus modEventBus) {
PackSource.BUILT_IN,
false,
Pack.Position.TOP));
AE2wtlib.ATTACHMENT_TYPES.register(modEventBus);
}

private static <T extends AE2wtlibPacket> void registerPacket(PayloadRegistrar registrar,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
package de.mari_023.ae2wtlib.wct;

import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.function.Supplier;

import org.jetbrains.annotations.Nullable;

import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.attachment.AttachmentType;

import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.menu.locator.ItemMenuHostLocator;

import de.mari_023.ae2wtlib.AE2wtlib;
import de.mari_023.ae2wtlib.terminal.WTMenuHost;
import de.mari_023.ae2wtlib.wct.magnet_card.MagnetHost;
import de.mari_023.ae2wtlib.wut.WTDefinitions;
import de.mari_023.ae2wtlib.wut.WUTHandler;

public class CraftingTerminalHandler {
private static final WeakHashMap<Player, CraftingTerminalHandler> SERVER_PLAYERS = new WeakHashMap<>();
private static final WeakHashMap<Player, CraftingTerminalHandler> CLIENT_PLAYERS = new WeakHashMap<>();
public static final Supplier<AttachmentType<CraftingTerminalHandler>> CT_HANDLER = AE2wtlib.ATTACHMENT_TYPES
.register("ct_handler",
() -> AttachmentType.builder((player) -> new CraftingTerminalHandler((Player) player)).build());
public final Player player;
@Nullable
private WTMenuHost menuHost;
Expand All @@ -37,23 +38,7 @@ private CraftingTerminalHandler(Player player) {
}

public static CraftingTerminalHandler getCraftingTerminalHandler(Player player) {
Map<Player, CraftingTerminalHandler> players = player instanceof ServerPlayer ? SERVER_PLAYERS : CLIENT_PLAYERS;

if (players.containsKey(player)) {
if (player == players.get(player).player)
return players.get(player);
removePlayer(player);
}
CraftingTerminalHandler handler = new CraftingTerminalHandler(player);
players.put(player, handler);
return handler;
}

public static void removePlayer(Player player) {
if (player instanceof ServerPlayer)
SERVER_PLAYERS.remove(player);
else
CLIENT_PLAYERS.remove(player);
return player.getData(CT_HANDLER);
}

private void invalidateCache() {
Expand Down

0 comments on commit 02229fc

Please sign in to comment.