Implement TakePromotionRewardCsReq

This commit is contained in:
Melledy
2023-10-05 06:30:27 -07:00
parent 9cfd486ac4
commit 528b1e3dbb
5 changed files with 115 additions and 1 deletions

View File

@@ -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<Integer> takenRewards;
private transient int entityId;
private transient Int2ObjectMap<GameItem> 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<Integer> 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;
}

View File

@@ -109,6 +109,13 @@ public class Inventory extends BasePlayerManager {
return false;
}
public void addItems(Collection<GameItem> 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.

View File

@@ -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<GameItem> 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 ===

View File

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

View File

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