feat: Remove eternally moist farmland feature and related logic from Area Tiller component.

This commit is contained in:
Kariya 2025-12-21 06:07:05 +00:00
parent d4c8cd84fb
commit 4f86213530
3 changed files with 4 additions and 246 deletions

View File

@ -43,13 +43,12 @@ import net.hareworks.hcu.items.util.ItemActionUtil
* AreaTillerComponent - 広範囲一括耕地化コンポーネント * AreaTillerComponent - 広範囲一括耕地化コンポーネント
* *
* クワを使用時に広範囲の土ブロックを一度に耕地化する * クワを使用時に広範囲の土ブロックを一度に耕地化する
* Tier3以上では水なしでも湿った状態を保つ特殊な耕地を生成する
*/ */
class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent { class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
override val key: NamespacedKey = NamespacedKey(plugin, "area_tiller") override val key: NamespacedKey = NamespacedKey(plugin, "area_tiller")
override val displayName: String = "Area Tiller" override val displayName: String = "Area Tiller"
override val maxTier: Int = 4 override val maxTier: Int = 2
override val minTier: Int = 1 override val minTier: Int = 1
// 耕地化対象ブロック // 耕地化対象ブロック
@ -119,42 +118,6 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
}, },
PlayerItemHeldEvent::class to { event, item -> PlayerItemHeldEvent::class to { event, item ->
handleItemHeld(event as PlayerItemHeldEvent, item) handleItemHeld(event as PlayerItemHeldEvent, item)
},
MoistureChangeEvent::class to { event, _ ->
handleMoistureChange(event as MoistureChangeEvent)
},
BlockBreakEvent::class to { event, _ ->
handleGenericBlockCleanup(event as BlockBreakEvent)
},
BlockExplodeEvent::class to { event, _ ->
handleBlockExplodeCleanup(event as BlockExplodeEvent)
},
EntityExplodeEvent::class to { event, _ ->
handleEntityExplodeCleanup(event as EntityExplodeEvent)
},
EntityInteractEvent::class to { event, _ ->
handleEntityInteractCleanup(event as EntityInteractEvent)
},
BlockFadeEvent::class to { event, _ ->
handleGenericBlockCleanup(event as BlockFadeEvent)
},
BlockFromToEvent::class to { event, _ ->
handleBlockFromToCleanup(event as BlockFromToEvent)
},
BlockPistonExtendEvent::class to { event, _ ->
handlePistonExtendCleanup(event as BlockPistonExtendEvent)
},
BlockPistonRetractEvent::class to { event, _ ->
handlePistonRetractCleanup(event as BlockPistonRetractEvent)
},
BlockPlaceEvent::class to { event, _ ->
handleGenericBlockCleanup(event as BlockPlaceEvent)
},
BlockBurnEvent::class to { event, _ ->
handleGenericBlockCleanup(event as BlockBurnEvent)
},
BlockPhysicsEvent::class to { event, _ ->
handleBlockPhysicsCleanup(event as BlockPhysicsEvent)
} }
) )
} }
@ -245,7 +208,7 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
val blocksToTill = calculateTillableBlocks(targetBlock, n, s, e, w) val blocksToTill = calculateTillableBlocks(targetBlock, n, s, e, w)
if (blocksToTill.isEmpty()) return if (blocksToTill.isEmpty()) return
val entities = createHighlightEntities(player, blocksToTill, tier >= 3) val entities = createHighlightEntities(player, blocksToTill)
activeHighlights[player.uniqueId] = HighlightSession( activeHighlights[player.uniqueId] = HighlightSession(
targetBlock, entities, System.currentTimeMillis(), n, s, e, w targetBlock, entities, System.currentTimeMillis(), n, s, e, w
) )
@ -370,7 +333,6 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
processingPlayers.add(player.uniqueId) processingPlayers.add(player.uniqueId)
try { try {
val isEternallyMoist = tier >= 3
var tilledCount = 0 var tilledCount = 0
for (block in blocks) { for (block in blocks) {
@ -390,17 +352,6 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
// 耕地化 // 耕地化
block.type = Material.FARMLAND block.type = Material.FARMLAND
// Tier3以上: 永続的な湿った状態
if (isEternallyMoist) {
val farmlandData = block.blockData as? Farmland
farmlandData?.let {
it.moisture = it.maximumMoisture
block.blockData = it
}
// 永続的な湿り状態をマーク別途Tickで維持
markEternallyMoist(block)
}
tilledCount++ tilledCount++
} }
@ -416,18 +367,6 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
0.8f + (tier * 0.1f) 0.8f + (tier * 0.1f)
) )
// Tier3以上の特殊エフェクト
if (isEternallyMoist) {
blocks.forEach { block ->
player.spawnParticle(
Particle.DRIPPING_WATER,
block.location.add(0.5, 1.0, 0.5),
3,
0.3, 0.1, 0.3,
0.0
)
}
}
} }
} finally { } finally {
// 再帰防止フラグをクリア // 再帰防止フラグをクリア
@ -435,120 +374,16 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
} }
} }
/**
* 耕地の水分量変化乾燥を監視
*/
private fun handleMoistureChange(event: MoistureChangeEvent) {
val block = event.block
// 自己浄化: 耕地でなくなった場合、あるいは乾燥しようとしている場合
if (block.type != Material.FARMLAND) {
removeMoistMark(block)
return
}
// チャンクのPDCを確認して「永続的な湿り」マークがあるかチェック
if (isMarkedAsEternallyMoist(block)) {
// 水分が減るのを阻止(イベントをキャンセル)
event.isCancelled = true
// 念のためnewStateも最大値に固定
val data = event.newState
if (data is Farmland) {
data.moisture = data.maximumMoisture
}
}
}
/**
* 汎用的なブロック消失クリーンアップ
*/
private fun handleGenericBlockCleanup(event: Event) {
val block = when (event) {
is BlockBreakEvent -> event.block
is BlockFadeEvent -> event.block
is BlockPlaceEvent -> event.block
is BlockBurnEvent -> event.block
else -> return
}
removeMoistMark(block)
}
private fun handleBlockExplodeCleanup(event: BlockExplodeEvent) {
event.blockList().forEach { removeMoistMark(it) }
}
private fun handleEntityExplodeCleanup(event: EntityExplodeEvent) {
event.blockList().forEach { removeMoistMark(it) }
}
private fun handleEntityInteractCleanup(event: EntityInteractEvent) {
// 耕地を踏みつけた時など、耕地でなくなる可能性が高いイベント
removeMoistMark(event.block)
}
private fun handleBlockFromToCleanup(event: BlockFromToEvent) {
// 水や溶岩が流れ込んで耕地が消える場合
removeMoistMark(event.block)
}
private fun handlePistonExtendCleanup(event: BlockPistonExtendEvent) {
event.blocks.forEach { removeMoistMark(it) }
}
private fun handlePistonRetractCleanup(event: BlockPistonRetractEvent) {
event.blocks.forEach { removeMoistMark(it) }
}
private fun handleBlockPhysicsCleanup(event: BlockPhysicsEvent) {
// 全ての物理更新時に、もし「以前耕地でマークされていたのに、今は耕地でない」なら削除
val block = event.block
if (block.type != Material.FARMLAND) {
removeMoistMark(block)
}
}
/**
* ブロックが永続的な湿り状態としてマークされているか確認
*/
private fun isMarkedAsEternallyMoist(block: Block): Boolean {
val chunk = block.chunk
val pdc = chunk.persistentDataContainer
val key = NamespacedKey(plugin, "moist_${block.x}_${block.y}_${block.z}")
return pdc.has(key, PersistentDataType.BYTE)
}
/**
* ブロックを永続的な湿り状態としてマーク
*/
private fun markEternallyMoist(block: Block) {
val chunk = block.chunk
val pdc = chunk.persistentDataContainer
val key = NamespacedKey(plugin, "moist_${block.x}_${block.y}_${block.z}")
pdc.set(key, PersistentDataType.BYTE, 1.toByte())
}
private fun removeMoistMark(block: Block) {
val chunk = block.chunk
val pdc = chunk.persistentDataContainer
val key = NamespacedKey(plugin, "moist_${block.x}_${block.y}_${block.z}")
if (pdc.has(key, PersistentDataType.BYTE)) {
pdc.remove(key)
}
}
/** /**
* ハイライトエンティティを作成 * ハイライトエンティティを作成
*/ */
private fun createHighlightEntities( private fun createHighlightEntities(
player: Player, player: Player,
blocks: Set<Block>, blocks: Set<Block>,
isEternallyMoist: Boolean
): List<BlockDisplay> { ): List<BlockDisplay> {
if (!supportsBlockDisplay) return emptyList() if (!supportsBlockDisplay) return emptyList()
val entities = mutableListOf<BlockDisplay>() val entities = mutableListOf<BlockDisplay>()
val highlightColor = if (isEternallyMoist) Color.AQUA else Color.LIME
for (block in blocks) { for (block in blocks) {
val loc = block.location.add(0.5, 0.5, 0.5) val loc = block.location.add(0.5, 0.5, 0.5)
@ -562,7 +397,7 @@ class AreaTillerComponent(private val plugin: JavaPlugin) : ToolComponent {
AxisAngle4f(0f, 0f, 0f, 1f) AxisAngle4f(0f, 0f, 0f, 1f)
) )
e.isGlowing = true e.isGlowing = true
e.glowColorOverride = highlightColor e.glowColorOverride = Color.LIME
e.brightness = Display.Brightness(15, 15) e.brightness = Display.Brightness(15, 15)
e.isVisibleByDefault = false e.isVisibleByDefault = false
} }

View File

@ -58,70 +58,6 @@ class EventListener(private val plugin: Plugin) : Listener {
} }
} }
/**
* MoistureChangeEvent - 耕地の水分変化乾燥を監視
* これもアイテムに紐付かないグローバルなイベントとして処理する
*/
@EventHandler
fun onMoistureChange(event: MoistureChangeEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockBreakGlobal(event: BlockBreakEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockExplodeGlobal(event: BlockExplodeEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onEntityExplodeGlobal(event: EntityExplodeEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onEntityInteractGlobal(event: EntityInteractEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockFadeGlobal(event: BlockFadeEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockFromToGlobal(event: BlockFromToEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockPistonExtendGlobal(event: BlockPistonExtendEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockPistonRetractGlobal(event: BlockPistonRetractEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockPlaceGlobal(event: BlockPlaceEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockBurnGlobal(event: BlockBurnEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onBlockPhysicsGlobal(event: BlockPhysicsEvent) {
dispatchGlobalToComponents(event)
}
@EventHandler @EventHandler
fun onPlayerQuit(event: PlayerQuitEvent) { fun onPlayerQuit(event: PlayerQuitEvent) {
ItemActionUtil.clearScrollState(event.player) ItemActionUtil.clearScrollState(event.player)
@ -152,18 +88,7 @@ class EventListener(private val plugin: Plugin) : Listener {
// Register a listener for each event type // Register a listener for each event type
for (eventClass in registeredEvents) { for (eventClass in registeredEvents) {
// Skip events that are handled manually or globally // Skip events that are handled manually or globally
if (eventClass == ProjectileHitEvent::class || if (eventClass == ProjectileHitEvent::class) continue
eventClass == MoistureChangeEvent::class ||
eventClass == EntityExplodeEvent::class ||
eventClass == BlockExplodeEvent::class ||
eventClass == EntityInteractEvent::class ||
eventClass == BlockFadeEvent::class ||
eventClass == BlockFromToEvent::class ||
eventClass == BlockPistonExtendEvent::class ||
eventClass == BlockPistonRetractEvent::class ||
eventClass == BlockPlaceEvent::class ||
eventClass == BlockBurnEvent::class ||
eventClass == BlockPhysicsEvent::class) continue
val strategy = EventStrategyRegistry.get(eventClass) val strategy = EventStrategyRegistry.get(eventClass)
if (strategy == null) { if (strategy == null) {

View File

@ -75,8 +75,6 @@ components:
max_range_per_tier: max_range_per_tier:
1: 4 # Tier1: 4x4 1: 4 # Tier1: 4x4
2: 5 # Tier2: 5x5 2: 5 # Tier2: 5x5
3: 4 # Tier3: 4x4 (永続湿り耕地)
4: 5 # Tier4: 5x5 (永続湿り耕地)
items: items:
auto_feeder: auto_feeder: