1
0
Fork 0

Add cooldown to Cloaking Device

This commit is contained in:
Moritz Ruth 2020-06-09 19:01:44 +02:00
parent e658f3a3b7
commit cc787cd5f5
No known key found for this signature in database
GPG key ID: AFD57E23E753841B
11 changed files with 64 additions and 63 deletions

View file

@ -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

View file

@ -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
)
} }

View file

@ -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
} }
} }

View file

@ -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
} }
} }

View file

@ -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)
} }

View file

@ -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()

View file

@ -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
} }
} }

View file

@ -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)

View file

@ -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) {}

View file

@ -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) {

View file

@ -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")