package games.dmg.spigottyrant; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; import org.bukkit.Server; import org.bukkit.entity.Player; public final class FormerTamerReleaseTask implements Runnable { private final TyrantStateManager stateManager; private final Server server; private final CapturedMobCustodyRelease release; private final CapturedMobInventoryService inventory; public FormerTamerReleaseTask( TyrantStateManager stateManager, Server server, CapturedMobCustodyRelease release ) { this(stateManager, server, release, null); } public FormerTamerReleaseTask( TyrantStateManager stateManager, Server server, CapturedMobCustodyRelease release, CapturedMobInventoryService inventory ) { this.stateManager = stateManager; this.server = server; this.release = release; this.inventory = inventory; } @Override public void run() { Map online = server.getOnlinePlayers().stream() .collect(Collectors.toMap(Player::getUniqueId, player -> player)); for (PlayerState state : stateManager.players().values()) { if (state.capturedMobs().isEmpty() || state.tyrantClass() == TyrantClass.TAMER && state.capturedMobs().size() == 1) { continue; } Player player = online.get(state.playerId()); if (player == null || player.isDead()) { continue; } PlayerState released = state.tyrantClass() == TyrantClass.TAMER ? release.releaseExcess(player, state, 1) : release.releaseAll(player, state); if (released.equals(state)) { continue; } stateManager.updatePlayer( state.playerId(), state.latestName(), current -> released ); stateManager.saveIfDirty(); if (inventory != null) { inventory.reconcile(player, released); } } } }