From 0f95499a0f248da2b69066d2fdc7b6780d6dfa53 Mon Sep 17 00:00:00 2001 From: TDSTOS Date: Wed, 25 Mar 2026 21:42:04 +0100 Subject: [PATCH] Add cachedItems to kits; prevent kit item drops Introduce an abstract cachedItems property on Kit (ConcurrentHashMap>) to track per-player kit items. Update implementations (BackupKit, GoblinKit, IceMageKit, TemplateKit) to override and initialize cachedItems. GameStateListener now checks dropped items against the selected kit cache and cancels drops (playing a sound) for kit items, and adds handlers to cancel item pickup/despawn outside active game states. Add necessary imports for ItemStack, UUID, ConcurrentHashMap and new event types. --- .../kotlin/club/mcscrims/speedhg/kit/Kit.kt | 5 +++ .../mcscrims/speedhg/kit/impl/BackupKit.kt | 5 +++ .../mcscrims/speedhg/kit/impl/GoblinKit.kt | 2 +- .../mcscrims/speedhg/kit/impl/IceMageKit.kt | 2 +- .../mcscrims/speedhg/kit/impl/TemplateKit.kt | 4 +++ .../speedhg/listener/GameStateListener.kt | 32 ++++++++++++++++++- 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/Kit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/Kit.kt index 80f5b64..49adbab 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/Kit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/Kit.kt @@ -5,6 +5,9 @@ import club.mcscrims.speedhg.kit.ability.PassiveAbility import net.kyori.adventure.text.Component import org.bukkit.Material import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap /** * Base class for every kit in SpeedHG. @@ -61,6 +64,8 @@ abstract class Kit { // Item distribution // ------------------------------------------------------------------------- + abstract val cachedItems: ConcurrentHashMap> + /** * Give the player their kit-specific items at game start (after teleportation). * The standard HG items (soup, compass, etc.) are already given by [GameManager]. diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/BackupKit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/BackupKit.kt index 6dfa344..e9aee9b 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/BackupKit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/BackupKit.kt @@ -9,6 +9,9 @@ import club.mcscrims.speedhg.kit.ability.PassiveAbility import net.kyori.adventure.text.Component import org.bukkit.Material import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap class BackupKit : Kit() { @@ -52,6 +55,8 @@ class BackupKit : Kit() { // ── Item distribution ───────────────────────────────────────────────────── + override val cachedItems = ConcurrentHashMap>() + override fun giveItems( player: Player, playstyle: Playstyle ) {} private class NoActive( playstyle: Playstyle ) : ActiveAbility( playstyle ) { diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt index 9f94eb9..50bacda 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/GoblinKit.kt @@ -61,7 +61,7 @@ class GoblinKit : Kit() { // ── Item distribution ───────────────────────────────────────────────────── - private val cachedItems = ConcurrentHashMap>() + override val cachedItems = ConcurrentHashMap>() override fun giveItems( player: Player, diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/IceMageKit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/IceMageKit.kt index 8306461..44c30bb 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/IceMageKit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/IceMageKit.kt @@ -62,7 +62,7 @@ class IceMageKit : Kit() { // ── Item distribution ───────────────────────────────────────────────────── - private val cachedItems = ConcurrentHashMap>() + override val cachedItems = ConcurrentHashMap>() override fun giveItems( player: Player, diff --git a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/TemplateKit.kt b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/TemplateKit.kt index d76850b..3bc2e9e 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/kit/impl/TemplateKit.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/kit/impl/TemplateKit.kt @@ -14,6 +14,8 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.inventory.ItemStack import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType +import java.util.UUID +import java.util.concurrent.ConcurrentHashMap /** * ────────────────────────────────────────────────────────────────────────────── @@ -60,6 +62,8 @@ class TemplateKit : Kit() { // ── Item distribution ───────────────────────────────────────────────────── + override val cachedItems = ConcurrentHashMap>() + override fun giveItems(player: Player, playstyle: Playstyle) { // Slot 8 = ability trigger item (always present) player.inventory.setItem(8, ItemStack(Material.BLAZE_ROD)) diff --git a/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt b/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt index 15a9bfc..eab5fd2 100644 --- a/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt +++ b/src/main/kotlin/club/mcscrims/speedhg/listener/GameStateListener.kt @@ -16,7 +16,9 @@ import org.bukkit.event.block.LeavesDecayEvent import org.bukkit.event.enchantment.EnchantItemEvent import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.FoodLevelChangeEvent +import org.bukkit.event.entity.ItemDespawnEvent import org.bukkit.event.inventory.* +import org.bukkit.event.player.PlayerAttemptPickupItemEvent import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerItemDamageEvent import org.bukkit.event.player.PlayerJoinEvent @@ -169,7 +171,35 @@ class GameStateListener : Listener { return } - // TODO: add kit item check + val kitItems = plugin.kitManager.getSelectedKit( player )?.cachedItems?.get( player.uniqueId ) ?: return + val item = event.itemDrop.itemStack + + if (kitItems.contains( item )) + { + event.isCancelled = true + player.playSound( player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 1f, 1f ) + } + } + + @EventHandler + fun onPickupItem( + event: PlayerAttemptPickupItemEvent + ) { + val player = event.player + + if ( gameManager.currentState == GameState.INVINCIBILITY || + gameManager.currentState == GameState.INGAME ) + return + + event.isCancelled = true + player.playSound( player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 1f, 1f ) + } + + @EventHandler + fun onItemDespawn( + event: ItemDespawnEvent + ) { + event.isCancelled = true } private val swordNerf = 0.5