Class ChunkResourceManager

java.lang.Object
net.chen.legacyLand.resource.pricing.ChunkResourceManager

public class ChunkResourceManager extends Object
区块资源稀缺度定价系统的核心管理器(P1:储量普查;P2:采集累加 + 定时衰减)。

设计要点:

  • Lazy 加载:玩家进入区块时若 DB 无记录则触发一次扫描,避免一次性遍历整张地图。
  • 内存缓存:扫描结果以 ConcurrentHashMap 缓存,避免重复查询 DB。
  • 扫描去重:scanLock 集合保证同一区块不会被并发扫描。
  • 异步:快照在事件线程获取后,扫描+持久化在虚拟线程执行。
  • P2 延迟衰减:BlockBreak/Explode 仅在 pendingDecrements 累加, 由 ChunkResourceRecalcTask 定时 flush,避免每次破坏触发 DB 写。
  • Method Details

    • init

      public static ChunkResourceManager init(LegacyLand plugin)
    • scanIfAbsent

      public void scanIfAbsent(org.bukkit.Chunk chunk)
      在区块加载事件触发时调用: 1) 查缓存 / DB,命中则缓存返回; 2) 未命中则提交虚拟线程异步扫描。

      调用方必须保证 chunk 在主线程或对应区域线程上下文,因为 Chunk.getChunkSnapshot() 不能在任意异步线程调用。

    • get

      public Optional<ChunkResourceData> get(String world, int x, int z)
      查询区块储量数据;优先从缓存读取,缺失则懒加载一次。
    • getScanCount

      public long getScanCount()
    • getCacheHit

      public long getCacheHit()
    • getCacheSize

      public int getCacheSize()
    • getTotalDecremented

      public long getTotalDecremented()
    • getExhaustedEventCount

      public long getExhaustedEventCount()
    • getPendingDecrementCount

      public int getPendingDecrementCount()
    • accumulateDecrement

      public void accumulateDecrement(String world, int chunkX, int chunkZ, double delta)
      累加一个待 flush 的衰减量。仅写内存,不触发 DB 与价格计算。 由 BlockBreakEvent / BlockExplodeEvent / EntityExplodeEvent 监听器调用。
    • markPlayerPlaced

      public void markPlayerPlaced(String world, int chunkX, int chunkZ, int bx, int by, int bz)
      标记一个由玩家放置的方块;再次破坏该方块时不计入耗竭。
    • consumePlayerPlaced

      public boolean consumePlayerPlaced(String world, int chunkX, int chunkZ, int bx, int by, int bz)
      查询并移除玩家放置标记(一次性消耗)。命中 true 表示该方块由玩家放置,调用方应跳过累加。
    • flushPendingDecrements

      public void flushPendingDecrements()
      由 ChunkResourceRecalcTask 定时调用: 1) 抽取 pendingDecrements 快照并清空; 2) 逐项更新 cache、写库(DatabaseManager.decrementChunkResource(String, int, int, double)); 3) 若 currentValue 由 >0 降到 ≤0,触发 ChunkExhaustedEvent。
    • decrementCurrentValue

      public void decrementCurrentValue(String world, int x, int z, double delta)
      兼容旧调用方的入口。P2 起转发到 accumulateDecrement(String, int, int, double),不再立刻写库。
    • getPlugin

      public LegacyLand getPlugin()