mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-13 05:44:36 +01:00
Implement TakePromotionRewardCsReq
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 ===
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user