Added kits.yml

This commit is contained in:
Laurin
2025-12-08 23:37:37 +01:00
committed by GitHub
parent fef0072007
commit a3b521940c
8 changed files with 371 additions and 2 deletions

View File

@@ -0,0 +1,70 @@
package club.mcscrims.speedhg.kit
import club.mcscrims.speedhg.SpeedHG
import club.mcscrims.speedhg.ability.AbilityContext
import club.mcscrims.speedhg.ability.AbilityResult
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerInteractEvent
abstract class AbstractKit(
val id: String,
val displayName: String,
val description: List<String>,
val icon: Material,
protected val plugin: SpeedHG,
protected val abilityContext: AbilityContext
) {
lateinit var config: Map<String, Double>
open fun onSelect(player: Player) {
}
open fun onStart(player: Player) {
}
open fun onHit(attacker: Player, victim: Player, event: EntityDamageByEntityEvent) {
}
open fun onInteract(player: Player, event: PlayerInteractEvent) {
}
open fun cleanup(player: Player) {
abilityContext.clearPlayerData(player)
}
protected fun hasCooldown(player: Player, key: String): Boolean {
return abilityContext.getRemainingCooldown(player, key) > 0
}
protected fun startCooldown(player: Player, key: String, seconds: Int) {
abilityContext.cooldownManager.startCooldown(player, key, seconds)
}
protected fun getRemainingCooldown(player: Player, key: String): Double {
return abilityContext.getRemainingCooldown(player, key)
}
protected fun incrementHits(player: Player, key: String): Int {
return abilityContext.incrementHit(player, key)
}
protected fun getHits(player: Player, key: String): Int {
return abilityContext.getHits(player, key)
}
protected fun resetHits(player: Player, key: String) {
abilityContext.hitCounterManager.resetHits(player, key)
}
protected fun abilityResult(
player: Player,
abilityKey: String,
requiredHits: Int? = null,
cooldownSeconds: Int? = null
): AbilityResult {
return abilityContext.canUseAbility(player, abilityKey, requiredHits, cooldownSeconds)
}
}

View File

@@ -0,0 +1,29 @@
package club.mcscrims.speedhg.kit
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerInteractEvent
class KitListener(private val kitManager: KitManager) : Listener {
@EventHandler
fun onEntityDamage(event: EntityDamageByEntityEvent) {
val attacker = event.damager as? Player ?: return
val victim = event.entity as? Player ?: return
if (kitManager.getSelectedKit(attacker) != null) {
kitManager.triggerHit(attacker, victim, event)
}
}
@EventHandler
fun onPlayerInteract(event: PlayerInteractEvent) {
val player = event.player
if (kitManager.getSelectedKit(player) != null) {
kitManager.triggerInteract(player, event)
}
}
}

View File

@@ -0,0 +1,99 @@
package club.mcscrims.speedhg.kit
import club.mcscrims.speedhg.SpeedHG
import org.bukkit.entity.Player
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerInteractEvent
import java.util.UUID
import java.util.concurrent.ConcurrentHashMap
class KitManager(private val plugin: SpeedHG) {
private val kits = ConcurrentHashMap<String, AbstractKit>()
private val selectedKits = ConcurrentHashMap<UUID, AbstractKit>()
fun registerKit(kit: AbstractKit) {
kit.config = plugin.kitConfig.data.getConfigForKit(kit.id)
kits[kit.id.lowercase()] = kit
plugin.logger.info("Registered kit: ${kit.displayName} (${kit.id})")
}
fun getKit(id: String): AbstractKit? {
return kits[id.lowercase()]
}
fun getAllKits(): Collection<AbstractKit> {
return kits.values
}
fun selectKit(player: Player, kitId: String): Boolean {
val kit = getKit(kitId) ?: return false
val previousKit = selectedKits[player.uniqueId]
previousKit?.cleanup(player)
selectedKits[player.uniqueId] = kit
try {
kit.onSelect(player)
} catch (e: Exception) {
plugin.logger.severe("Error during onSelect for kit ${kit.id} and player ${player.name}: ${e.message}")
e.printStackTrace()
}
return true
}
fun getSelectedKit(player: Player): AbstractKit? {
return selectedKits[player.uniqueId]
}
fun startKitForPlayer(player: Player) {
val kit = selectedKits[player.uniqueId] ?: return
try {
kit.onStart(player)
} catch (e: Exception) {
plugin.logger.severe("Error during onStart for kit ${kit.id} and player ${player.name}: ${e.message}")
e.printStackTrace()
}
}
fun triggerHit(attacker: Player, victim: Player, event: EntityDamageByEntityEvent) {
val kit = selectedKits[attacker.uniqueId] ?: return
try {
kit.onHit(attacker, victim, event)
} catch (e: Exception) {
plugin.logger.severe("Error during onHit for kit ${kit.id} and player ${attacker.name}: ${e.message}")
e.printStackTrace()
}
}
fun triggerInteract(player: Player, event: PlayerInteractEvent) {
val kit = selectedKits[player.uniqueId] ?: return
try {
kit.onInteract(player, event)
} catch (e: Exception) {
plugin.logger.severe("Error during onInteract for kit ${kit.id} and player ${player.name}: ${e.message}")
e.printStackTrace()
}
}
fun clearPlayerSelection(player: Player) {
val kit = selectedKits.remove(player.uniqueId)
kit?.cleanup(player)
}
fun clearAll() {
selectedKits.values.forEach { kit ->
plugin.server.onlinePlayers.forEach { player ->
if (selectedKits[player.uniqueId] == kit) {
kit.cleanup(player)
}
}
}
selectedKits.clear()
}
}

View File

@@ -0,0 +1,85 @@
package club.mcscrims.speedhg.kit.impl
import club.mcscrims.speedhg.SpeedHG
import club.mcscrims.speedhg.ability.AbilityContext
import club.mcscrims.speedhg.kit.AbstractKit
import org.bukkit.Material
import org.bukkit.entity.Player
import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.potion.PotionEffect
import org.bukkit.potion.PotionEffectType
class AnchorKit(
plugin: SpeedHG,
abilityContext: AbilityContext
) : AbstractKit(
id = "anchor",
displayName = "Anchor",
description = listOf(
"§7Heavy and strong.",
"§7Deal extra damage after 3 hits.",
"§7Gain resistance when standing still."
),
icon = Material.ANVIL,
plugin = plugin,
abilityContext = abilityContext
) {
private val abilityKey = "anchor_ability"
private val hitCounterKey = "anchor_hits"
override fun onSelect(player: Player) {
player.sendMessage("§aYou selected §6Anchor§a!")
}
override fun onStart(player: Player) {
player.inventory.addItem(ItemStack(Material.STONE_SWORD))
player.inventory.helmet = ItemStack(Material.IRON_HELMET)
player.inventory.chestplate = ItemStack(Material.IRON_CHESTPLATE)
player.inventory.leggings = ItemStack(Material.IRON_LEGGINGS)
player.inventory.boots = ItemStack(Material.IRON_BOOTS)
}
override fun onHit(attacker: Player, victim: Player, event: EntityDamageByEntityEvent) {
val currentHits = incrementHits(attacker, hitCounterKey)
val result = abilityResult(
player = attacker,
abilityKey = abilityKey,
requiredHits = 3,
cooldownSeconds = 10
)
if (result.success) {
val extraDamage = config["offensive extra damage"] ?: 1.0
event.damage += extraDamage
attacker.sendMessage("§6⚓ Anchor Ability! §eDealt ${extraDamage} extra damage!")
victim.sendMessage("§c${attacker.name} used Anchor ability!")
} else if (result.missingHits > 0) {
attacker.sendMessage("§e⚓ Hits: $currentHits/3")
} else if (result.remainingCooldown > 0) {
attacker.sendMessage("§c⚓ Cooldown: ${String.format("%.1f", result.remainingCooldown)}s")
}
}
override fun onInteract(player: Player, event: PlayerInteractEvent) {
if (event.action.isRightClick && event.item?.type == Material.ANVIL) {
if (!hasCooldown(player, "anchor_resistance")) {
player.addPotionEffect(PotionEffect(PotionEffectType.RESISTANCE, 100, 0))
player.sendMessage("§6⚓ Resistance activated!")
startCooldown(player, "anchor_resistance", 15)
} else {
val remaining = getRemainingCooldown(player, "anchor_resistance")
player.sendMessage("§c⚓ Resistance on cooldown: ${String.format("%.1f", remaining)}s")
}
}
}
override fun cleanup(player: Player) {
super.cleanup(player)
player.sendMessage("§7Anchor kit cleaned up.")
}
}