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));
}

相关条目