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
|
val sidekick = Material.BLUE_STAINED_GLASS_PANE
|
||||||
|
|
||||||
// Special Item
|
// Special Item
|
||||||
val cloakingDevice = Material.COBWEB
|
val cloakingDevice = Material.STONE_AXE
|
||||||
val radar = Material.IRON_HELMET
|
val radar = Material.IRON_HELMET
|
||||||
val teleporter = Material.SPRUCE_WOOD
|
val teleporter = Material.SPRUCE_WOOD
|
||||||
val martyrdomGrenade = Material.BIRCH_LOG
|
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.isLeftClick
|
||||||
import de.moritzruth.spigot_ttt.utils.isRightClick
|
import de.moritzruth.spigot_ttt.utils.isRightClick
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.event.Event
|
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
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.PlayerInteractEvent
|
||||||
import org.bukkit.event.player.PlayerItemConsumeEvent
|
import org.bukkit.event.player.PlayerItemConsumeEvent
|
||||||
import org.bukkit.event.player.PlayerSwapHandItemsEvent
|
import org.bukkit.event.player.PlayerSwapHandItemsEvent
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamage: Boolean): Listener {
|
open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamage: Boolean): Listener {
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@ -26,14 +26,13 @@ open class TTTItemListener(private val tttItem: TTTItem, private val cancelDamag
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onPlayerInteract(event: PlayerInteractEvent) = handle(event) { tttPlayer ->
|
fun onPlayerInteract(event: PlayerInteractEvent) = handle(event) { tttPlayer ->
|
||||||
event.isCancelled = true
|
event.isCancelled = true
|
||||||
val data = Data(tttPlayer, event)
|
val data = ClickEventData(tttPlayer, event.item!!, event)
|
||||||
if (event.action.isRightClick) onRightClick(data)
|
if (event.action.isRightClick) onRightClick(data)
|
||||||
else if (event.action.isLeftClick) onLeftClick(data)
|
else if (event.action.isLeftClick) onLeftClick(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun onRightClick(data: Data<PlayerInteractEvent>) {}
|
open fun onRightClick(data: ClickEventData) {}
|
||||||
|
open fun onLeftClick(data: ClickEventData) {}
|
||||||
open fun onLeftClick(data: Data<PlayerInteractEvent>) {}
|
|
||||||
|
|
||||||
protected fun handle(event: PlayerInteractEvent, handler: (tttPlayer: TTTPlayer) -> Unit) {
|
protected fun handle(event: PlayerInteractEvent, handler: (tttPlayer: TTTPlayer) -> Unit) {
|
||||||
if (event.item?.type == tttItem.itemStack.type) {
|
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.ResourcePack
|
||||||
import de.moritzruth.spigot_ttt.TTTItemListener
|
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.game.players.*
|
||||||
import de.moritzruth.spigot_ttt.items.Buyable
|
import de.moritzruth.spigot_ttt.items.Buyable
|
||||||
import de.moritzruth.spigot_ttt.items.Selectable
|
import de.moritzruth.spigot_ttt.items.Selectable
|
||||||
import de.moritzruth.spigot_ttt.items.TTTItem
|
import de.moritzruth.spigot_ttt.items.TTTItem
|
||||||
import de.moritzruth.spigot_ttt.utils.applyMeta
|
import de.moritzruth.spigot_ttt.utils.applyMeta
|
||||||
|
import de.moritzruth.spigot_ttt.utils.startItemDamageProgress
|
||||||
import org.bukkit.ChatColor
|
import org.bukkit.ChatColor
|
||||||
import org.bukkit.SoundCategory
|
import org.bukkit.SoundCategory
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.event.player.PlayerToggleSprintEvent
|
import org.bukkit.event.player.PlayerToggleSprintEvent
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.potion.PotionEffect
|
import org.bukkit.potion.PotionEffect
|
||||||
import org.bukkit.potion.PotionEffectType
|
import org.bukkit.potion.PotionEffectType
|
||||||
|
import org.bukkit.scheduler.BukkitTask
|
||||||
|
|
||||||
object CloakingDevice: TTTItem,
|
object CloakingDevice: TTTItem,
|
||||||
Buyable,
|
Buyable,
|
||||||
|
@ -28,6 +30,8 @@ object CloakingDevice: TTTItem,
|
||||||
)
|
)
|
||||||
addItemFlags(ItemFlag.HIDE_ATTRIBUTES)
|
addItemFlags(ItemFlag.HIDE_ATTRIBUTES)
|
||||||
}
|
}
|
||||||
|
private const val COOLDOWN = 10.0
|
||||||
|
|
||||||
override val type = TTTItem.Type.SPECIAL
|
override val type = TTTItem.Type.SPECIAL
|
||||||
override val price = 2
|
override val price = 2
|
||||||
override val buyableBy = roles(Role.TRAITOR, Role.JACKAL)
|
override val buyableBy = roles(Role.TRAITOR, Role.JACKAL)
|
||||||
|
@ -36,35 +40,36 @@ object CloakingDevice: TTTItem,
|
||||||
val isc = InversedStateContainer(State::class)
|
val isc = InversedStateContainer(State::class)
|
||||||
|
|
||||||
override fun onSelect(tttPlayer: TTTPlayer) {}
|
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)
|
val state = isc.getOrCreate(tttPlayer)
|
||||||
if (state.enabled == value) return
|
|
||||||
|
|
||||||
if (value ?: !state.enabled) {
|
tttPlayer.player.apply {
|
||||||
tttPlayer.player.apply {
|
isSprinting = false
|
||||||
isSprinting = false
|
walkSpeed = 0.1F
|
||||||
walkSpeed = 0.1F
|
|
||||||
|
|
||||||
// To prevent jumping (amplifier 200)
|
// To prevent jumping (amplifier 200)
|
||||||
addPotionEffect(PotionEffect(PotionEffectType.JUMP, 1000000, 200, false, false))
|
addPotionEffect(PotionEffect(PotionEffectType.JUMP, 1000000, 200, false, false))
|
||||||
|
|
||||||
playSound(location, ResourcePack.Sounds.Item.CloakingDevice.on, SoundCategory.PLAYERS, 1F, 1F)
|
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
override val listener = object : TTTItemListener(this, true) {
|
||||||
|
@ -73,12 +78,27 @@ object CloakingDevice: TTTItem,
|
||||||
if (event.isSprinting && isc.getOrCreate(tttPlayer).enabled) event.isCancelled = true
|
if (event.isSprinting && isc.getOrCreate(tttPlayer).enabled) event.isCancelled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
@EventHandler
|
||||||
setEnabled(data.tttPlayer, null)
|
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 {
|
class State: IState {
|
||||||
var enabled: Boolean = false
|
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 de.moritzruth.spigot_ttt.utils.applyMeta
|
||||||
import org.bukkit.ChatColor
|
import org.bukkit.ChatColor
|
||||||
import org.bukkit.Material
|
import org.bukkit.Material
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
object EnderPearl: TTTItem, Buyable {
|
object EnderPearl: TTTItem, Buyable {
|
||||||
|
@ -21,7 +20,7 @@ object EnderPearl: TTTItem, Buyable {
|
||||||
override val buyLimit: Int? = null
|
override val buyLimit: Int? = null
|
||||||
|
|
||||||
override val listener = object : TTTItemListener(this, true) {
|
override val listener = object : TTTItemListener(this, true) {
|
||||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
override fun onRightClick(data: ClickEventData) {
|
||||||
data.event.isCancelled = false
|
data.event.isCancelled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.inventory.ClickType
|
import org.bukkit.event.inventory.ClickType
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent
|
import org.bukkit.event.inventory.InventoryClickEvent
|
||||||
import org.bukkit.event.inventory.InventoryType
|
import org.bukkit.event.inventory.InventoryType
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.inventory.Inventory
|
import org.bukkit.inventory.Inventory
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.inventory.meta.SkullMeta
|
import org.bukkit.inventory.meta.SkullMeta
|
||||||
|
@ -74,7 +73,7 @@ object FakeCorpse: TTTItem, Buyable {
|
||||||
}
|
}
|
||||||
|
|
||||||
override val listener = object : TTTItemListener(this, true) {
|
override val listener = object : TTTItemListener(this, true) {
|
||||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
override fun onRightClick(data: ClickEventData) {
|
||||||
isc.getOrCreate(data.tttPlayer).chosenRole = null
|
isc.getOrCreate(data.tttPlayer).chosenRole = null
|
||||||
data.tttPlayer.player.openInventory(chooseRoleInventory)
|
data.tttPlayer.player.openInventory(chooseRoleInventory)
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import org.bukkit.SoundCategory
|
||||||
import org.bukkit.entity.EntityType
|
import org.bukkit.entity.EntityType
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.entity.ExplosionPrimeEvent
|
import org.bukkit.event.entity.ExplosionPrimeEvent
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
typealias FireballEntity = org.bukkit.entity.Fireball
|
typealias FireballEntity = org.bukkit.entity.Fireball
|
||||||
|
@ -39,7 +38,7 @@ object Fireball: TTTItem, Buyable {
|
||||||
val sendersByEntity = mutableMapOf<FireballEntity, TTTPlayer>()
|
val sendersByEntity = mutableMapOf<FireballEntity, TTTPlayer>()
|
||||||
|
|
||||||
override val listener = object : TTTItemListener(this, true) {
|
override val listener = object : TTTItemListener(this, true) {
|
||||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
override fun onRightClick(data: ClickEventData) {
|
||||||
data.tttPlayer.player.inventory.clearHeldItemSlot()
|
data.tttPlayer.player.inventory.clearHeldItemSlot()
|
||||||
|
|
||||||
val vector = data.tttPlayer.player.eyeLocation.toVector()
|
val vector = data.tttPlayer.player.eyeLocation.toVector()
|
||||||
|
|
|
@ -10,7 +10,6 @@ import org.bukkit.ChatColor
|
||||||
import org.bukkit.Material
|
import org.bukkit.Material
|
||||||
import org.bukkit.attribute.Attribute
|
import org.bukkit.attribute.Attribute
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.event.player.PlayerItemConsumeEvent
|
import org.bukkit.event.player.PlayerItemConsumeEvent
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import org.bukkit.inventory.ItemStack
|
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
|
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
|
data.event.isCancelled = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import de.moritzruth.spigot_ttt.utils.clearHeldItemSlot
|
||||||
import org.bukkit.ChatColor
|
import org.bukkit.ChatColor
|
||||||
import org.bukkit.Sound
|
import org.bukkit.Sound
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.event.player.PlayerSwapHandItemsEvent
|
import org.bukkit.event.player.PlayerSwapHandItemsEvent
|
||||||
import org.bukkit.inventory.ItemStack
|
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 tttPlayer = data.tttPlayer
|
||||||
val state = isc.getOrCreate(tttPlayer)
|
val state = isc.getOrCreate(tttPlayer)
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import org.bukkit.*
|
||||||
import org.bukkit.entity.Item
|
import org.bukkit.entity.Item
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.player.PlayerInteractEvent
|
|
||||||
import org.bukkit.inventory.ItemFlag
|
import org.bukkit.inventory.ItemFlag
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.inventory.meta.Damageable
|
import org.bukkit.inventory.meta.Damageable
|
||||||
|
@ -193,13 +192,13 @@ abstract class Gun(
|
||||||
}
|
}
|
||||||
|
|
||||||
override val listener = object : TTTItemListener(this, true) {
|
override val listener = object : TTTItemListener(this, true) {
|
||||||
override fun onLeftClick(data: Data<PlayerInteractEvent>) {
|
override fun onLeftClick(data: ClickEventData) {
|
||||||
try {
|
try {
|
||||||
reload(data.tttPlayer, data.event.item!!)
|
reload(data.tttPlayer, data.event.item!!)
|
||||||
} catch (e: ActionInProgressError) {}
|
} catch (e: ActionInProgressError) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRightClick(data: Data<PlayerInteractEvent>) {
|
override fun onRightClick(data: ClickEventData) {
|
||||||
try {
|
try {
|
||||||
shoot(data.tttPlayer, data.event.item!!)
|
shoot(data.tttPlayer, data.event.item!!)
|
||||||
} catch (e: ActionInProgressError) {}
|
} catch (e: ActionInProgressError) {}
|
||||||
|
|
|
@ -17,8 +17,7 @@ fun startItemDamageProgress(itemStack: ItemStack, duration: Double, startProgres
|
||||||
val secondsElapsed = (Instant.now().toEpochMilli() - startedAt) / 1000.0
|
val secondsElapsed = (Instant.now().toEpochMilli() - startedAt) / 1000.0
|
||||||
val progress = secondsElapsed / duration + startProgress
|
val progress = secondsElapsed / duration + startProgress
|
||||||
|
|
||||||
val maxDurability = getMaxDurability(itemStack.type)
|
val maxDurability = itemStack.type.maxDurability
|
||||||
|
|
||||||
val damageMeta = itemStack.itemMeta!! as Damageable
|
val damageMeta = itemStack.itemMeta!! as Damageable
|
||||||
|
|
||||||
if (fromRight) {
|
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