From 528b1e3dbb50d4400b572ca823137e5f56507490 Mon Sep 17 00:00:00 2001 From: Melledy <121644117+Melledy@users.noreply.github.com> Date: Thu, 5 Oct 2023 06:30:27 -0700 Subject: [PATCH] Implement `TakePromotionRewardCsReq` --- .../emu/lunarcore/game/avatar/GameAvatar.java | 16 +++++++- .../lunarcore/game/inventory/Inventory.java | 7 ++++ .../game/service/InventoryService.java | 36 ++++++++++++++++++ .../recv/HandlerTakePromotionRewardCsReq.java | 20 ++++++++++ .../send/PacketTakePromotionRewardScRsp.java | 37 +++++++++++++++++++ 5 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/main/java/emu/lunarcore/server/packet/recv/HandlerTakePromotionRewardCsReq.java create mode 100644 src/main/java/emu/lunarcore/server/packet/send/PacketTakePromotionRewardScRsp.java diff --git a/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java b/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java index 55d3c22..ea8524c 100644 --- a/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java +++ b/src/main/java/emu/lunarcore/game/avatar/GameAvatar.java @@ -1,7 +1,8 @@ package emu.lunarcore.game.avatar; -import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.bson.types.ObjectId; @@ -51,6 +52,7 @@ public class GameAvatar implements GameEntity { private int currentHp; private int currentSp; + private Set takenRewards; private transient int entityId; private transient Int2ObjectMap equips; @@ -74,6 +76,7 @@ public class GameAvatar implements GameEntity { public GameAvatar(AvatarExcel excel) { this(); this.avatarId = excel.getId(); + this.takenRewards = new HashSet<>(); this.setExcel(excel); } @@ -91,6 +94,13 @@ public class GameAvatar implements GameEntity { this.data = new AvatarData(excel); } } + + public Set getTakenRewards() { + if (this.takenRewards == null) { + this.takenRewards = new HashSet<>(); + } + return this.takenRewards; + } public void setOwner(Player player) { this.owner = player; @@ -230,6 +240,10 @@ public class GameAvatar implements GameEntity { for (var skill : getSkills().entrySet()) { proto.addSkilltreeList(AvatarSkillTree.newInstance().setPointId(skill.getKey()).setLevel(skill.getValue())); } + + for (int i : this.getTakenRewards()) { + proto.addAllTakenRewards(i); + } return proto; } diff --git a/src/main/java/emu/lunarcore/game/inventory/Inventory.java b/src/main/java/emu/lunarcore/game/inventory/Inventory.java index da55302..b39efdf 100644 --- a/src/main/java/emu/lunarcore/game/inventory/Inventory.java +++ b/src/main/java/emu/lunarcore/game/inventory/Inventory.java @@ -109,6 +109,13 @@ public class Inventory extends BasePlayerManager { return false; } + + public void addItems(Collection items) { + // TODO optimize to not send a packet every time we add an item + for (GameItem item : items) { + this.addItem(item); + } + } private synchronized GameItem putItem(GameItem item) { // Dont add items that dont have a valid item definition. diff --git a/src/main/java/emu/lunarcore/game/service/InventoryService.java b/src/main/java/emu/lunarcore/game/service/InventoryService.java index 80f64ee..d8eea3e 100644 --- a/src/main/java/emu/lunarcore/game/service/InventoryService.java +++ b/src/main/java/emu/lunarcore/game/service/InventoryService.java @@ -213,6 +213,42 @@ public class InventoryService extends BaseGameService { player.sendPacket(new BasePacket(CmdId.RankUpAvatarScRsp)); } + + public void takePromotionRewardAvatar(Player player, int avatarId, int promotion) { + // Get avatar + GameAvatar avatar = player.getAvatarById(avatarId); + if (avatar == null) { + player.sendPacket(new PacketTakePromotionRewardScRsp()); + return; + } + + // Sanity + if (promotion <= 0 || promotion > avatar.getPromotion()) { + player.sendPacket(new PacketTakePromotionRewardScRsp()); + return; + } + + // Make sure promotion level is odd + Make sure promotion reward isnt already taken + if (promotion % 2 == 0 || avatar.getTakenRewards().contains(promotion)) { + player.sendPacket(new PacketTakePromotionRewardScRsp()); + return; + } + + // Set reward as taken + avatar.getTakenRewards().add(promotion); + avatar.save(); + + // Setup rewards + List rewards = new ArrayList<>(); + rewards.add(new GameItem(101, 1)); // Promotion reward is in excels, but we will hardcode it for now as its easier + + // Add items to player inventory + player.getInventory().addItems(rewards); + + // Send packets + player.sendPacket(new PacketPlayerSyncScNotify(avatar)); + player.sendPacket(new PacketTakePromotionRewardScRsp(rewards)); + } // === Equipment === diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakePromotionRewardCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakePromotionRewardCsReq.java new file mode 100644 index 0000000..921989f --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerTakePromotionRewardCsReq.java @@ -0,0 +1,20 @@ +package emu.lunarcore.server.packet.recv; + +import emu.lunarcore.proto.TakePromotionRewardCsReqOuterClass.TakePromotionRewardCsReq; +import emu.lunarcore.server.game.GameSession; +import emu.lunarcore.server.packet.CmdId; +import emu.lunarcore.server.packet.Opcodes; +import emu.lunarcore.server.packet.PacketHandler; +import emu.lunarcore.server.packet.send.PacketTakePromotionRewardScRsp; + +@Opcodes(CmdId.TakePromotionRewardCsReq) +public class HandlerTakePromotionRewardCsReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] data) throws Exception { + var req = TakePromotionRewardCsReq.parseFrom(data); + + session.getServer().getInventoryService().takePromotionRewardAvatar(session.getPlayer(), req.getBaseAvatarId(), req.getPromotion()); + } + +} diff --git a/src/main/java/emu/lunarcore/server/packet/send/PacketTakePromotionRewardScRsp.java b/src/main/java/emu/lunarcore/server/packet/send/PacketTakePromotionRewardScRsp.java new file mode 100644 index 0000000..b31cb8c --- /dev/null +++ b/src/main/java/emu/lunarcore/server/packet/send/PacketTakePromotionRewardScRsp.java @@ -0,0 +1,37 @@ +package emu.lunarcore.server.packet.send; + +import java.util.Collection; + +import emu.lunarcore.game.inventory.GameItem; +import emu.lunarcore.proto.ItemListOuterClass.ItemList; +import emu.lunarcore.proto.TakePromotionRewardScRspOuterClass.TakePromotionRewardScRsp; +import emu.lunarcore.server.packet.BasePacket; +import emu.lunarcore.server.packet.CmdId; + +public class PacketTakePromotionRewardScRsp extends BasePacket { + + public PacketTakePromotionRewardScRsp() { + super(CmdId.TakePromotionRewardScRsp); + + var data = TakePromotionRewardScRsp.newInstance() + .setRetcode(1); + + this.setData(data); + } + + public PacketTakePromotionRewardScRsp(Collection rewards) { + super(CmdId.TakePromotionRewardScRsp); + + var rewardList = ItemList.newInstance(); + + for (GameItem item : rewards) { + rewardList.addItemList(item.toProto()); + } + + var data = TakePromotionRewardScRsp.newInstance() + .setRewardList(rewardList); + + this.setData(data); + } + +}