Implement compose items

This commit is contained in:
Melledy
2023-10-23 09:09:22 -07:00
parent af607f648e
commit f8df9b3e6a
7 changed files with 1093 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ public class GameData {
@Getter private static Int2ObjectMap<MapEntranceExcel> mapEntranceExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<HeroExcel> heroExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<ShopExcel> shopExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<ItemComposeExcel> itemComposeExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<ChallengeExcel> challengeExcelMap = new Int2ObjectOpenHashMap<>();
@Getter private static Int2ObjectMap<ChallengeTargetExcel> challengeTargetExcelMap = new Int2ObjectOpenHashMap<>();

View File

@@ -0,0 +1,31 @@
package emu.lunarcore.data.excel;
import java.util.List;
import emu.lunarcore.data.GameResource;
import emu.lunarcore.data.ResourceType;
import emu.lunarcore.data.common.ItemParam;
import lombok.Getter;
@Getter
@ResourceType(name = {"ItemComposeConfig.json"})
public class ItemComposeExcel extends GameResource {
private int ID;
private int ItemID;
private FormulaType FormulaType;
private List<ItemParam> MaterialCost;
private int[] SpecialMaterialCost;
private int CoinCost;
private int WorldLevelRequire;
private int[] RelicList;
@Override
public int getId() {
return ID;
}
public enum FormulaType {
Unknown, Normal, Sepcial, SelectedRelic;
}
}

View File

@@ -7,6 +7,7 @@ import java.util.List;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.common.ItemParam;
import emu.lunarcore.data.excel.*;
import emu.lunarcore.data.excel.ItemComposeExcel.FormulaType;
import emu.lunarcore.game.avatar.GameAvatar;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.player.Player;
@@ -585,4 +586,42 @@ public class InventoryService extends BaseGameService {
return items;
}
public List<GameItem> composeItem(Player player, int composeId, int count) {
// Sanity check
if (count <= 0) return null;
// Get item compose excel data
ItemComposeExcel excel = GameData.getItemComposeExcelMap().get(composeId);
if (excel == null || excel.getFormulaType() != FormulaType.Normal) {
return null;
}
// Verify items
for (ItemParam param : excel.getMaterialCost()) {
GameItem item = player.getInventory().getItemByParam(param);
if (item == null || item.getCount() < param.getCount() * count) {
return null;
}
}
// Verify credits
if (player.getScoin() < excel.getCoinCost() * count) {
return null;
}
// Pay items
player.getInventory().removeItemsByParams(excel.getMaterialCost(), count);
player.addSCoin(-excel.getCoinCost() * count);
// Compose item
List<GameItem> items = new ArrayList<>();
GameItem item = new GameItem(excel.getItemID(), count);
items.add(item);
// Add items to inventory
player.getInventory().addItems(items);
return items;
}
}

View File

@@ -0,0 +1,29 @@
package emu.lunarcore.server.packet.recv;
import java.util.List;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.ComposeItemCsReqOuterClass.ComposeItemCsReq;
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.PacketComposeItemScRsp;
@Opcodes(CmdId.ComposeItemCsReq)
public class HandlerComposeItemCsReq extends PacketHandler {
@Override
public void handle(GameSession session, byte[] header, byte[] data) throws Exception {
var req = ComposeItemCsReq.parseFrom(data);
List<GameItem> returnList = session.getServer().getInventoryService().composeItem(
session.getPlayer(),
req.getComposeId(),
req.getCount()
);
session.send(new PacketComposeItemScRsp(req.getComposeId(), req.getCount(), returnList));
}
}

View File

@@ -0,0 +1,29 @@
package emu.lunarcore.server.packet.send;
import java.util.Collection;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.ComposeItemScRspOuterClass.ComposeItemScRsp;
import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
public class PacketComposeItemScRsp extends BasePacket {
public PacketComposeItemScRsp(int composeId, int count, Collection<GameItem> returnList) {
super(CmdId.ComposeItemScRsp);
var data = ComposeItemScRsp.newInstance()
.setComposeId(composeId)
.setCount(count);
if (returnList != null) {
for (var item : returnList) {
data.getMutableReturnItemList().addItemList(item.toProto());
}
} else {
data.getMutableReturnItemList();
}
this.setData(data);
}
}