游戏工具
common-legacy-api 模块提供了一系列游戏相关的工具,包括冷却系统、经验等级处理、物品描述映射等功能。
Baffle
注意
注意:Baffle 是一个过时的工具类。它在内部使用 ConcurrentHashMap 存储数据,但没有提供自动清理机制。必须在玩家离开游戏时调用 reset(playerId) 方法来释放缓存,否则会导致内存泄漏。在新项目中,建议使用其他更现代的冷却系统实现。
Baffle 是一个冷却工具,可以用于控制操作的频率。它支持基于时间和基于次数的两种冷却方式。
基于时间的冷却
// 创建基于时间的冷却器(5秒)
Baffle timeBaffle = Baffle.of(5, TimeUnit.SECONDS);
// 检查是否可以执行操作
if (timeBaffle.hasNext("player1")) {
// 可以执行操作
System.out.println("Action executed for player1");
}
// 检查是否可以执行操作,但不更新冷却时间
boolean canExecute = timeBaffle.hasNext("player1", false);
// 获取下次执行时间(毫秒)
long nextTime = ((Baffle.BaffleTime) timeBaffle).nextTime("player1");
// 重置冷却
timeBaffle.reset("player1");
// 强制更新数据(开始冷却)
timeBaffle.next("player1");
基于次数的冷却
// 创建基于次数的冷却器(3次)
Baffle countBaffle = Baffle.of(3);
// 检查是否可以执行操作
// 注意:对于基于次数的冷却器,hasNext 返回 false 表示还可以执行,返回 true 表示已达到次数限制
if (!countBaffle.hasNext("player1")) {
// 可以执行操作(未达到次数限制)
System.out.println("Action executed for player1");
}
// 检查是否可以执行操作,但不更新计数
boolean reachedLimit = countBaffle.hasNext("player1", false);
// 重置计数
countBaffle.reset("player1");
// 增加计数
countBaffle.next("player1");
全局冷却
// 使用 "*" 作为 ID 可以设置全局冷却
Baffle globalBaffle = Baffle.of(10, TimeUnit.SECONDS);
// 检查全局冷却
if (globalBaffle.hasNext()) {
// 全局冷却已过,可以执行操作
System.out.println("Global action executed");
}
// 重置全局冷却
globalBaffle.reset();
// 开始全局冷却
globalBaffle.next();