Add cooldown to Cloaking Device
This commit is contained in:
parent
e658f3a3b7
commit
cc787cd5f5
11 changed files with 64 additions and 63 deletions
|
@ -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
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {}
|
||||
|
||||
open fun onLeftClick(data: Data<PlayerInteractEvent>) {}
|
||||
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<T: Event>(val tttPlayer: TTTPlayer, val event: T)
|
||||
data class ClickEventData(
|
||||
val tttPlayer: TTTPlayer,
|
||||
val itemStack: ItemStack,
|
||||
val event: PlayerInteractEvent
|
||||
)
|
||||
}
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
data.event.isCancelled = false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
isc.getOrCreate(data.tttPlayer).chosenRole = null
|
||||
data.tttPlayer.player.openInventory(chooseRoleInventory)
|
||||
}
|
||||
|
|
|
@ -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<FireballEntity, TTTPlayer>()
|
||||
|
||||
override val listener = object : TTTItemListener(this, true) {
|
||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
data.tttPlayer.player.inventory.clearHeldItemSlot()
|
||||
|
||||
val vector = data.tttPlayer.player.eyeLocation.toVector()
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
data.event.isCancelled = false
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
val tttPlayer = data.tttPlayer
|
||||
val state = isc.getOrCreate(tttPlayer)
|
||||
|
||||
|
|
|
@ -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<PlayerInteractEvent>) {
|
||||
override fun onLeftClick(data: ClickEventData) {
|
||||
try {
|
||||
reload(data.tttPlayer, data.event.item!!)
|
||||
} catch (e: ActionInProgressError) {}
|
||||
}
|
||||
|
||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
||||
override fun onRightClick(data: ClickEventData) {
|
||||
try {
|
||||
shoot(data.tttPlayer, data.event.item!!)
|
||||
} catch (e: ActionInProgressError) {}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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")
|
Reference in a new issue