docs: Remove excessive Javadoc and inline comments from item and registry classes.
This commit is contained in:
parent
a47930ac87
commit
0a8011d65b
|
|
@ -3,10 +3,6 @@ package net.hareworks.hcu.items.domain
|
||||||
object ItemRegistry {
|
object ItemRegistry {
|
||||||
private val items = mutableMapOf<String, SpecialItem>()
|
private val items = mutableMapOf<String, SpecialItem>()
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers a special item.
|
|
||||||
* @throws IllegalArgumentException if an item with the same ID is already registered.
|
|
||||||
*/
|
|
||||||
fun register(item: SpecialItem) {
|
fun register(item: SpecialItem) {
|
||||||
if (items.containsKey(item.id)) {
|
if (items.containsKey(item.id)) {
|
||||||
throw IllegalArgumentException("Item with id ${item.id} is already registered")
|
throw IllegalArgumentException("Item with id ${item.id} is already registered")
|
||||||
|
|
@ -14,16 +10,10 @@ object ItemRegistry {
|
||||||
items[item.id] = item
|
items[item.id] = item
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a special item by its ID.
|
|
||||||
*/
|
|
||||||
fun get(id: String): SpecialItem? {
|
fun get(id: String): SpecialItem? {
|
||||||
return items[id]
|
return items[id]
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets all registered special items.
|
|
||||||
*/
|
|
||||||
fun getAll(): Collection<SpecialItem> {
|
fun getAll(): Collection<SpecialItem> {
|
||||||
return items.values
|
return items.values
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,23 +5,12 @@ import org.bukkit.NamespacedKey
|
||||||
import org.bukkit.inventory.ItemStack
|
import org.bukkit.inventory.ItemStack
|
||||||
import org.bukkit.persistence.PersistentDataType
|
import org.bukkit.persistence.PersistentDataType
|
||||||
|
|
||||||
/**
|
|
||||||
* Base class for all special HCU items.
|
|
||||||
*
|
|
||||||
* @property id The unique identifier for this special item.
|
|
||||||
*/
|
|
||||||
abstract class SpecialItem(val id: String) {
|
abstract class SpecialItem(val id: String) {
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new ItemStack for this special item.
|
|
||||||
* Subclasses should override [buildItem] to define the item's properties.
|
|
||||||
* @param tier The tier of the item to create. Defaults to [Tier.ONE].
|
|
||||||
*/
|
|
||||||
fun createItemStack(tier: Tier = Tier.ONE): ItemStack {
|
fun createItemStack(tier: Tier = Tier.ONE): ItemStack {
|
||||||
val item = buildItem(tier)
|
val item = buildItem(tier)
|
||||||
val meta = item.itemMeta ?: return item
|
val meta = item.itemMeta ?: return item
|
||||||
|
|
||||||
// Tag the item as a special HCU item
|
|
||||||
meta.persistentDataContainer.set(KEY_HCU_ITEM_ID, PersistentDataType.STRING, id)
|
meta.persistentDataContainer.set(KEY_HCU_ITEM_ID, PersistentDataType.STRING, id)
|
||||||
meta.persistentDataContainer.set(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER, tier.level)
|
meta.persistentDataContainer.set(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER, tier.level)
|
||||||
|
|
||||||
|
|
@ -29,61 +18,32 @@ abstract class SpecialItem(val id: String) {
|
||||||
return item
|
return item
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Builds the base ItemStack.
|
|
||||||
* This method should configure the material, name, lore, etc.
|
|
||||||
* @param tier The tier of the item being built.
|
|
||||||
*/
|
|
||||||
protected abstract fun buildItem(tier: Tier): ItemStack
|
protected abstract fun buildItem(tier: Tier): ItemStack
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a player interacts with this item.
|
|
||||||
*/
|
|
||||||
open fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) {}
|
open fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a player uses a fishing rod (casts, reels in, catches, etc).
|
|
||||||
*/
|
|
||||||
open fun onFish(event: org.bukkit.event.player.PlayerFishEvent) {}
|
open fun onFish(event: org.bukkit.event.player.PlayerFishEvent) {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a projectile from this item hits something.
|
|
||||||
*/
|
|
||||||
open fun onProjectileHit(event: org.bukkit.event.entity.ProjectileHitEvent) {}
|
open fun onProjectileHit(event: org.bukkit.event.entity.ProjectileHitEvent) {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when a projectile from this item is launched.
|
|
||||||
*/
|
|
||||||
open fun onProjectileLaunch(event: org.bukkit.event.entity.ProjectileLaunchEvent) {}
|
open fun onProjectileLaunch(event: org.bukkit.event.entity.ProjectileLaunchEvent) {}
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when the player holding this item takes damage.
|
|
||||||
*/
|
|
||||||
open fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {}
|
open fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val KEY_HCU_ITEM_ID = NamespacedKey("hcu_items", "id")
|
val KEY_HCU_ITEM_ID = NamespacedKey("hcu_items", "id")
|
||||||
val KEY_HCU_ITEM_TIER = NamespacedKey("hcu_items", "tier")
|
val KEY_HCU_ITEM_TIER = NamespacedKey("hcu_items", "tier")
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if the given item is a special HCU item.
|
|
||||||
*/
|
|
||||||
fun isSpecialItem(item: ItemStack?): Boolean {
|
fun isSpecialItem(item: ItemStack?): Boolean {
|
||||||
if (item == null || item.type.isAir) return false
|
if (item == null || item.type.isAir) return false
|
||||||
return item.itemMeta?.persistentDataContainer?.has(KEY_HCU_ITEM_ID, PersistentDataType.STRING) == true
|
return item.itemMeta?.persistentDataContainer?.has(KEY_HCU_ITEM_ID, PersistentDataType.STRING) == true
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the HCU item ID from the given item, or null if it's not a special item.
|
|
||||||
*/
|
|
||||||
fun getId(item: ItemStack?): String? {
|
fun getId(item: ItemStack?): String? {
|
||||||
if (item == null || item.type.isAir) return null
|
if (item == null || item.type.isAir) return null
|
||||||
return item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_ID, PersistentDataType.STRING)
|
return item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_ID, PersistentDataType.STRING)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the Tier of the given item. Defaults to [Tier.ONE] if not found/valid.
|
|
||||||
*/
|
|
||||||
fun getTier(item: ItemStack?): Tier {
|
fun getTier(item: ItemStack?): Tier {
|
||||||
if (item == null || item.type.isAir) return Tier.ONE
|
if (item == null || item.type.isAir) return Tier.ONE
|
||||||
val level = item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER) ?: return Tier.ONE
|
val level = item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER) ?: return Tier.ONE
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,6 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
Component.text("Tier: ${tier.level}", tier.color)
|
Component.text("Tier: ${tier.level}", tier.color)
|
||||||
))
|
))
|
||||||
|
|
||||||
// Optional: Make it unbreakable or have durability based on tier?
|
|
||||||
// meta.isUnbreakable = true
|
|
||||||
|
|
||||||
item.itemMeta = meta
|
item.itemMeta = meta
|
||||||
return item
|
return item
|
||||||
}
|
}
|
||||||
|
|
@ -31,10 +28,8 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
override fun onFish(event: PlayerFishEvent) {
|
override fun onFish(event: PlayerFishEvent) {
|
||||||
val hook = event.hook
|
val hook = event.hook
|
||||||
|
|
||||||
// Check if stuck via our custom PDC tag (meaning it hit a block and we anchored it)
|
|
||||||
val isStuck = hook.persistentDataContainer.has(KEY_HOOK_STUCK, org.bukkit.persistence.PersistentDataType.BYTE)
|
val isStuck = hook.persistentDataContainer.has(KEY_HOOK_STUCK, org.bukkit.persistence.PersistentDataType.BYTE)
|
||||||
|
|
||||||
// If reeling in and it's stuck (anchored), pull the player
|
|
||||||
if (event.state == PlayerFishEvent.State.REEL_IN && isStuck) {
|
if (event.state == PlayerFishEvent.State.REEL_IN && isStuck) {
|
||||||
val player = event.player
|
val player = event.player
|
||||||
val playerLoc = player.location
|
val playerLoc = player.location
|
||||||
|
|
@ -50,12 +45,9 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
val velocity = vector.normalize().multiply(speed)
|
val velocity = vector.normalize().multiply(speed)
|
||||||
player.velocity = velocity
|
player.velocity = velocity
|
||||||
|
|
||||||
// "飛ぶ速度に比例して空腹になる"
|
|
||||||
// Cost based on speed (magnitude of velocity)
|
|
||||||
// Base cost multiplier
|
|
||||||
val hungerCostBase = 2.0
|
val hungerCostBase = 2.0
|
||||||
// Tier reduces cost? Or just proportional to speed?
|
|
||||||
// Let's make higher tiers slightly more efficient per unit of speed.
|
|
||||||
val efficiency = 1.0 + (tier.level * 0.1)
|
val efficiency = 1.0 + (tier.level * 0.1)
|
||||||
|
|
||||||
val hungerCost = (velocity.length() * hungerCostBase / efficiency).toInt().coerceAtLeast(1)
|
val hungerCost = (velocity.length() * hungerCostBase / efficiency).toInt().coerceAtLeast(1)
|
||||||
|
|
@ -63,10 +55,9 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
player.foodLevel = (player.foodLevel - hungerCost).coerceAtLeast(0)
|
player.foodLevel = (player.foodLevel - hungerCost).coerceAtLeast(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup anchor when reeling in or if the hook is removed
|
|
||||||
if (event.state == PlayerFishEvent.State.REEL_IN ||
|
if (event.state == PlayerFishEvent.State.REEL_IN ||
|
||||||
event.state == PlayerFishEvent.State.CAUGHT_ENTITY ||
|
event.state == PlayerFishEvent.State.CAUGHT_ENTITY ||
|
||||||
event.state == PlayerFishEvent.State.BITE) { // BITE might be too early? usually REEL_IN is the end
|
event.state == PlayerFishEvent.State.BITE) {
|
||||||
|
|
||||||
val vehicle = hook.vehicle
|
val vehicle = hook.vehicle
|
||||||
if (vehicle is org.bukkit.entity.ArmorStand && vehicle.persistentDataContainer.has(KEY_ANCHOR_ID, org.bukkit.persistence.PersistentDataType.STRING)) {
|
if (vehicle is org.bukkit.entity.ArmorStand && vehicle.persistentDataContainer.has(KEY_ANCHOR_ID, org.bukkit.persistence.PersistentDataType.STRING)) {
|
||||||
|
|
@ -80,8 +71,7 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
val shooter = projectile.shooter
|
val shooter = projectile.shooter
|
||||||
|
|
||||||
if (shooter is org.bukkit.entity.Player) {
|
if (shooter is org.bukkit.entity.Player) {
|
||||||
// "浮を投げるとき投げたプレイヤーの速度が慣性に乗るようにしてください"
|
|
||||||
// Add player's velocity to the projectile
|
|
||||||
projectile.velocity = projectile.velocity.add(shooter.velocity)
|
projectile.velocity = projectile.velocity.add(shooter.velocity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -90,11 +80,8 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
if ((event.hitBlock != null || event.hitEntity != null) && event.hitBlock?.isCollidable() == true) {
|
if ((event.hitBlock != null || event.hitEntity != null) && event.hitBlock?.isCollidable() == true) {
|
||||||
val hook = event.entity
|
val hook = event.entity
|
||||||
if (hook is org.bukkit.entity.FishHook) {
|
if (hook is org.bukkit.entity.FishHook) {
|
||||||
// Determine spawn location slightly adjusted to avoid clipping into the wall too much?
|
|
||||||
// Or just exactly at the hook. Hook collision box is small.
|
|
||||||
val location = hook.location
|
val location = hook.location
|
||||||
|
|
||||||
// Spawn anchor
|
|
||||||
val anchor = location.world.spawn(location, org.bukkit.entity.ArmorStand::class.java) { stand ->
|
val anchor = location.world.spawn(location, org.bukkit.entity.ArmorStand::class.java) { stand ->
|
||||||
stand.isVisible = false
|
stand.isVisible = false
|
||||||
stand.isMarker = true
|
stand.isMarker = true
|
||||||
|
|
@ -115,11 +102,6 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {
|
override fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {
|
||||||
// "手に持っているときは落下ダメージ半減"
|
|
||||||
// "受けたダメージ分だけ空腹になる"
|
|
||||||
// "もし空腹で受けきれなかった場合は普通にダメージを受ける"
|
|
||||||
// "Tireによって空腹度合いが変わる"
|
|
||||||
|
|
||||||
if (event.cause == org.bukkit.event.entity.EntityDamageEvent.DamageCause.FALL) {
|
if (event.cause == org.bukkit.event.entity.EntityDamageEvent.DamageCause.FALL) {
|
||||||
val player = event.entity
|
val player = event.entity
|
||||||
if (player is org.bukkit.entity.Player) {
|
if (player is org.bukkit.entity.Player) {
|
||||||
|
|
@ -129,31 +111,21 @@ class GrapplingItem : SpecialItem("grappling_hook") {
|
||||||
val originalDamage = event.damage
|
val originalDamage = event.damage
|
||||||
val reducedDamage = originalDamage / 2.0
|
val reducedDamage = originalDamage / 2.0
|
||||||
val damageToAbsorb = originalDamage - reducedDamage
|
val damageToAbsorb = originalDamage - reducedDamage
|
||||||
|
|
||||||
// Hunger cost:
|
|
||||||
// Base cost is equal to damage absorbed? Or some factor?
|
|
||||||
// "Tireによって空腹度合いが変わる" -> Higher tier = cheaper
|
|
||||||
// Example: Cost = Damage * (2.5 - (0.4 * Tier))
|
|
||||||
// Tier 1: 2.1x damage, Tier 5: 0.5x damage
|
|
||||||
val costFactor = (3.0 - (0.5 * tier.level)).coerceAtLeast(0.5)
|
val costFactor = (3.0 - (0.5 * tier.level)).coerceAtLeast(0.5)
|
||||||
val hungerCostPerDamage = costFactor
|
val hungerCostPerDamage = costFactor
|
||||||
val totalHungerCost = (damageToAbsorb * hungerCostPerDamage).toInt()
|
val totalHungerCost = (damageToAbsorb * hungerCostPerDamage).toInt()
|
||||||
|
|
||||||
if (player.foodLevel >= totalHungerCost) {
|
if (player.foodLevel >= totalHungerCost) {
|
||||||
// "受けたダメージ分だけ空腹になる" (interpreted as paying the cost)
|
|
||||||
player.foodLevel = (player.foodLevel - totalHungerCost).coerceAtLeast(0)
|
player.foodLevel = (player.foodLevel - totalHungerCost).coerceAtLeast(0)
|
||||||
event.damage = reducedDamage
|
event.damage = reducedDamage
|
||||||
} else {
|
} else {
|
||||||
// "空腹で受けきれなかった場合はそのままダメージを受けるのではなく空腹で受けられる分のダメージは受けて余ったダメージを直接受けるようにしてください"
|
|
||||||
// Calculate how much damage we can absorb with available food
|
|
||||||
val availableFood = player.foodLevel
|
val availableFood = player.foodLevel
|
||||||
val damageWeCanAbsorb = availableFood / hungerCostPerDamage
|
val damageWeCanAbsorb = availableFood / hungerCostPerDamage
|
||||||
val damageWeCannotAbsorb = damageToAbsorb - damageWeCanAbsorb
|
val damageWeCannotAbsorb = damageToAbsorb - damageWeCanAbsorb
|
||||||
|
|
||||||
// Consume all available food
|
|
||||||
player.foodLevel = 0
|
player.foodLevel = 0
|
||||||
|
|
||||||
// Take reduced damage for what we could absorb, plus full damage for what we couldn't
|
|
||||||
event.damage = reducedDamage + damageWeCannotAbsorb
|
event.damage = reducedDamage + damageWeCannotAbsorb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@ class EventListener(private val plugin: App) : Listener {
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
fun onInteract(event: PlayerInteractEvent) {
|
fun onInteract(event: PlayerInteractEvent) {
|
||||||
// Only handle main hand interactions or when there's an item involved
|
|
||||||
if (event.hand == EquipmentSlot.OFF_HAND) return
|
if (event.hand == EquipmentSlot.OFF_HAND) return
|
||||||
|
|
||||||
val item = event.item ?: return
|
val item = event.item ?: return
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1 @@
|
||||||
# Elevator Plugin Configuration
|
|
||||||
|
|
||||||
# The maximum distance (in blocks) the elevator will search for a valid destination.
|
|
||||||
maxHeight: 64
|
|
||||||
|
|
||||||
# Blocks that function as elevators
|
|
||||||
elevatorBlocks:
|
|
||||||
- minecraft:iron_block
|
|
||||||
- minecraft:gold_block
|
|
||||||
- minecraft:diamond_block
|
|
||||||
- minecraft:lapis_block
|
|
||||||
- minecraft:redstone_block
|
|
||||||
- minecraft:emerald_block
|
|
||||||
- minecraft:netherite_block
|
|
||||||
- minecraft:coal_block
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user