Simply implement achievement system and add achievement command (#2068)

* Implement achievement system

* Update src/main/java/emu/grasscutter/command/commands/AchievementCommand.java

Co-authored-by: Der Chien <b03902015@ntu.edu.tw>

* fix: redundant codes

* fix: redundant codes

* Update language files

---------

Co-authored-by: Der Chien <b03902015@ntu.edu.tw>
This commit is contained in:
hamusuke
2023-02-26 14:14:27 +09:00
committed by GitHub
parent 51479e2abd
commit 3ab3d5bc04
35 changed files with 7418 additions and 1 deletions

View File

@@ -0,0 +1,16 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.TakeAchievementGoalRewardReqOuterClass;
import emu.grasscutter.server.game.GameSession;
@Opcodes(PacketOpcodes.TakeAchievementGoalRewardReq)
public class HandlerTakeAchievementGoalRewardReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = TakeAchievementGoalRewardReqOuterClass.TakeAchievementGoalRewardReq.parseFrom(payload);
session.getPlayer().getAchievements().takeGoalReward(req.getIdListList());
}
}

View File

@@ -0,0 +1,16 @@
package emu.grasscutter.server.packet.recv;
import emu.grasscutter.net.packet.Opcodes;
import emu.grasscutter.net.packet.PacketHandler;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.TakeAchievementRewardReqOuterClass;
import emu.grasscutter.server.game.GameSession;
@Opcodes(PacketOpcodes.TakeAchievementRewardReq)
public class HandlerTakeAchievementRewardReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] payload) throws Exception {
var req = TakeAchievementRewardReqOuterClass.TakeAchievementRewardReq.parseFrom(payload);
session.getPlayer().getAchievements().takeReward(req.getIdListList());
}
}

View File

@@ -0,0 +1,21 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.achievement.Achievement;
import emu.grasscutter.game.player.Player;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.AchievementAllDataNotifyOuterClass;
public class PacketAchievementAllDataNotify extends BasePacket {
public PacketAchievementAllDataNotify(Player player) {
super(PacketOpcodes.AchievementAllDataNotify);
var achievements = player.getAchievements();
var notify = AchievementAllDataNotifyOuterClass.AchievementAllDataNotify.newBuilder()
.addAllAchievementList(achievements.getAchievementList().values().stream().map(Achievement::toProto).toList())
.addAllRewardTakenGoalIdList(achievements.getTakenGoalRewardIdList())
.build();
this.setData(notify);
}
}

View File

@@ -0,0 +1,20 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.game.achievement.Achievement;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.AchievementUpdateNotifyOuterClass;
import java.util.List;
public class PacketAchievementUpdateNotify extends BasePacket {
public PacketAchievementUpdateNotify(List<Achievement> achievements) {
super(PacketOpcodes.AchievementUpdateNotify);
var notify = AchievementUpdateNotifyOuterClass.AchievementUpdateNotify.newBuilder()
.addAllAchievementList(achievements.stream().map(Achievement::toProto).toList())
.build();
this.setData(notify);
}
}

View File

@@ -0,0 +1,29 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.ItemParamOuterClass;
import emu.grasscutter.net.proto.RetcodeOuterClass;
import emu.grasscutter.net.proto.TakeAchievementGoalRewardRspOuterClass;
import java.util.List;
public class PacketTakeAchievementGoalRewardRsp extends BasePacket {
public PacketTakeAchievementGoalRewardRsp() {
super(PacketOpcodes.TakeAchievementGoalRewardRsp);
this.setData(TakeAchievementGoalRewardRspOuterClass.TakeAchievementGoalRewardRsp.newBuilder()
.setRetcode(RetcodeOuterClass.Retcode.RET_REWARD_HAS_TAKEN_VALUE)
.build());
}
public PacketTakeAchievementGoalRewardRsp(List<Integer> ids, List<ItemParamOuterClass.ItemParam> items) {
super(PacketOpcodes.TakeAchievementGoalRewardRsp);
var rsp = TakeAchievementGoalRewardRspOuterClass.TakeAchievementGoalRewardRsp.newBuilder()
.addAllIdList(ids)
.addAllItemList(items)
.build();
this.setData(rsp);
}
}

View File

@@ -0,0 +1,29 @@
package emu.grasscutter.server.packet.send;
import emu.grasscutter.net.packet.BasePacket;
import emu.grasscutter.net.packet.PacketOpcodes;
import emu.grasscutter.net.proto.ItemParamOuterClass;
import emu.grasscutter.net.proto.RetcodeOuterClass;
import emu.grasscutter.net.proto.TakeAchievementRewardRspOuterClass;
import java.util.List;
public class PacketTakeAchievementRewardRsp extends BasePacket {
public PacketTakeAchievementRewardRsp() {
super(PacketOpcodes.TakeAchievementRewardRsp);
this.setData(TakeAchievementRewardRspOuterClass.TakeAchievementRewardRsp.newBuilder()
.setRetcode(RetcodeOuterClass.Retcode.RET_REWARD_HAS_TAKEN_VALUE)
.build());
}
public PacketTakeAchievementRewardRsp(List<Integer> idList, List<ItemParamOuterClass.ItemParam> items) {
super(PacketOpcodes.TakeAchievementRewardRsp);
var rsp = TakeAchievementRewardRspOuterClass.TakeAchievementRewardRsp.newBuilder()
.addAllIdList(idList)
.addAllItemList(items)
.build();
this.setData(rsp);
}
}