diff --git a/src/generated/main/emu/lunarcore/proto/SellItemCsReqOuterClass.java b/src/generated/main/emu/lunarcore/proto/SellItemCsReqOuterClass.java index c85d3ab..04b8125 100644 --- a/src/generated/main/emu/lunarcore/proto/SellItemCsReqOuterClass.java +++ b/src/generated/main/emu/lunarcore/proto/SellItemCsReqOuterClass.java @@ -18,6 +18,11 @@ public final class SellItemCsReqOuterClass { public static final class SellItemCsReq extends ProtoMessage implements Cloneable { private static final long serialVersionUID = 0L; + /** + * optional bool to_material = 1; + */ + private boolean toMaterial; + /** * optional .ItemCostList item_cost_list = 8; */ @@ -33,12 +38,49 @@ public final class SellItemCsReqOuterClass { return new SellItemCsReq(); } + /** + * optional bool to_material = 1; + * @return whether the toMaterial field is set + */ + public boolean hasToMaterial() { + return (bitField0_ & 0x00000001) != 0; + } + + /** + * optional bool to_material = 1; + * @return this + */ + public SellItemCsReq clearToMaterial() { + bitField0_ &= ~0x00000001; + toMaterial = false; + return this; + } + + /** + * optional bool to_material = 1; + * @return the toMaterial + */ + public boolean getToMaterial() { + return toMaterial; + } + + /** + * optional bool to_material = 1; + * @param value the toMaterial to set + * @return this + */ + public SellItemCsReq setToMaterial(final boolean value) { + bitField0_ |= 0x00000001; + toMaterial = value; + return this; + } + /** * optional .ItemCostList item_cost_list = 8; * @return whether the itemCostList field is set */ public boolean hasItemCostList() { - return (bitField0_ & 0x00000001) != 0; + return (bitField0_ & 0x00000002) != 0; } /** @@ -46,7 +88,7 @@ public final class SellItemCsReqOuterClass { * @return this */ public SellItemCsReq clearItemCostList() { - bitField0_ &= ~0x00000001; + bitField0_ &= ~0x00000002; itemCostList.clear(); return this; } @@ -75,7 +117,7 @@ public final class SellItemCsReqOuterClass { * @return internal storage object for modifications */ public ItemCostListOuterClass.ItemCostList getMutableItemCostList() { - bitField0_ |= 0x00000001; + bitField0_ |= 0x00000002; return itemCostList; } @@ -85,7 +127,7 @@ public final class SellItemCsReqOuterClass { * @return this */ public SellItemCsReq setItemCostList(final ItemCostListOuterClass.ItemCostList value) { - bitField0_ |= 0x00000001; + bitField0_ |= 0x00000002; itemCostList.copyFrom(value); return this; } @@ -95,6 +137,7 @@ public final class SellItemCsReqOuterClass { cachedSize = other.cachedSize; if ((bitField0_ | other.bitField0_) != 0) { bitField0_ = other.bitField0_; + toMaterial = other.toMaterial; itemCostList.copyFrom(other.itemCostList); } return this; @@ -106,6 +149,9 @@ public final class SellItemCsReqOuterClass { return this; } cachedSize = -1; + if (other.hasToMaterial()) { + setToMaterial(other.toMaterial); + } if (other.hasItemCostList()) { getMutableItemCostList().mergeFrom(other.itemCostList); } @@ -119,6 +165,7 @@ public final class SellItemCsReqOuterClass { } cachedSize = -1; bitField0_ = 0; + toMaterial = false; itemCostList.clear(); return this; } @@ -144,12 +191,17 @@ public final class SellItemCsReqOuterClass { } SellItemCsReq other = (SellItemCsReq) o; return bitField0_ == other.bitField0_ + && (!hasToMaterial() || toMaterial == other.toMaterial) && (!hasItemCostList() || itemCostList.equals(other.itemCostList)); } @Override public void writeTo(final ProtoSink output) throws IOException { if ((bitField0_ & 0x00000001) != 0) { + output.writeRawByte((byte) 8); + output.writeBoolNoTag(toMaterial); + } + if ((bitField0_ & 0x00000002) != 0) { output.writeRawByte((byte) 66); output.writeMessageNoTag(itemCostList); } @@ -159,6 +211,9 @@ public final class SellItemCsReqOuterClass { protected int computeSerializedSize() { int size = 0; if ((bitField0_ & 0x00000001) != 0) { + size += 2; + } + if ((bitField0_ & 0x00000002) != 0) { size += 1 + ProtoSink.computeMessageSizeNoTag(itemCostList); } return size; @@ -171,10 +226,19 @@ public final class SellItemCsReqOuterClass { int tag = input.readTag(); while (true) { switch (tag) { + case 8: { + // toMaterial + toMaterial = input.readBool(); + bitField0_ |= 0x00000001; + tag = input.readTag(); + if (tag != 66) { + break; + } + } case 66: { // itemCostList input.readMessage(itemCostList); - bitField0_ |= 0x00000001; + bitField0_ |= 0x00000002; tag = input.readTag(); if (tag != 0) { break; @@ -198,6 +262,9 @@ public final class SellItemCsReqOuterClass { public void writeTo(final JsonSink output) throws IOException { output.beginObject(); if ((bitField0_ & 0x00000001) != 0) { + output.writeBool(FieldNames.toMaterial, toMaterial); + } + if ((bitField0_ & 0x00000002) != 0) { output.writeMessage(FieldNames.itemCostList, itemCostList); } output.endObject(); @@ -210,12 +277,24 @@ public final class SellItemCsReqOuterClass { } while (!input.isAtEnd()) { switch (input.readFieldHash()) { + case 278998210: + case 2058461803: { + if (input.isAtField(FieldNames.toMaterial)) { + if (!input.trySkipNullValue()) { + toMaterial = input.readBool(); + bitField0_ |= 0x00000001; + } + } else { + input.skipUnknownField(); + } + break; + } case 203506238: case -1124889692: { if (input.isAtField(FieldNames.itemCostList)) { if (!input.trySkipNullValue()) { input.readMessage(itemCostList); - bitField0_ |= 0x00000001; + bitField0_ |= 0x00000002; } } else { input.skipUnknownField(); @@ -274,6 +353,8 @@ public final class SellItemCsReqOuterClass { * Contains name constants used for serializing JSON */ static class FieldNames { + static final FieldName toMaterial = FieldName.forField("toMaterial", "to_material"); + static final FieldName itemCostList = FieldName.forField("itemCostList", "item_cost_list"); } } diff --git a/src/main/java/emu/lunarcore/GameConstants.java b/src/main/java/emu/lunarcore/GameConstants.java index c1f1a81..c5c4960 100644 --- a/src/main/java/emu/lunarcore/GameConstants.java +++ b/src/main/java/emu/lunarcore/GameConstants.java @@ -32,6 +32,7 @@ public class GameConstants { public static final int MATERIAL_HCOIN_ID = 1; // Material id for jades. DO NOT CHANGE public static final int MATERIAL_COIN_ID = 2; // Material id for credits. DO NOT CHANGE public static final int TRAILBLAZER_EXP_ID = 22; + public static final int RELIC_REMAINS_ID = 235; public static final int INVENTORY_MAX_EQUIPMENT = 1500; public static final int INVENTORY_MAX_RELIC = 1500; diff --git a/src/main/java/emu/lunarcore/game/inventory/Inventory.java b/src/main/java/emu/lunarcore/game/inventory/Inventory.java index 61e06b4..010c589 100644 --- a/src/main/java/emu/lunarcore/game/inventory/Inventory.java +++ b/src/main/java/emu/lunarcore/game/inventory/Inventory.java @@ -313,26 +313,31 @@ public class Inventory extends BasePlayerManager { List results = new ArrayList(items.size()); for (ItemParam param : items) { - // Check param type - if (param.getId() == GameConstants.MATERIAL_COIN_ID) { - // Remove credits - getPlayer().addSCoin(-param.getCount() * multiplier); - } else if (param.getId() == GameConstants.MATERIAL_HCOIN_ID) { - // Remove credits - getPlayer().addHCoin(-param.getCount() * multiplier); - } else if (param.getId() == GameConstants.ROGUE_TALENT_POINT_ITEM_ID) { - // Remove credits - getPlayer().addTalentPoints(-param.getCount() * multiplier); - } else { - // Remove param items - GameItem item = this.getItemByParam(param); - if (item == null) continue; - - GameItem result = this.deleteItem(item, param.getCount() * multiplier); - if (result != null) { - results.add(result); + // Remove virtual items first + if (param.getType() == ItemParamType.PILE) { + if (param.getId() == GameConstants.MATERIAL_COIN_ID) { + // Remove credits + getPlayer().addSCoin(-param.getCount() * multiplier); + continue; + } else if (param.getId() == GameConstants.MATERIAL_HCOIN_ID) { + // Remove credits + getPlayer().addHCoin(-param.getCount() * multiplier); + continue; + } else if (param.getId() == GameConstants.ROGUE_TALENT_POINT_ITEM_ID) { + // Remove credits + getPlayer().addTalentPoints(-param.getCount() * multiplier); + continue; } } + + // Remove param items + GameItem item = this.getItemByParam(param); + if (item == null) continue; + + GameItem result = this.deleteItem(item, param.getCount() * multiplier); + if (result != null) { + results.add(result); + } } // Send packet (update) diff --git a/src/main/java/emu/lunarcore/game/inventory/InventoryService.java b/src/main/java/emu/lunarcore/game/inventory/InventoryService.java index cd16282..7ffb769 100644 --- a/src/main/java/emu/lunarcore/game/inventory/InventoryService.java +++ b/src/main/java/emu/lunarcore/game/inventory/InventoryService.java @@ -4,12 +4,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import emu.lunarcore.GameConstants; import emu.lunarcore.data.GameData; import emu.lunarcore.data.GameDepot; 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.enums.ItemRarity; import emu.lunarcore.game.player.Player; import emu.lunarcore.server.game.BaseGameService; import emu.lunarcore.server.game.GameServer; @@ -552,20 +554,26 @@ public class InventoryService extends BaseGameService { player.sendPacket(new PacketPlayerSyncScNotify(relic)); } - public Int2IntMap sellItems(Player player, List items) { + public Int2IntMap sellItems(Player player, boolean toMaterials, List items) { // Verify items var returnItems = new Int2IntOpenHashMap(); for (ItemParam param : items) { + // Get item in inventory GameItem item = player.getInventory().getItemByParam(param); if (item == null || item.isLocked() || item.getCount() < param.getCount()) { return null; } // Add return items - for (ItemParam ret : item.getExcel().getReturnItemIDList()) { - // Add to return items - returnItems.put(ret.getId(), returnItems.getOrDefault(ret.getId(), 0) + ret.getCount()); + if (item.getExcel().getRarity() == ItemRarity.SuperRare && !toMaterials) { + // Relic remains + returnItems.addTo(GameConstants.RELIC_REMAINS_ID, 10); + } else { + // Add basic return items + for (ItemParam ret : item.getExcel().getReturnItemIDList()) { + returnItems.addTo(ret.getId(), ret.getCount()); + } } } diff --git a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java index c12c29c..83a029c 100644 --- a/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java +++ b/src/main/java/emu/lunarcore/server/packet/recv/HandlerSellItemCsReq.java @@ -24,7 +24,7 @@ public class HandlerSellItemCsReq extends PacketHandler { items.add(new ItemParam(cost)); } - var returnItems = session.getServer().getInventoryService().sellItems(session.getPlayer(), items); + var returnItems = session.getServer().getInventoryService().sellItems(session.getPlayer(), req.getToMaterial(), items); session.send(new PacketSellItemScRsp(returnItems)); } diff --git a/src/main/java/emu/lunarcore/util/Utils.java b/src/main/java/emu/lunarcore/util/Utils.java index 7cfaf98..5034fe4 100644 --- a/src/main/java/emu/lunarcore/util/Utils.java +++ b/src/main/java/emu/lunarcore/util/Utils.java @@ -127,7 +127,7 @@ public class Utils { * Add 2 integers without overflowing */ public static int safeAdd(int a, int b) { - return safeAdd(a, b, Integer.MAX_VALUE, Integer.MIN_VALUE); + return safeAdd(a, b, Integer.MAX_VALUE, 0); } public static int safeAdd(int a, int b, long max, long min) {