diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/ResourcePack.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/ResourcePack.kt index ec0f38b..98636c6 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/ResourcePack.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/ResourcePack.kt @@ -21,7 +21,7 @@ object ResourcePack { val sidekick = Material.BLUE_STAINED_GLASS_PANE // Special Item - val cloakingDevice = Material.COBWEB + val cloakingDevice = Material.STONE_AXE val radar = Material.IRON_HELMET val teleporter = Material.SPRUCE_WOOD val martyrdomGrenade = Material.BIRCH_LOG diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/TTTItemListener.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/TTTItemListener.kt index f82ef4b..b7a9b17 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/TTTItemListener.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/TTTItemListener.kt @@ -6,7 +6,6 @@ import de.moritzruth.spigot_ttt.items.TTTItem import de.moritzruth.spigot_ttt.utils.isLeftClick import de.moritzruth.spigot_ttt.utils.isRightClick import org.bukkit.entity.Player -import org.bukkit.event.Event import org.bukkit.event.EventHandler import org.bukkit.event.Listener import org.bukkit.event.entity.EntityDamageByEntityEvent @@ -16,6 +15,7 @@ import org.bukkit.event.player.PlayerEvent import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerItemConsumeEvent import org.bukkit.event.player.PlayerSwapHandItemsEvent +import org.bukkit.inventory.ItemStack open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamage: Boolean): Listener { @EventHandler @@ -26,14 +26,13 @@ open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamag @EventHandler fun onPlayerInteract(event: PlayerInteractEvent) = handle(event) { tttPlayer -> event.isCancelled = true - val data = Data(tttPlayer, event) + val data = ClickEventData(tttPlayer, event.item!!, event) if (event.action.isRightClick) onRightClick(data) else if (event.action.isLeftClick) onLeftClick(data) } - open fun onRightClick(data: Data) {} - - open fun onLeftClick(data: Data) {} + open fun onRightClick(data: ClickEventData) {} + open fun onLeftClick(data: ClickEventData) {} protected fun handle(event: PlayerInteractEvent, handler: (tttPlayer: TTTPlayer) -> Unit) { if (event.item?.type == tttItem.itemStack.type) { @@ -91,5 +90,9 @@ open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamag } } - data class Data(val tttPlayer: TTTPlayer, val event: T) + data class ClickEventData( + val tttPlayer: TTTPlayer, + val itemStack: ItemStack, + val event: PlayerInteractEvent + ) } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/CloakingDevice.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/CloakingDevice.kt index c4a7bc7..be07832 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/CloakingDevice.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/CloakingDevice.kt @@ -2,20 +2,22 @@ package de.moritzruth.spigot_ttt.items.impl import de.moritzruth.spigot_ttt.ResourcePack import de.moritzruth.spigot_ttt.TTTItemListener +import de.moritzruth.spigot_ttt.game.GameEndEvent import de.moritzruth.spigot_ttt.game.players.* import de.moritzruth.spigot_ttt.items.Buyable import de.moritzruth.spigot_ttt.items.Selectable import de.moritzruth.spigot_ttt.items.TTTItem import de.moritzruth.spigot_ttt.utils.applyMeta +import de.moritzruth.spigot_ttt.utils.startItemDamageProgress import org.bukkit.ChatColor import org.bukkit.SoundCategory import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerToggleSprintEvent import org.bukkit.inventory.ItemFlag import org.bukkit.inventory.ItemStack import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType +import org.bukkit.scheduler.BukkitTask object CloakingDevice: TTTItem, Buyable, @@ -28,6 +30,8 @@ object CloakingDevice: TTTItem, ) addItemFlags(ItemFlag.HIDE_ATTRIBUTES) } + private const val COOLDOWN = 10.0 + override val type = TTTItem.Type.SPECIAL override val price = 2 override val buyableBy = roles(Role.TRAITOR, Role.JACKAL) @@ -36,35 +40,36 @@ object CloakingDevice: TTTItem, val isc = InversedStateContainer(State::class) override fun onSelect(tttPlayer: TTTPlayer) {} - override fun onDeselect(tttPlayer: TTTPlayer) = setEnabled(tttPlayer, false) + override fun onDeselect(tttPlayer: TTTPlayer) = disable(tttPlayer) - fun setEnabled(tttPlayer: TTTPlayer, value: Boolean?) { + private fun enable(tttPlayer: TTTPlayer) { val state = isc.getOrCreate(tttPlayer) - if (state.enabled == value) return - if (value ?: !state.enabled) { - tttPlayer.player.apply { - isSprinting = false - walkSpeed = 0.1F + tttPlayer.player.apply { + isSprinting = false + walkSpeed = 0.1F - // To prevent jumping (amplifier 200) - addPotionEffect(PotionEffect(PotionEffectType.JUMP, 1000000, 200, false, false)) + // To prevent jumping (amplifier 200) + addPotionEffect(PotionEffect(PotionEffectType.JUMP, 1000000, 200, false, false)) - playSound(location, ResourcePack.Sounds.Item.CloakingDevice.on, SoundCategory.PLAYERS, 1F, 1F) - } - - tttPlayer.invisible = true - state.enabled = true - } else { - tttPlayer.player.apply { - walkSpeed = 0.2F - removePotionEffect(PotionEffectType.JUMP) - playSound(location, ResourcePack.Sounds.Item.CloakingDevice.off, SoundCategory.PLAYERS, 1F, 1F) - } - - tttPlayer.invisible = false - state.enabled = false + playSound(location, ResourcePack.Sounds.Item.CloakingDevice.on, SoundCategory.PLAYERS, 1F, 1F) } + + tttPlayer.invisible = true + state.enabled = true + } + + private fun disable(tttPlayer: TTTPlayer) { + val state = isc.getOrCreate(tttPlayer) + + tttPlayer.player.apply { + walkSpeed = 0.2F + removePotionEffect(PotionEffectType.JUMP) + playSound(location, ResourcePack.Sounds.Item.CloakingDevice.off, SoundCategory.PLAYERS, 1F, 1F) + } + + tttPlayer.invisible = false + state.enabled = false } override val listener = object : TTTItemListener(this, true) { @@ -73,12 +78,27 @@ object CloakingDevice: TTTItem, if (event.isSprinting && isc.getOrCreate(tttPlayer).enabled) event.isCancelled = true } - override fun onRightClick(data: Data) { - setEnabled(data.tttPlayer, null) + @EventHandler + fun onTTTPlayerDeath(event: TTTPlayerDeathEvent) = isc.get(event.tttPlayer)?.cooldownTask?.cancel() + + @EventHandler + fun onGameEnd(event: GameEndEvent) = isc.forEveryState { state, _ -> state.cooldownTask?.cancel() } + + override fun onRightClick(data: ClickEventData) { + val state = isc.getOrCreate(data.tttPlayer) + if (state.cooldownTask != null) return + + if (state.enabled) { + disable(data.tttPlayer) + state.cooldownTask = startItemDamageProgress(data.itemStack, COOLDOWN) { state.cooldownTask = null } + } else { + enable(data.tttPlayer) + } } } class State: IState { var enabled: Boolean = false + var cooldownTask: BukkitTask? = null } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/EnderPearl.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/EnderPearl.kt index 68a23bd..614c038 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/EnderPearl.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/EnderPearl.kt @@ -8,7 +8,6 @@ import de.moritzruth.spigot_ttt.items.TTTItem import de.moritzruth.spigot_ttt.utils.applyMeta import org.bukkit.ChatColor import org.bukkit.Material -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.inventory.ItemStack object EnderPearl: TTTItem, Buyable { @@ -21,7 +20,7 @@ object EnderPearl: TTTItem, Buyable { override val buyLimit: Int? = null override val listener = object : TTTItemListener(this, true) { - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { data.event.isCancelled = false } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/FakeCorpse.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/FakeCorpse.kt index b71106f..da74636 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/FakeCorpse.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/FakeCorpse.kt @@ -17,7 +17,6 @@ import org.bukkit.event.EventHandler import org.bukkit.event.inventory.ClickType import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.inventory.InventoryType -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.SkullMeta @@ -74,7 +73,7 @@ object FakeCorpse: TTTItem, Buyable { } override val listener = object : TTTItemListener(this, true) { - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { isc.getOrCreate(data.tttPlayer).chosenRole = null data.tttPlayer.player.openInventory(chooseRoleInventory) } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Fireball.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Fireball.kt index 1ed1da8..debd5dc 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Fireball.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Fireball.kt @@ -17,7 +17,6 @@ import org.bukkit.SoundCategory import org.bukkit.entity.EntityType import org.bukkit.event.EventHandler import org.bukkit.event.entity.ExplosionPrimeEvent -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.inventory.ItemStack typealias FireballEntity = org.bukkit.entity.Fireball @@ -39,7 +38,7 @@ object Fireball: TTTItem, Buyable { val sendersByEntity = mutableMapOf() override val listener = object : TTTItemListener(this, true) { - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { data.tttPlayer.player.inventory.clearHeldItemSlot() val vector = data.tttPlayer.player.eyeLocation.toVector() diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/HealingPotion.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/HealingPotion.kt index 3338b10..095b5c5 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/HealingPotion.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/HealingPotion.kt @@ -10,7 +10,6 @@ import org.bukkit.ChatColor import org.bukkit.Material import org.bukkit.attribute.Attribute import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerItemConsumeEvent import org.bukkit.inventory.ItemFlag import org.bukkit.inventory.ItemStack @@ -45,7 +44,7 @@ object HealingPotion: TTTItem, Buyable { event.player.health = event.player.getAttribute(Attribute.GENERIC_MAX_HEALTH)?.value ?: 100.0 } - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { data.event.isCancelled = false } } diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Teleporter.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Teleporter.kt index 40b8033..86f08aa 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Teleporter.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/impl/Teleporter.kt @@ -12,7 +12,6 @@ import de.moritzruth.spigot_ttt.utils.clearHeldItemSlot import org.bukkit.ChatColor import org.bukkit.Sound import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.event.player.PlayerSwapHandItemsEvent import org.bukkit.inventory.ItemStack @@ -56,7 +55,7 @@ object Teleporter: TTTItem, Buyable { } } - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { val tttPlayer = data.tttPlayer val state = isc.getOrCreate(tttPlayer) diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/items/weapons/guns/Gun.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/items/weapons/guns/Gun.kt index fc97bed..3d8c192 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/items/weapons/guns/Gun.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/items/weapons/guns/Gun.kt @@ -18,7 +18,6 @@ import org.bukkit.* import org.bukkit.entity.Item import org.bukkit.entity.Player import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerInteractEvent import org.bukkit.inventory.ItemFlag import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable @@ -193,13 +192,13 @@ abstract class Gun( } override val listener = object : TTTItemListener(this, true) { - override fun onLeftClick(data: Data) { + override fun onLeftClick(data: ClickEventData) { try { reload(data.tttPlayer, data.event.item!!) } catch (e: ActionInProgressError) {} } - override fun onRightClick(data: Data) { + override fun onRightClick(data: ClickEventData) { try { shoot(data.tttPlayer, data.event.item!!) } catch (e: ActionInProgressError) {} diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/utils/ItemDamageProgress.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/utils/ItemDamageProgress.kt index f1423f8..698ad08 100644 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/utils/ItemDamageProgress.kt +++ b/src/main/kotlin/de/moritzruth/spigot_ttt/utils/ItemDamageProgress.kt @@ -17,8 +17,7 @@ fun startItemDamageProgress(itemStack: ItemStack, duration: Double, startProgres val secondsElapsed = (Instant.now().toEpochMilli() - startedAt) / 1000.0 val progress = secondsElapsed / duration + startProgress - val maxDurability = getMaxDurability(itemStack.type) - + val maxDurability = itemStack.type.maxDurability val damageMeta = itemStack.itemMeta!! as Damageable if (fromRight) { diff --git a/src/main/kotlin/de/moritzruth/spigot_ttt/utils/MaxDurabilitiesOfItems.kt b/src/main/kotlin/de/moritzruth/spigot_ttt/utils/MaxDurabilitiesOfItems.kt deleted file mode 100644 index ff8447d..0000000 --- a/src/main/kotlin/de/moritzruth/spigot_ttt/utils/MaxDurabilitiesOfItems.kt +++ /dev/null @@ -1,15 +0,0 @@ -package de.moritzruth.spigot_ttt.utils - -import org.bukkit.Material - -val maxDurabilitiesOfItems = mapOf( - Material.WOODEN_HOE to 59, - Material.STONE_HOE to 131, - Material.GOLDEN_HOE to 32, - Material.IRON_HOE to 250, - Material.DIAMOND_HOE to 1561, - Material.IRON_AXE to 250, - Material.IRON_HELMET to 165 -) - -fun getMaxDurability(material: Material) = maxDurabilitiesOfItems[material] ?: throw Exception("The maximum durability of this item is not defined")