mirror of
https://github.com/Melledy/LunarCore.git
synced 2025-12-12 13:24:36 +01:00
Refactor item param maps
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
55
src/main/java/emu/lunarcore/game/inventory/ItemParamMap.java
Normal file
55
src/main/java/emu/lunarcore/game/inventory/ItemParamMap.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user