Clean repo for open source release

Remove build artifacts, dev tool configs, unused dependencies,
and third-party source dumps. Add proper README, update .gitignore,
clean up Makefile.
This commit is contained in:
NotEvil
2026-04-12 00:51:22 +02:00
parent 2e7a1d403b
commit f6466360b6
1947 changed files with 238025 additions and 1 deletions

View File

@@ -0,0 +1,163 @@
package com.tiedup.remake.events.lifecycle;
import com.mojang.logging.LogUtils;
import com.tiedup.remake.core.TiedUpMod;
import com.tiedup.remake.events.captivity.ForcedSeatingHandler;
import com.tiedup.remake.events.restriction.LaborToolProtectionHandler;
import com.tiedup.remake.events.restriction.PetPlayRestrictionHandler;
import com.tiedup.remake.network.PacketRateLimiter;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import org.slf4j.Logger;
/**
* Handler for player disconnect events to clean up server-side resources.
*
* <p>This handler ensures that resources associated with disconnected players
* are properly cleaned up to prevent memory leaks and unbounded map growth.
*
* <p>Phase: Server Resource Management
*
* <p>Cleanup includes:
* <ul>
* <li>Rate limiter token buckets ({@link PacketRateLimiter})</li>
* <li>Future: Session data, pending tasks, etc.</li>
* </ul>
*/
@Mod.EventBusSubscriber(
modid = TiedUpMod.MOD_ID,
bus = Mod.EventBusSubscriber.Bus.FORGE
)
public class PlayerDisconnectHandler {
private static final Logger LOGGER = LogUtils.getLogger();
/**
* Clean up resources when a player logs out.
*
* <p>This event fires when a player disconnects from the server,
* either by logging out normally or being kicked/timing out.
*
* @param event The player logout event
*/
@SubscribeEvent
public static void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent event) {
java.util.UUID playerId = event.getEntity().getUUID();
// NOTE: PlayerBindState.removeInstance() is called by PlayerLifecycleHandler (EventPriority.HIGH)
// We don't duplicate it here to avoid redundant cleanup
// Clean up rate limiter state
PacketRateLimiter.cleanup(playerId);
// Clean up static cooldown maps to prevent memory leaks
com.tiedup.remake.commands.SocialCommand.cleanupPlayer(playerId);
LaborToolProtectionHandler.cleanupPlayer(playerId);
// BUG FIX: Memory leak cleanup for event handlers
// Clean up ForcedSeatingHandler maps
ForcedSeatingHandler.clearPlayer(playerId);
// Clean up PetPlayRestrictionHandler timestamp map
PetPlayRestrictionHandler.clearPlayer(playerId);
// Clean up minigame sessions
com.tiedup.remake.minigame.MiniGameSessionManager.getInstance().cleanupPlayer(
playerId
);
// Clean up pet cage state
com.tiedup.remake.v2.blocks.PetCageManager.onPlayerDisconnect(playerId);
// Clean up pet bed state (has onPlayerDisconnect but was never wired)
com.tiedup.remake.v2.blocks.PetBedManager.onPlayerDisconnect(playerId);
// Clean up active conversations
com.tiedup.remake.dialogue.conversation.ConversationManager.cleanupPlayer(playerId);
// Clean up cell selection mode
com.tiedup.remake.cells.CellSelectionManager.cleanup(playerId);
// BUG FIX: Security - Remove labor tools from disconnecting player
// This prevents players from keeping unbreakable tools by disconnecting
if (
event.getEntity() instanceof
net.minecraft.server.level.ServerPlayer player
) {
removeLaborTools(player);
}
// BUG FIX: Memory leak cleanup for entities
// Clean up EntityKidnapperMerchant tradingPlayers set (O(1) reverse-lookup)
if (
event.getEntity().level() instanceof
net.minecraft.server.level.ServerLevel serverLevel
) {
java.util.UUID merchantUUID =
com.tiedup.remake.entities.EntityKidnapperMerchant.getMerchantForPlayer(
playerId
);
if (merchantUUID != null) {
net.minecraft.world.entity.Entity merchantEntity =
serverLevel.getEntity(merchantUUID);
if (
merchantEntity instanceof
com.tiedup.remake.entities.EntityKidnapperMerchant merchant
) {
merchant.cleanupTradingPlayer(playerId);
}
}
// Kidnapper robbery immunity: cheap per-entity Map.remove(), disconnect-only — acceptable scan
// Uses getAllEntities since there's no UUID index for this reverse lookup
for (net.minecraft.world.entity.Entity entity : serverLevel.getAllEntities()) {
if (
entity instanceof
com.tiedup.remake.entities.EntityKidnapper kidnapper
) {
kidnapper.clearRobbedImmunity(playerId);
}
}
}
LOGGER.debug(
"Cleaned up server resources for player: {} ({})",
event.getEntity().getName().getString(),
playerId
);
}
/**
* SECURITY: Remove all labor tools from player inventory on disconnect.
* Prevents exploit where players disconnect to keep unbreakable tools.
*/
private static void removeLaborTools(
net.minecraft.server.level.ServerPlayer player
) {
var inventory = player.getInventory();
int removedCount = 0;
for (int i = 0; i < inventory.getContainerSize(); i++) {
net.minecraft.world.item.ItemStack stack = inventory.getItem(i);
if (!stack.isEmpty() && stack.hasTag()) {
net.minecraft.nbt.CompoundTag tag = stack.getTag();
if (tag != null && tag.getBoolean("LaborTool")) {
inventory.setItem(
i,
net.minecraft.world.item.ItemStack.EMPTY
);
removedCount++;
}
}
}
if (removedCount > 0) {
LOGGER.info(
"[PlayerDisconnectHandler] Removed {} labor tools from {} on disconnect",
removedCount,
player.getName().getString()
);
}
}
}