package club.mcscrims.speedhg.kit import club.mcscrims.speedhg.SpeedHG import org.bukkit.entity.Player import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.player.PlayerInteractEvent import java.util.UUID import java.util.concurrent.ConcurrentHashMap class KitManager(private val plugin: SpeedHG) { private val kits = ConcurrentHashMap() private val selectedKits = ConcurrentHashMap() fun registerKit(kit: AbstractKit) { kit.config = plugin.kitConfig.data.getConfigForKit(kit.id) kits[kit.id.lowercase()] = kit plugin.logger.info("Registered kit: ${kit.displayName} (${kit.id})") } fun getKit(id: String): AbstractKit? { return kits[id.lowercase()] } fun getAllKits(): Collection { return kits.values } fun selectKit(player: Player, kitId: String): Boolean { val kit = getKit(kitId) ?: return false val previousKit = selectedKits[player.uniqueId] previousKit?.cleanup(player) selectedKits[player.uniqueId] = kit try { kit.onSelect(player) } catch (e: Exception) { plugin.logger.severe("Error during onSelect for kit ${kit.id} and player ${player.name}: ${e.message}") e.printStackTrace() } return true } fun getSelectedKit(player: Player): AbstractKit? { return selectedKits[player.uniqueId] } fun startKitForPlayer(player: Player) { val kit = selectedKits[player.uniqueId] ?: return try { kit.onStart(player) } catch (e: Exception) { plugin.logger.severe("Error during onStart for kit ${kit.id} and player ${player.name}: ${e.message}") e.printStackTrace() } } fun triggerHit(attacker: Player, victim: Player, event: EntityDamageByEntityEvent) { val kit = selectedKits[attacker.uniqueId] ?: return try { kit.onHit(attacker, victim, event) } catch (e: Exception) { plugin.logger.severe("Error during onHit for kit ${kit.id} and player ${attacker.name}: ${e.message}") e.printStackTrace() } } fun triggerInteract(player: Player, event: PlayerInteractEvent) { val kit = selectedKits[player.uniqueId] ?: return try { kit.onInteract(player, event) } catch (e: Exception) { plugin.logger.severe("Error during onInteract for kit ${kit.id} and player ${player.name}: ${e.message}") e.printStackTrace() } } fun clearPlayerSelection(player: Player) { val kit = selectedKits.remove(player.uniqueId) kit?.cleanup(player) } fun clearAll() { selectedKits.values.forEach { kit -> plugin.server.onlinePlayers.forEach { player -> if (selectedKits[player.uniqueId] == kit) { kit.cleanup(player) } } } selectedKits.clear() } }