AchievementUnlockMessage
基本信息
| 属性 | 值 |
|---|---|
| 类名 | betterachievements.handler.message.AchievementUnlockMessage |
| 类型 | IMessage + IMessageHandler<AchievementUnlockMessage, IMessage> |
| 源文件 | src/main/java/betterachievements/handler/message/AchievementUnlockMessage.java |
| 注册方向 | Client → Server |
功能
创造模式玩家在 GuiBetterAchievements 上右键一个成就时,客户端发送此消息让服务端递归解锁该成就及其所有父成就。
数据格式(toBytes / fromBytes)
public void toBytes(ByteBuf buf) {
byte[] bytes = this.achievementId.getBytes();
buf.writeInt(bytes.length);
buf.writeBytes(bytes);
}
public void fromBytes(ByteBuf buf) {
int length = buf.readInt();
this.achievementId = new String(buf.readBytes(length).array());
}
只传一个 String achievementId(成就的 statId)。
服务端处理
public IMessage onMessage(AchievementUnlockMessage message, MessageContext ctx) {
EntityPlayer player = ctx.getServerHandler().playerEntity;
if (player.capabilities.isCreativeMode) {
Achievement achievement = AchievementRegistry.instance().getAchievement(message.achievementId);
unlockAchievement(achievement, player);
}
return null; // 不回包
}
private void unlockAchievement(Achievement achievement, EntityPlayer player) {
if (achievement.parentAchievement != null) unlockAchievement(achievement.parentAchievement, player);
player.triggerAchievement(achievement);
}
| 行为 | 说明 |
|---|---|
| 模式检查 | 仅 isCreativeMode 时处理(防作弊) |
| 父链递归 | unlockAchievement 递归调用 parentAchievement,保证依赖链完整 |
| 触发 | player.triggerAchievement(achievement) 触发成就事件 |
| 回包 | 返回 null,无 reply |
客户端发送点
GuiBetterAchievements.drawMouseOverAchievement:
if (Mouse.isButtonDown(1)) { // 右键按住
this.pause = false;
MessageHandler.INSTANCE.sendToServer(new AchievementUnlockMessage(this.hoveredAchievement));
}
相关条目
- MessageHandler -
INSTANCE网络通道 - GuiBetterAchievements - 发送方
- AchievementRegistry -
getAchievement(statId)服务端查询