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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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