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

View File

@@ -5,8 +5,8 @@ import java.util.List;
import emu.lunarcore.GameConstants;
import emu.lunarcore.data.GameData;
import emu.lunarcore.data.excel.ItemExcel;
import emu.lunarcore.game.battle.Battle;
import emu.lunarcore.game.inventory.ItemParamMap;
import emu.lunarcore.game.inventory.GameItem;
import emu.lunarcore.game.scene.entity.EntityMonster;
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
public void calculateDrops(Battle battle) {
// Setup drop map
var dropMap = new DropMap();
var dropMap = new ItemParamMap();
// Calculate drops from monsters
for (EntityMonster monster : battle.getNpcMonsters()) {
@@ -53,26 +53,9 @@ public class DropService extends BaseGameService {
}
// Create drops
for (var entry : dropMap.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++) {
battle.getDrops().add(new GameItem(excel, 1));
}
} else {
battle.getDrops().add(new GameItem(excel, amount));
}
}
dropMap.forEachItem(item -> {
battle.getDrops().add(item);
});
// Add to inventory
battle.getPlayer().getInventory().addItems(battle.getDrops());

View File

@@ -133,18 +133,27 @@ public class Inventory extends BasePlayerManager {
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);
}
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
List<GameItem> results = new ArrayList<>(items.size());
// Sanity
if (items.size() == 0) {
return results;
}
// Sanity check
if (items.size() == 0) return results;
// Add to inventory
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) {

View File

@@ -17,9 +17,6 @@ import emu.lunarcore.server.game.BaseGameService;
import emu.lunarcore.server.game.GameServer;
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 InventoryService(GameServer server) {
@@ -88,7 +85,7 @@ public class InventoryService extends BaseGameService {
player.save();
// Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
var leftoverItems = new ItemParamMap();
while (GameDepot.getAvatarExpExcels().size() > 0) {
int oldAmount = amount;
@@ -103,12 +100,7 @@ public class InventoryService extends BaseGameService {
}
// Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
// Send packets
player.sendPacket(new PacketPlayerSyncScNotify(avatar));
@@ -315,7 +307,7 @@ public class InventoryService extends BaseGameService {
player.save();
// Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
var leftoverItems = new ItemParamMap();
while (GameDepot.getEquipmentExpExcels().size() > 0) {
int oldAmount = amount;
@@ -330,12 +322,7 @@ public class InventoryService extends BaseGameService {
}
// Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
// Send packets
player.sendPacket(new PacketPlayerSyncScNotify(equip));
@@ -499,7 +486,7 @@ public class InventoryService extends BaseGameService {
player.save();
// Calculate leftover exp
Int2IntMap leftoverItems = new Int2IntOpenHashMap();
var leftoverItems = new ItemParamMap();
while (GameDepot.getRelicExpExcels().size() > 0) {
int oldAmount = amount;
@@ -514,12 +501,7 @@ public class InventoryService extends BaseGameService {
}
// Create leftover exp items
List<GameItem> returnItems = leftoverItems.int2IntEntrySet()
.stream()
.map(e -> new GameItem(e.getIntKey(), e.getIntValue()))
.toList();
player.getInventory().addItems(returnItems);
List<GameItem> returnItems = player.getInventory().addItems(leftoverItems);
// Send packets
player.sendPacket(new PacketPlayerSyncScNotify(equip));
@@ -554,9 +536,9 @@ public class InventoryService extends BaseGameService {
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
var returnItems = new Int2IntOpenHashMap();
var returnItems = new ItemParamMap();
for (ItemParam param : items) {
// Get item in inventory
@@ -581,12 +563,7 @@ public class InventoryService extends BaseGameService {
player.getInventory().removeItemsByParams(items);
// Add return items
for (var returnItem : returnItems.int2IntEntrySet()) {
player.getInventory().addItem(returnItem.getIntKey(), returnItem.getIntValue());
}
// Done
return returnItems;
return player.getInventory().addItems(returnItems);
}
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;
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.server.packet.BasePacket;
import emu.lunarcore.server.packet.CmdId;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
public class PacketSellItemScRsp extends BasePacket {
public PacketSellItemScRsp(Int2IntMap returnItems) {
public PacketSellItemScRsp(Collection<GameItem> returnItems) {
super(CmdId.SellItemScRsp);
var data = SellItemScRsp.newInstance();
if (returnItems != null) {
for (var item : returnItems.int2IntEntrySet()) {
var itemProto = Item.newInstance()
.setItemId(item.getIntKey())
.setNum(item.getIntValue());
data.getMutableReturnItemList().addItemList(itemProto);
for (var item : returnItems) {
data.getMutableReturnItemList().addItemList(item.toProto());
}
} else {
data.setRetcode(1);