Class ChunkResourceManager
java.lang.Object
net.chen.legacyLand.resource.pricing.ChunkResourceManager
区块资源稀缺度定价系统的核心管理器(P1:储量普查;P2:采集累加 + 定时衰减)。
设计要点:
- Lazy 加载:玩家进入区块时若 DB 无记录则触发一次扫描,避免一次性遍历整张地图。
- 内存缓存:扫描结果以 ConcurrentHashMap 缓存,避免重复查询 DB。
- 扫描去重:scanLock 集合保证同一区块不会被并发扫描。
- 异步:快照在事件线程获取后,扫描+持久化在虚拟线程执行。
- P2 延迟衰减:BlockBreak/Explode 仅在
pendingDecrements累加, 由ChunkResourceRecalcTask定时 flush,避免每次破坏触发 DB 写。
-
Method Summary
Modifier and TypeMethodDescriptionvoidaccumulateDecrement(String world, int chunkX, int chunkZ, double delta) 累加一个待 flush 的衰减量。booleanconsumePlayerPlaced(String world, int chunkX, int chunkZ, int bx, int by, int bz) 查询并移除玩家放置标记(一次性消耗)。voiddecrementCurrentValue(String world, int x, int z, double delta) 兼容旧调用方的入口。void由ChunkResourceRecalcTask定时调用: 1) 抽取pendingDecrements快照并清空; 2) 逐项更新 cache、写库(DatabaseManager.decrementChunkResource(String, int, int, double)); 3) 若 currentValue 由 >0 降到 ≤0,触发ChunkExhaustedEvent。查询区块储量数据;优先从缓存读取,缺失则懒加载一次。longintlongintlonglongstatic ChunkResourceManagerinit(LegacyLand plugin) voidmarkPlayerPlaced(String world, int chunkX, int chunkZ, int bx, int by, int bz) 标记一个由玩家放置的方块;再次破坏该方块时不计入耗竭。voidscanIfAbsent(org.bukkit.Chunk chunk) 在区块加载事件触发时调用: 1) 查缓存 / DB,命中则缓存返回; 2) 未命中则提交虚拟线程异步扫描。
-
Method Details
-
init
-
scanIfAbsent
public void scanIfAbsent(org.bukkit.Chunk chunk) 在区块加载事件触发时调用: 1) 查缓存 / DB,命中则缓存返回; 2) 未命中则提交虚拟线程异步扫描。调用方必须保证 chunk 在主线程或对应区域线程上下文,因为
Chunk.getChunkSnapshot()不能在任意异步线程调用。 -
get
查询区块储量数据;优先从缓存读取,缺失则懒加载一次。 -
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
累加一个待 flush 的衰减量。仅写内存,不触发 DB 与价格计算。 由 BlockBreakEvent / BlockExplodeEvent / EntityExplodeEvent 监听器调用。 -
markPlayerPlaced
标记一个由玩家放置的方块;再次破坏该方块时不计入耗竭。 -
consumePlayerPlaced
查询并移除玩家放置标记(一次性消耗)。命中 true 表示该方块由玩家放置,调用方应跳过累加。 -
flushPendingDecrements
public void flushPendingDecrements()由ChunkResourceRecalcTask定时调用: 1) 抽取pendingDecrements快照并清空; 2) 逐项更新 cache、写库(DatabaseManager.decrementChunkResource(String, int, int, double)); 3) 若 currentValue 由 >0 降到 ≤0,触发ChunkExhaustedEvent。 -
decrementCurrentValue
兼容旧调用方的入口。P2 起转发到accumulateDecrement(String, int, int, double),不再立刻写库。 -
getPlugin
-