Refactor item param maps

This commit is contained in:
Melledy
2024-02-07 18:52:46 -08:00
parent 5ed029dccb
commit 7cf67f6149
7 changed files with 102 additions and 82 deletions

View File

@@ -1,11 +0,0 @@
package emu.lunarcore.game.drops;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
public class DropMap extends Int2IntOpenHashMap {
private static final long serialVersionUID = -4186524272780523459L;
public FastEntrySet entries() {
return this.int2IntEntrySet();
}
}

View File

@@ -6,6 +6,7 @@ import emu.lunarcore.GameConstants;
import emu.lunarcore.LunarCore; import emu.lunarcore.LunarCore;
import emu.lunarcore.data.GameData; import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ItemExcel; import emu.lunarcore.data.excel.ItemExcel;
import emu.lunarcore.game.inventory.ItemParamMap;
import emu.lunarcore.util.Utils; import emu.lunarcore.util.Utils;
import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntArrayList;
import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntList;
@@ -72,7 +73,7 @@ public class DropParam {
return this.maxCount; return this.maxCount;
} }
public void roll(DropMap drops) { public void roll(ItemParamMap drops) {
// Check drop chance // Check drop chance
if (this.chance < 1000) { if (this.chance < 1000) {
int random = Utils.randomRange(0, 999); int random = Utils.randomRange(0, 999);

View File

@@ -5,8 +5,8 @@ import java.util.List;
import emu.lunarcore.GameConstants; import emu.lunarcore.GameConstants;
import emu.lunarcore.data.GameData; import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ItemExcel;
import emu.lunarcore.game.battle.Battle; import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.inventory.ItemParamMap;
import emu.lunarcore.game.inventory.GameItem; import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.scene.entity.EntityMonster; import emu.lunarcore.game.scene.entity.EntityMonster;
import emu.lunarcore.server.game.BaseGameService; import emu.lunarcore.server.game.BaseGameService;
@@ -22,7 +22,7 @@ public class DropService extends BaseGameService {
// TODO this isnt the right way drops are calculated on the official server... but its good enough for now // TODO this isnt the right way drops are calculated on the official server... but its good enough for now
public void calculateDrops(Battle battle) { public void calculateDrops(Battle battle) {
// Setup drop map // Setup drop map
var dropMap = new DropMap(); var dropMap = new ItemParamMap();
// Calculate drops from monsters // Calculate drops from monsters
for (EntityMonster monster : battle.getNpcMonsters()) { for (EntityMonster monster : battle.getNpcMonsters()) {
@@ -53,26 +53,9 @@ public class DropService extends BaseGameService {
} }
// Create drops // Create drops
for (var entry : dropMap.entries()) { dropMap.forEachItem(item -> {
// Get amount battle.getDrops().add(item);
int amount = entry.getIntValue(); });
if (amount <= 0) {
continue;
}
// Create item and add it to player
ItemExcel excel = GameData.getItemExcelMap().get(entry.getIntKey());
if (excel == null) continue;
// Add item
if (excel.isEquippable()) {
for (int i = 0; i < amount; i++) {
battle.getDrops().add(new GameItem(excel, 1));
}
} else {
battle.getDrops().add(new GameItem(excel, amount));
}
}
// Add to inventory // Add to inventory
battle.getPlayer().getInventory().addItems(battle.getDrops()); battle.getPlayer().getInventory().addItems(battle.getDrops());

View File

@@ -133,18 +133,27 @@ public class Inventory extends BasePlayerManager {
return false; return false;
} }
public List<GameItem> addItems(Collection<GameItem> items) { /**
* Adds all items from this list to the inventory.
* @param items List of items to add
* @return List of items that were added.
*/
public List<GameItem> addItems(List<GameItem> items) {
return addItems(items, false); return addItems(items, false);
} }
public List<GameItem> addItems(Collection<GameItem> items, boolean showHint) { /**
* Adds all items from this list to the inventory.
* @param items List of items to add
* @param showHint Whether or not to notify the player that items were added
* @return List of items that were added.
*/
public List<GameItem> addItems(List<GameItem> items, boolean showHint) {
// Init results // Init results
List<GameItem> results = new ArrayList<>(items.size()); List<GameItem> results = new ArrayList<>(items.size());
// Sanity // Sanity check
if (items.size() == 0) { if (items.size() == 0) return results;
return results;
}
// Add to inventory // Add to inventory
for (GameItem item : items) { for (GameItem item : items) {
@@ -162,7 +171,16 @@ public class Inventory extends BasePlayerManager {
} }
} }
return results; return items;
}
/**
* Adds all items from this item param map to the inventory.
* @param map A map of item ids/amounts
* @return List of items that were added.
*/
public List<GameItem> addItems(ItemParamMap map) {
return addItems(map.toItemList(), false);
} }
public List<GameItem> addItemParams(Collection<ItemParam> params) { public List<GameItem> addItemParams(Collection<ItemParam> params) {

View File

@@ -17,9 +17,6 @@ import emu.lunarcore.server.game.BaseGameService;
import emu.lunarcore.server.game.GameServer; import emu.lunarcore.server.game.GameServer;
import emu.lunarcore.server.packet.send.*; import emu.lunarcore.server.packet.send.*;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
public class InventoryService extends BaseGameService { public class InventoryService extends BaseGameService {
public InventoryService(GameServer server) { public InventoryService(GameServer server) {
@@ -88,7 +85,7 @@ public class InventoryService extends BaseGameService {
player.save(); player.save();
// Calculate leftover exp // Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap(); var leftoverItems = new ItemParamMap();
while (GameDepot.getAvatarExpExcels().size() > 0) { while (GameDepot.getAvatarExpExcels().size() > 0) {
int oldAmount = amount; int oldAmount = amount;
@@ -103,12 +100,7 @@ public class InventoryService extends BaseGameService {
} }
// Create leftover exp items // Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet() List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
// Send packets // Send packets
player.sendPacket(new PacketPlayerSyncScNotify(avatar)); player.sendPacket(new PacketPlayerSyncScNotify(avatar));
@@ -315,7 +307,7 @@ public class InventoryService extends BaseGameService {
player.save(); player.save();
// Calculate leftover exp // Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap(); var leftoverItems = new ItemParamMap();
while (GameDepot.getEquipmentExpExcels().size() > 0) { while (GameDepot.getEquipmentExpExcels().size() > 0) {
int oldAmount = amount; int oldAmount = amount;
@@ -330,12 +322,7 @@ public class InventoryService extends BaseGameService {
} }
// Create leftover exp items // Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet() List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
// Send packets // Send packets
player.sendPacket(new PacketPlayerSyncScNotify(equip)); player.sendPacket(new PacketPlayerSyncScNotify(equip));
@@ -499,7 +486,7 @@ public class InventoryService extends BaseGameService {
player.save(); player.save();
// Calculate leftover exp // Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap(); var leftoverItems = new ItemParamMap();
while (GameDepot.getRelicExpExcels().size() > 0) { while (GameDepot.getRelicExpExcels().size() > 0) {
int oldAmount = amount; int oldAmount = amount;
@@ -514,12 +501,7 @@ public class InventoryService extends BaseGameService {
} }
// Create leftover exp items // Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet() List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
// Send packets // Send packets
player.sendPacket(new PacketPlayerSyncScNotify(equip)); player.sendPacket(new PacketPlayerSyncScNotify(equip));
@@ -554,9 +536,9 @@ public class InventoryService extends BaseGameService {
player.sendPacket(new PacketPlayerSyncScNotify(relic)); player.sendPacket(new PacketPlayerSyncScNotify(relic));
} }
public Int2IntMap sellItems(Player player, boolean toMaterials, List<ItemParam> items) { public List<GameItem> sellItems(Player player, boolean toMaterials, List<ItemParam> items) {
// Verify items // Verify items
var returnItems = new Int2IntOpenHashMap(); var returnItems = new ItemParamMap();
for (ItemParam param : items) { for (ItemParam param : items) {
// Get item in inventory // Get item in inventory
@@ -581,12 +563,7 @@ public class InventoryService extends BaseGameService {
player.getInventory().removeItemsByParams(items); player.getInventory().removeItemsByParams(items);
// Add return items // Add return items
for (var returnItem : returnItems.int2IntEntrySet()) { return player.getInventory().addItems(returnItems);
player.getInventory().addItem(returnItem.getIntKey(), returnItem.getIntValue());
}
// Done
return returnItems;
} }
public List<GameItem> composeItem(Player player, int composeId, int count, List<ItemParam> costItems) { public List<GameItem> composeItem(Player player, int composeId, int count, List<ItemParam> costItems) {

View File

@@ -0,0 +1,55 @@
package emu.lunarcore.game.inventory;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ItemExcel;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
public class ItemParamMap extends Int2IntOpenHashMap {
private static final long serialVersionUID = -4186524272780523459L;
@Override
public int addTo(int itemId, int count) {
return super.addTo(itemId, count);
}
public FastEntrySet entries() {
return this.int2IntEntrySet();
}
public void forEachItem(Consumer<GameItem> consumer) {
for (var entry : this.entries()) {
// Get amount
int amount = entry.getIntValue();
if (amount <= 0) {
continue;
}
// Create item and add it to player
ItemExcel excel = GameData.getItemExcelMap().get(entry.getIntKey());
if (excel == null) continue;
// Add item
if (excel.isEquippable()) {
for (int i = 0; i < amount; i++) {
consumer.accept(new GameItem(excel, 1));
}
} else {
consumer.accept(new GameItem(excel, amount));
}
}
}
public List<GameItem> toItemList() {
List<GameItem> list = new ArrayList<>();
this.forEachItem(item -> {
list.add(item);
});
return list;
}
}

View File

@@ -1,25 +1,22 @@
package emu.lunarcore.server.packet.send; package emu.lunarcore.server.packet.send;
import emu.lunarcore.proto.ItemOuterClass.Item; import java.util.Collection;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.proto.SellItemScRspOuterClass.SellItemScRsp; import emu.lunarcore.proto.SellItemScRspOuterClass.SellItemScRsp;
import emu.lunarcore.server.packet.BasePacket; import emu.lunarcore.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId; import emu.lunarcore.server.packet.CmdId;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
public class PacketSellItemScRsp extends BasePacket { public class PacketSellItemScRsp extends BasePacket {
public PacketSellItemScRsp(Int2IntMap returnItems) { public PacketSellItemScRsp(Collection<GameItem> returnItems) {
super(CmdId.SellItemScRsp); super(CmdId.SellItemScRsp);
var data = SellItemScRsp.newInstance(); var data = SellItemScRsp.newInstance();
if (returnItems != null) { if (returnItems != null) {
for (var item : returnItems.int2IntEntrySet()) { for (var item : returnItems) {
var itemProto = Item.newInstance() data.getMutableReturnItemList().addItemList(item.toProto());
.setItemId(item.getIntKey())
.setNum(item.getIntValue());
data.getMutableReturnItemList().addItemList(itemProto);
} }
} else { } else {
data.setRetcode(1); data.setRetcode(1);