mirror of
https://github.com/Melledy/LunarCore.git
synced 2026-02-06 01:56:52 +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.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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
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;
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user