Rename and clean up MapleInventory
This commit is contained in:
@@ -155,7 +155,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
private MapleClient client;
|
||||
private MapleGuildCharacter mgc = null;
|
||||
private MaplePartyCharacter mpc = null;
|
||||
private MapleInventory[] inventory;
|
||||
private Inventory[] inventory;
|
||||
private MapleJob job = MapleJob.BEGINNER;
|
||||
private MapleMessenger messenger = null;
|
||||
private MapleMiniGame miniGame;
|
||||
@@ -303,7 +303,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
useCS = false;
|
||||
|
||||
setStance(0);
|
||||
inventory = new MapleInventory[MapleInventoryType.values().length];
|
||||
inventory = new Inventory[MapleInventoryType.values().length];
|
||||
savedLocations = new SavedLocation[SavedLocationType.values().length];
|
||||
|
||||
for (MapleInventoryType type : MapleInventoryType.values()) {
|
||||
@@ -311,7 +311,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
if (type == MapleInventoryType.CASH) {
|
||||
b = 96;
|
||||
}
|
||||
inventory[type.ordinal()] = new MapleInventory(this, type, (byte) b);
|
||||
inventory[type.ordinal()] = new Inventory(this, type, (byte) b);
|
||||
}
|
||||
inventory[MapleInventoryType.CANHOLD.ordinal()] = new MapleInventoryProof(this);
|
||||
|
||||
@@ -906,7 +906,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
for(MapleInventoryType invType : MapleInventoryType.values()) {
|
||||
MapleInventory inv = this.getInventory(invType);
|
||||
Inventory inv = this.getInventory(invType);
|
||||
|
||||
inv.lockInventory();
|
||||
try {
|
||||
@@ -2944,7 +2944,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
}
|
||||
|
||||
List<Item> toberemove = new ArrayList<>();
|
||||
for (MapleInventory inv : inventory) {
|
||||
for (Inventory inv : inventory) {
|
||||
for (Item item : inv.list()) {
|
||||
expiration = item.getExpiration();
|
||||
|
||||
@@ -5096,7 +5096,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
return initialSpawnPoint;
|
||||
}
|
||||
|
||||
public MapleInventory getInventory(MapleInventoryType type) {
|
||||
public Inventory getInventory(MapleInventoryType type) {
|
||||
return inventory[type.ordinal()];
|
||||
}
|
||||
|
||||
@@ -6667,7 +6667,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
}
|
||||
|
||||
public void updateCouponRates() {
|
||||
MapleInventory cashInv = this.getInventory(MapleInventoryType.CASH);
|
||||
Inventory cashInv = this.getInventory(MapleInventoryType.CASH);
|
||||
if (cashInv == null) return;
|
||||
|
||||
effLock.lock();
|
||||
@@ -6872,7 +6872,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
ret.jobRankMove = rs.getInt("jobRankMove");
|
||||
|
||||
if(equipped != null) { // players can have no equipped items at all, ofc
|
||||
MapleInventory inv = ret.inventory[MapleInventoryType.EQUIPPED.ordinal()];
|
||||
Inventory inv = ret.inventory[MapleInventoryType.EQUIPPED.ordinal()];
|
||||
for (Item item : equipped) {
|
||||
inv.addItemFromDB(item);
|
||||
}
|
||||
@@ -7831,7 +7831,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
boolean gun = weapon == MapleWeaponType.GUN;
|
||||
if (bow || crossbow || claw || gun) {
|
||||
// Also calc stars into this.
|
||||
MapleInventory inv = getInventory(MapleInventoryType.USE);
|
||||
Inventory inv = getInventory(MapleInventoryType.USE);
|
||||
for (short i = 1; i <= inv.getSlotLimit(); i++) {
|
||||
Item item = inv.getItem(i);
|
||||
if (item != null) {
|
||||
@@ -8279,7 +8279,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
}
|
||||
|
||||
itemsWithType = new ArrayList<>();
|
||||
for (MapleInventory iv : inventory) {
|
||||
for (Inventory iv : inventory) {
|
||||
for (Item item : iv.list()) {
|
||||
itemsWithType.add(new Pair<>(item, iv.getType()));
|
||||
}
|
||||
@@ -8557,7 +8557,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
}
|
||||
|
||||
List<Pair<Item, MapleInventoryType>> itemsWithType = new ArrayList<>();
|
||||
for (MapleInventory iv : inventory) {
|
||||
for (Inventory iv : inventory) {
|
||||
for (Item item : iv.list()) {
|
||||
itemsWithType.add(new Pair<>(item, iv.getType()));
|
||||
}
|
||||
@@ -9139,7 +9139,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void setInventory(MapleInventoryType type, MapleInventory inv) {
|
||||
public void setInventory(MapleInventoryType type, Inventory inv) {
|
||||
inventory[type.ordinal()] = inv;
|
||||
}
|
||||
|
||||
@@ -9329,7 +9329,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
//player decides from which inventory items should be sold.
|
||||
MapleInventoryType type = MapleInventoryType.getByType(invTypeId);
|
||||
|
||||
MapleInventory inv = getInventory(type);
|
||||
Inventory inv = getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
Item it = inv.findByName(name);
|
||||
@@ -9346,7 +9346,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
public int sellAllItemsFromPosition(MapleItemInformationProvider ii, MapleInventoryType type, short pos) {
|
||||
int mesoGain = 0;
|
||||
|
||||
MapleInventory inv = getInventory(type);
|
||||
Inventory inv = getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
for(short i = pos; i <= inv.getSlotLimit(); i++) {
|
||||
@@ -9367,7 +9367,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
quantity = 1;
|
||||
}
|
||||
|
||||
MapleInventory inv = getInventory(type);
|
||||
Inventory inv = getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
Item item = inv.getItem((short) slot);
|
||||
@@ -9443,7 +9443,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
public boolean mergeAllItemsFromName(String name) {
|
||||
MapleInventoryType type = MapleInventoryType.EQUIP;
|
||||
|
||||
MapleInventory inv = getInventory(type);
|
||||
Inventory inv = getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
Item it = inv.findByName(name);
|
||||
@@ -9518,7 +9518,7 @@ public class MapleCharacter extends AbstractMapleCharacterObject {
|
||||
}
|
||||
|
||||
public void mergeAllItemsFromPosition(Map<StatUpgrade, Float> statups, short pos) {
|
||||
MapleInventory inv = getInventory(MapleInventoryType.EQUIP);
|
||||
Inventory inv = getInventory(MapleInventoryType.EQUIP);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
for(short i = pos; i <= inv.getSlotLimit(); i++) {
|
||||
|
||||
@@ -27,7 +27,7 @@ import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.command.Command;
|
||||
import client.inventory.Equip;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import constants.inventory.ItemConstants;
|
||||
|
||||
@@ -46,7 +46,7 @@ public class SetEqStatCommand extends Command {
|
||||
|
||||
short newStat = (short) Math.max(0, Integer.parseInt(params[0]));
|
||||
short newSpdJmp = params.length >= 2 ? (short) Integer.parseInt(params[1]) : 0;
|
||||
MapleInventory equip = player.getInventory(MapleInventoryType.EQUIP);
|
||||
Inventory equip = player.getInventory(MapleInventoryType.EQUIP);
|
||||
|
||||
for (byte i = 1; i <= equip.getSlotLimit(); i++) {
|
||||
try {
|
||||
|
||||
@@ -22,8 +22,8 @@ package client.creator;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.MapleSkinColor;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import config.YamlConfig;
|
||||
import net.server.Server;
|
||||
@@ -58,7 +58,7 @@ public abstract class CharacterFactory {
|
||||
newchar.setJob(recipe.getJob());
|
||||
newchar.setMapId(recipe.getMap());
|
||||
|
||||
MapleInventory equipped = newchar.getInventory(MapleInventoryType.EQUIPPED);
|
||||
Inventory equipped = newchar.getInventory(MapleInventoryType.EQUIPPED);
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
int top = recipe.getTop(), bottom = recipe.getBottom(), shoes = recipe.getShoes(), weapon = recipe.getWeapon();
|
||||
|
||||
@@ -37,18 +37,18 @@ import java.util.Map.Entry;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Matze, Ronan
|
||||
*/
|
||||
public class MapleInventory implements Iterable<Item> {
|
||||
public class Inventory implements Iterable<Item> {
|
||||
protected final Map<Short, Item> inventory;
|
||||
protected final MapleInventoryType type;
|
||||
protected final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.INVENTORY, true);
|
||||
|
||||
protected MapleCharacter owner;
|
||||
protected Map<Short, Item> inventory = new LinkedHashMap<>();
|
||||
protected byte slotLimit;
|
||||
protected MapleInventoryType type;
|
||||
protected boolean checked = false;
|
||||
protected Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.INVENTORY, true);
|
||||
|
||||
public MapleInventory(MapleCharacter mc, MapleInventoryType type, byte slotLimit) {
|
||||
|
||||
public Inventory(MapleCharacter mc, MapleInventoryType type, byte slotLimit) {
|
||||
this.owner = mc;
|
||||
this.inventory = new LinkedHashMap<>();
|
||||
this.type = type;
|
||||
@@ -82,12 +82,12 @@ public class MapleInventory implements Iterable<Item> {
|
||||
toRemove.add(it.getPosition());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (Short slot : toRemove) {
|
||||
removeSlot(slot);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
slotLimit = (byte) newLimit;
|
||||
} finally {
|
||||
lock.unlock();
|
||||
@@ -102,7 +102,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Item findById(int itemId) {
|
||||
for (Item item : list()) {
|
||||
if (item.getItemId() == itemId) {
|
||||
@@ -111,16 +111,16 @@ public class MapleInventory implements Iterable<Item> {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public Item findByName(String name) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
for (Item item : list()) {
|
||||
String itemName = ii.getName(item.getItemId());
|
||||
if(itemName == null) {
|
||||
FilePrinter.printError(FilePrinter.EXCEPTION, "[CRITICAL] Item " + item.getItemId() + " has no name.");
|
||||
if (itemName == null) {
|
||||
FilePrinter.printError(FilePrinter.EXCEPTION, "[CRITICAL] Item " + item.getItemId() + " has no name.");
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (name.compareToIgnoreCase(itemName) == 0) {
|
||||
return item;
|
||||
}
|
||||
@@ -137,7 +137,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
}
|
||||
return qty;
|
||||
}
|
||||
|
||||
|
||||
public int countNotOwnedById(int itemId) {
|
||||
int qty = 0;
|
||||
for (Item item : list()) {
|
||||
@@ -147,18 +147,20 @@ public class MapleInventory implements Iterable<Item> {
|
||||
}
|
||||
return qty;
|
||||
}
|
||||
|
||||
|
||||
public int freeSlotCountById(int itemId, int required) {
|
||||
List<Item> itemList = listById(itemId);
|
||||
int openSlot = 0;
|
||||
|
||||
if(!ItemConstants.isRechargeable(itemId)) {
|
||||
|
||||
if (!ItemConstants.isRechargeable(itemId)) {
|
||||
for (Item item : itemList) {
|
||||
required -= item.getQuantity();
|
||||
|
||||
if(required >= 0) {
|
||||
if (required >= 0) {
|
||||
openSlot++;
|
||||
if(required == 0) return openSlot;
|
||||
if (required == 0) {
|
||||
return openSlot;
|
||||
}
|
||||
} else {
|
||||
return openSlot;
|
||||
}
|
||||
@@ -167,15 +169,17 @@ public class MapleInventory implements Iterable<Item> {
|
||||
for (Item item : itemList) {
|
||||
required -= 1;
|
||||
|
||||
if(required >= 0) {
|
||||
if (required >= 0) {
|
||||
openSlot++;
|
||||
if(required == 0) return openSlot;
|
||||
if (required == 0) {
|
||||
return openSlot;
|
||||
}
|
||||
} else {
|
||||
return openSlot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -186,14 +190,14 @@ public class MapleInventory implements Iterable<Item> {
|
||||
ret.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ret.size() > 1) {
|
||||
ret.sort((i1, i2) -> i1.getPosition() - i2.getPosition());
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
public List<Item> linkedListById(int itemId) {
|
||||
List<Item> ret = new LinkedList<>();
|
||||
for (Item item : list()) {
|
||||
@@ -201,11 +205,11 @@ public class MapleInventory implements Iterable<Item> {
|
||||
ret.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ret.size() > 1) {
|
||||
ret.sort((i1, i2) -> i1.getPosition() - i2.getPosition());
|
||||
}
|
||||
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -228,7 +232,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
private static boolean isSameOwner(Item source, Item target) {
|
||||
return source.getOwner().equals(target.getOwner());
|
||||
}
|
||||
|
||||
|
||||
public void move(short sSlot, short dSlot, short slotMax) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -298,10 +302,10 @@ public class MapleInventory implements Iterable<Item> {
|
||||
}
|
||||
|
||||
protected short addSlot(Item item) {
|
||||
if(item == null) {
|
||||
if (item == null) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
short slotId;
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -309,12 +313,12 @@ public class MapleInventory implements Iterable<Item> {
|
||||
if (slotId < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
inventory.put(slotId, item);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
if (ItemConstants.isRateCoupon(item.getItemId())) {
|
||||
// deadlocks with coupons rates found thanks to GabrielSin & Masterrulax
|
||||
ThreadManager.getInstance().newTask(() -> owner.updateCouponRates());
|
||||
@@ -322,7 +326,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
|
||||
return slotId;
|
||||
}
|
||||
|
||||
|
||||
protected void addSlotFromDB(short slot, Item item) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -330,12 +334,12 @@ public class MapleInventory implements Iterable<Item> {
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
if (ItemConstants.isRateCoupon(item.getItemId())) {
|
||||
ThreadManager.getInstance().newTask(() -> owner.updateCouponRates());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void removeSlot(short slot) {
|
||||
Item item;
|
||||
lock.lock();
|
||||
@@ -344,7 +348,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
if (item != null && ItemConstants.isRateCoupon(item.getItemId())) {
|
||||
ThreadManager.getInstance().newTask(() -> owner.updateCouponRates());
|
||||
}
|
||||
@@ -368,7 +372,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean isFullAfterSomeItems(int margin, int used) {
|
||||
lock.lock();
|
||||
try {
|
||||
@@ -383,7 +387,7 @@ public class MapleInventory implements Iterable<Item> {
|
||||
if (isFull()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
lock.lock();
|
||||
try {
|
||||
for (short i = 1; i <= slotLimit; i++) {
|
||||
@@ -398,10 +402,10 @@ public class MapleInventory implements Iterable<Item> {
|
||||
}
|
||||
|
||||
public short getNumFreeSlot() {
|
||||
if (isFull()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (isFull()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
lock.lock();
|
||||
try {
|
||||
short free = 0;
|
||||
@@ -415,10 +419,10 @@ public class MapleInventory implements Iterable<Item> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static boolean checkItemRestricted(List<Pair<Item, MapleInventoryType>> items) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
|
||||
// thanks Shavit for noticing set creation that would be only effective in rare situations
|
||||
for (Pair<Item, MapleInventoryType> p : items) {
|
||||
int itemid = p.getLeft().getItemId();
|
||||
@@ -426,165 +430,173 @@ public class MapleInventory implements Iterable<Item> {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpot(MapleCharacter chr, Item item) { // thanks Vcoc for noticing pshops not checking item stacks when taking item back
|
||||
return checkSpot(chr, Collections.singletonList(item));
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpot(MapleCharacter chr, List<Item> items) {
|
||||
List<Pair<Item, MapleInventoryType>> listItems = new LinkedList<>();
|
||||
for (Item item : items) {
|
||||
listItems.add(new Pair<>(item, item.getInventoryType()));
|
||||
}
|
||||
|
||||
|
||||
return checkSpotsAndOwnership(chr, listItems);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpots(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items) {
|
||||
return checkSpots(chr, items, false);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpots(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, boolean useProofInv) {
|
||||
int invTypesSize = MapleInventoryType.values().length;
|
||||
List<Integer> zeroedList = new ArrayList<>(invTypesSize);
|
||||
for(byte i = 0; i < invTypesSize; i++) zeroedList.add(0);
|
||||
|
||||
for (byte i = 0; i < invTypesSize; i++) {
|
||||
zeroedList.add(0);
|
||||
}
|
||||
|
||||
return checkSpots(chr, items, zeroedList, useProofInv);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpots(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed, boolean useProofInv) {
|
||||
// assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0.
|
||||
|
||||
|
||||
if (!checkItemRestricted(items)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Map<Integer, List<Integer>> rcvItems = new LinkedHashMap<>();
|
||||
Map<Integer, Byte> rcvTypes = new LinkedHashMap<>();
|
||||
|
||||
for (Pair<Item, MapleInventoryType> item : items) {
|
||||
Integer itemId = item.left.getItemId();
|
||||
List<Integer> qty = rcvItems.get(itemId);
|
||||
|
||||
if(qty == null) {
|
||||
List<Integer> itemQtyList = new LinkedList<>();
|
||||
itemQtyList.add((int) item.left.getQuantity());
|
||||
|
||||
rcvItems.put(itemId, itemQtyList);
|
||||
rcvTypes.put(itemId, item.right.getType());
|
||||
} else {
|
||||
if (!ItemConstants.isEquipment(itemId) && !ItemConstants.isRechargeable(itemId)) {
|
||||
qty.set(0, qty.get(0) + item.left.getQuantity());
|
||||
} else {
|
||||
qty.add((int) item.left.getQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MapleClient c = chr.getClient();
|
||||
for(Entry<Integer, List<Integer>> it: rcvItems.entrySet()) {
|
||||
int itemType = rcvTypes.get(it.getKey()) - 1;
|
||||
|
||||
for (Integer itValue : it.getValue()) {
|
||||
int usedSlots = typesSlotsUsed.get(itemType);
|
||||
|
||||
int result = MapleInventoryManipulator.checkSpaceProgressively(c, it.getKey(), itValue, "", usedSlots, useProofInv);
|
||||
boolean hasSpace = ((result % 2) != 0);
|
||||
|
||||
if(!hasSpace) return false;
|
||||
typesSlotsUsed.set(itemType, (result >> 1));
|
||||
for (Pair<Item, MapleInventoryType> item : items) {
|
||||
Integer itemId = item.left.getItemId();
|
||||
List<Integer> qty = rcvItems.get(itemId);
|
||||
|
||||
if (qty == null) {
|
||||
List<Integer> itemQtyList = new LinkedList<>();
|
||||
itemQtyList.add((int) item.left.getQuantity());
|
||||
|
||||
rcvItems.put(itemId, itemQtyList);
|
||||
rcvTypes.put(itemId, item.right.getType());
|
||||
} else {
|
||||
if (!ItemConstants.isEquipment(itemId) && !ItemConstants.isRechargeable(itemId)) {
|
||||
qty.set(0, qty.get(0) + item.left.getQuantity());
|
||||
} else {
|
||||
qty.add((int) item.left.getQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
MapleClient c = chr.getClient();
|
||||
for (Entry<Integer, List<Integer>> it : rcvItems.entrySet()) {
|
||||
int itemType = rcvTypes.get(it.getKey()) - 1;
|
||||
|
||||
for (Integer itValue : it.getValue()) {
|
||||
int usedSlots = typesSlotsUsed.get(itemType);
|
||||
|
||||
int result = MapleInventoryManipulator.checkSpaceProgressively(c, it.getKey(), itValue, "", usedSlots, useProofInv);
|
||||
boolean hasSpace = ((result % 2) != 0);
|
||||
|
||||
if (!hasSpace) {
|
||||
return false;
|
||||
}
|
||||
typesSlotsUsed.set(itemType, (result >> 1));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private static long fnvHash32(final String k) {
|
||||
final int FNV_32_INIT = 0x811c9dc5;
|
||||
final int FNV_32_PRIME = 0x01000193;
|
||||
|
||||
int rv = FNV_32_INIT;
|
||||
final int len = k.length();
|
||||
for(int i = 0; i < len; i++) {
|
||||
for (int i = 0; i < len; i++) {
|
||||
rv ^= k.charAt(i);
|
||||
rv *= FNV_32_PRIME;
|
||||
}
|
||||
|
||||
|
||||
return rv >= 0 ? rv : (2L * Integer.MAX_VALUE) + rv;
|
||||
}
|
||||
|
||||
|
||||
private static Long hashKey(Integer itemId, String owner) {
|
||||
return (itemId.longValue() << 32L) + fnvHash32(owner);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items) {
|
||||
return checkSpotsAndOwnership(chr, items, false);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, boolean useProofInv) {
|
||||
List<Integer> zeroedList = new ArrayList<>(5);
|
||||
for(byte i = 0; i < 5; i++) zeroedList.add(0);
|
||||
|
||||
for (byte i = 0; i < 5; i++) {
|
||||
zeroedList.add(0);
|
||||
}
|
||||
|
||||
return checkSpotsAndOwnership(chr, items, zeroedList, useProofInv);
|
||||
}
|
||||
|
||||
|
||||
public static boolean checkSpotsAndOwnership(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items, List<Integer> typesSlotsUsed, boolean useProofInv) {
|
||||
//assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0 and item list to be checked is a legal one.
|
||||
|
||||
|
||||
if (!checkItemRestricted(items)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Map<Long, List<Integer>> rcvItems = new LinkedHashMap<>();
|
||||
Map<Long, Byte> rcvTypes = new LinkedHashMap<>();
|
||||
Map<Long, String> rcvOwners = new LinkedHashMap<>();
|
||||
|
||||
for (Pair<Item, MapleInventoryType> item : items) {
|
||||
Long itemHash = hashKey(item.left.getItemId(), item.left.getOwner());
|
||||
List<Integer> qty = rcvItems.get(itemHash);
|
||||
|
||||
if(qty == null) {
|
||||
List<Integer> itemQtyList = new LinkedList<>();
|
||||
itemQtyList.add((int) item.left.getQuantity());
|
||||
|
||||
rcvItems.put(itemHash, itemQtyList);
|
||||
rcvTypes.put(itemHash, item.right.getType());
|
||||
rcvOwners.put(itemHash, item.left.getOwner());
|
||||
} else {
|
||||
// thanks BHB88 for pointing out an issue with rechargeable items being stacked on inventory check
|
||||
if (!ItemConstants.isEquipment(item.left.getItemId()) && !ItemConstants.isRechargeable(item.left.getItemId())) {
|
||||
qty.set(0, qty.get(0) + item.left.getQuantity());
|
||||
} else {
|
||||
qty.add((int) item.left.getQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
MapleClient c = chr.getClient();
|
||||
for(Entry<Long, List<Integer>> it: rcvItems.entrySet()) {
|
||||
int itemType = rcvTypes.get(it.getKey()) - 1;
|
||||
int itemId = (int) (it.getKey() >> 32L);
|
||||
|
||||
for (Integer itValue : it.getValue()) {
|
||||
int usedSlots = typesSlotsUsed.get(itemType);
|
||||
|
||||
//System.out.print("inserting " + itemId.intValue() + " with type " + itemType + " qty " + it.getValue() + " owner '" + rcvOwners.get(it.getKey()) + "' current usedSlots:");
|
||||
//for(Integer i : typesSlotsUsed) System.out.print(" " + i);
|
||||
int result = MapleInventoryManipulator.checkSpaceProgressively(c, itemId, itValue, rcvOwners.get(it.getKey()), usedSlots, useProofInv);
|
||||
boolean hasSpace = ((result % 2) != 0);
|
||||
//System.out.print(" -> hasSpace: " + hasSpace + " RESULT : " + result + "\n");
|
||||
|
||||
if(!hasSpace) return false;
|
||||
typesSlotsUsed.set(itemType, (result >> 1));
|
||||
for (Pair<Item, MapleInventoryType> item : items) {
|
||||
Long itemHash = hashKey(item.left.getItemId(), item.left.getOwner());
|
||||
List<Integer> qty = rcvItems.get(itemHash);
|
||||
|
||||
if (qty == null) {
|
||||
List<Integer> itemQtyList = new LinkedList<>();
|
||||
itemQtyList.add((int) item.left.getQuantity());
|
||||
|
||||
rcvItems.put(itemHash, itemQtyList);
|
||||
rcvTypes.put(itemHash, item.right.getType());
|
||||
rcvOwners.put(itemHash, item.left.getOwner());
|
||||
} else {
|
||||
// thanks BHB88 for pointing out an issue with rechargeable items being stacked on inventory check
|
||||
if (!ItemConstants.isEquipment(item.left.getItemId()) && !ItemConstants.isRechargeable(item.left.getItemId())) {
|
||||
qty.set(0, qty.get(0) + item.left.getQuantity());
|
||||
} else {
|
||||
qty.add((int) item.left.getQuantity());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
MapleClient c = chr.getClient();
|
||||
for (Entry<Long, List<Integer>> it : rcvItems.entrySet()) {
|
||||
int itemType = rcvTypes.get(it.getKey()) - 1;
|
||||
int itemId = (int) (it.getKey() >> 32L);
|
||||
|
||||
for (Integer itValue : it.getValue()) {
|
||||
int usedSlots = typesSlotsUsed.get(itemType);
|
||||
|
||||
//System.out.print("inserting " + itemId.intValue() + " with type " + itemType + " qty " + it.getValue() + " owner '" + rcvOwners.get(it.getKey()) + "' current usedSlots:");
|
||||
//for(Integer i : typesSlotsUsed) System.out.print(" " + i);
|
||||
int result = MapleInventoryManipulator.checkSpaceProgressively(c, itemId, itValue, rcvOwners.get(it.getKey()), usedSlots, useProofInv);
|
||||
boolean hasSpace = ((result % 2) != 0);
|
||||
//System.out.print(" -> hasSpace: " + hasSpace + " RESULT : " + result + "\n");
|
||||
|
||||
if (!hasSpace) {
|
||||
return false;
|
||||
}
|
||||
typesSlotsUsed.set(itemType, (result >> 1));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public MapleInventoryType getType() {
|
||||
return type;
|
||||
}
|
||||
@@ -594,23 +606,20 @@ public class MapleInventory implements Iterable<Item> {
|
||||
return Collections.unmodifiableCollection(list()).iterator();
|
||||
}
|
||||
|
||||
public Collection<MapleInventory> allInventories() {
|
||||
return Collections.singletonList(this);
|
||||
}
|
||||
|
||||
public Item findByCashId(int cashId) {
|
||||
boolean isRing = false;
|
||||
Equip equip = null;
|
||||
for (Item item : list()) {
|
||||
for (Item item : list()) {
|
||||
if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
|
||||
equip = (Equip) item;
|
||||
isRing = equip.getRingId() > -1;
|
||||
}
|
||||
if ((item.getPetId() > -1 ? item.getPetId() : isRing ? equip.getRingId() : item.getCashId()) == cashId)
|
||||
return item;
|
||||
if ((item.getPetId() > -1 ? item.getPetId() : isRing ? equip.getRingId() : item.getCashId()) == cashId) {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean checked() {
|
||||
@@ -630,15 +639,15 @@ public class MapleInventory implements Iterable<Item> {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void lockInventory() {
|
||||
lock.lock();
|
||||
}
|
||||
|
||||
|
||||
public void unlockInventory() {
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
public void dispose() {
|
||||
owner = null;
|
||||
}
|
||||
@@ -25,13 +25,13 @@ import client.MapleCharacter;
|
||||
*
|
||||
* @author Ronan
|
||||
*/
|
||||
public class MapleInventoryProof extends MapleInventory {
|
||||
public class MapleInventoryProof extends Inventory {
|
||||
|
||||
public MapleInventoryProof(MapleCharacter mc) {
|
||||
super(mc, MapleInventoryType.CANHOLD, (byte) 0);
|
||||
}
|
||||
|
||||
public void cloneContents(MapleInventory inv) {
|
||||
public void cloneContents(Inventory inv) {
|
||||
inv.lockInventory();
|
||||
lock.lock();
|
||||
try {
|
||||
|
||||
@@ -66,7 +66,7 @@ public class MapleInventoryManipulator {
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(itemId);
|
||||
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
return addByIdInternal(c, chr, type, inv, itemId, quantity, owner, petid, flag, expiration);
|
||||
@@ -75,7 +75,7 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean addByIdInternal(MapleClient c, MapleCharacter chr, MapleInventoryType type, MapleInventory inv, int itemId, short quantity, String owner, int petid, short flag, long expiration) {
|
||||
private static boolean addByIdInternal(MapleClient c, MapleCharacter chr, MapleInventoryType type, Inventory inv, int itemId, short quantity, String owner, int petid, short flag, long expiration) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
if (!type.equals(MapleInventoryType.EQUIP)) {
|
||||
short slotMax = ii.getSlotMax(c, itemId);
|
||||
@@ -169,7 +169,7 @@ public class MapleInventoryManipulator {
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventoryType type = item.getInventoryType();
|
||||
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
inv.lockInventory();
|
||||
try {
|
||||
return addFromDropInternal(c, chr, type, inv, item, show, petId);
|
||||
@@ -178,7 +178,7 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean addFromDropInternal(MapleClient c, MapleCharacter chr, MapleInventoryType type, MapleInventory inv, Item item, boolean show, int petId) {
|
||||
private static boolean addFromDropInternal(MapleClient c, MapleCharacter chr, MapleInventoryType type, Inventory inv, Item item, boolean show, int petId) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
int itemid = item.getItemId();
|
||||
if (ii.isPickupRestricted(itemid) && chr.haveItemWithId(itemid, true)) {
|
||||
@@ -268,7 +268,7 @@ public class MapleInventoryManipulator {
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean haveItemWithId(MapleInventory inv, int itemid) {
|
||||
private static boolean haveItemWithId(Inventory inv, int itemid) {
|
||||
return inv.findById(itemid) != null;
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ public class MapleInventoryManipulator {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(itemid);
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
|
||||
if (ii.isPickupRestricted(itemid)) {
|
||||
if (haveItemWithId(inv, itemid)) {
|
||||
@@ -331,7 +331,7 @@ public class MapleInventoryManipulator {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = !useProofInv ? ItemConstants.getInventoryType(itemid) : MapleInventoryType.CANHOLD;
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
|
||||
if (ii.isPickupRestricted(itemid)) {
|
||||
if (haveItemWithId(inv, itemid)) {
|
||||
@@ -389,7 +389,7 @@ public class MapleInventoryManipulator {
|
||||
|
||||
public static void removeFromSlot(MapleClient c, MapleInventoryType type, short slot, short quantity, boolean fromDrop, boolean consume) {
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
Item item = inv.getItem(slot);
|
||||
boolean allowZero = consume && ItemConstants.isRechargeable(item.getItemId());
|
||||
|
||||
@@ -437,7 +437,7 @@ public class MapleInventoryManipulator {
|
||||
|
||||
public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
|
||||
int removeQuantity = quantity;
|
||||
MapleInventory inv = c.getPlayer().getInventory(type);
|
||||
Inventory inv = c.getPlayer().getInventory(type);
|
||||
int slotLimit = type == MapleInventoryType.EQUIPPED ? 128 : inv.getSlotLimit();
|
||||
|
||||
for (short i = 0; i <= slotLimit; i++) {
|
||||
@@ -465,7 +465,7 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
|
||||
public static void move(MapleClient c, MapleInventoryType type, short src, short dst) {
|
||||
MapleInventory inv = c.getPlayer().getInventory(type);
|
||||
Inventory inv = c.getPlayer().getInventory(type);
|
||||
|
||||
if (src < 0 || dst < 0) {
|
||||
return;
|
||||
@@ -505,8 +505,8 @@ public class MapleInventoryManipulator {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory eqpInv = chr.getInventory(MapleInventoryType.EQUIP);
|
||||
MapleInventory eqpdInv = chr.getInventory(MapleInventoryType.EQUIPPED);
|
||||
Inventory eqpInv = chr.getInventory(MapleInventoryType.EQUIP);
|
||||
Inventory eqpdInv = chr.getInventory(MapleInventoryType.EQUIPPED);
|
||||
|
||||
Equip source = (Equip) eqpInv.getItem(src);
|
||||
if (source == null || !ii.canWearEquipment(chr, source, dst)) {
|
||||
@@ -620,8 +620,8 @@ public class MapleInventoryManipulator {
|
||||
|
||||
public static void unequip(MapleClient c, short src, short dst) {
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory eqpInv = chr.getInventory(MapleInventoryType.EQUIP);
|
||||
MapleInventory eqpdInv = chr.getInventory(MapleInventoryType.EQUIPPED);
|
||||
Inventory eqpInv = chr.getInventory(MapleInventoryType.EQUIP);
|
||||
Inventory eqpdInv = chr.getInventory(MapleInventoryType.EQUIPPED);
|
||||
|
||||
Equip source = (Equip) eqpdInv.getItem(src);
|
||||
Equip target = (Equip) eqpInv.getItem(dst);
|
||||
@@ -685,7 +685,7 @@ public class MapleInventoryManipulator {
|
||||
}
|
||||
|
||||
MapleCharacter chr = c.getPlayer();
|
||||
MapleInventory inv = chr.getInventory(type);
|
||||
Inventory inv = chr.getInventory(type);
|
||||
Item source = inv.getItem(src);
|
||||
|
||||
if (chr.getTrade() != null || chr.getMiniGame() != null || source == null) { //Only check needed would prob be merchants (to see if the player is in one)
|
||||
|
||||
@@ -23,8 +23,8 @@ package client.processor.action;
|
||||
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import client.inventory.manipulator.MapleInventoryManipulator;
|
||||
import config.YamlConfig;
|
||||
@@ -96,7 +96,7 @@ public class PetAutopotProcessor {
|
||||
curHp = chr.getHp();
|
||||
curMp = chr.getMp();
|
||||
|
||||
MapleInventory useInv = chr.getInventory(MapleInventoryType.USE);
|
||||
Inventory useInv = chr.getInventory(MapleInventoryType.USE);
|
||||
useInv.lockInventory();
|
||||
try {
|
||||
toUse = useInv.getItem(slot);
|
||||
|
||||
@@ -26,9 +26,9 @@ package client.processor.npc;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.autoban.AutobanFactory;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.ItemFactory;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import client.inventory.manipulator.MapleInventoryManipulator;
|
||||
import client.inventory.manipulator.MapleKarmaManipulator;
|
||||
@@ -242,7 +242,7 @@ public class DueyProcessor {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
MapleInventoryType invType = MapleInventoryType.getByType(invTypeId);
|
||||
MapleInventory inv = c.getPlayer().getInventory(invType);
|
||||
Inventory inv = c.getPlayer().getInventory(invType);
|
||||
|
||||
Item item;
|
||||
inv.lockInventory();
|
||||
|
||||
@@ -25,9 +25,9 @@ package client.processor.npc;
|
||||
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.ItemFactory;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import client.inventory.manipulator.MapleInventoryManipulator;
|
||||
import net.server.Server;
|
||||
@@ -53,7 +53,7 @@ public class FredrickProcessor {
|
||||
private static int[] dailyReminders = new int[]{2, 5, 10, 15, 30, 60, 90, Integer.MAX_VALUE};
|
||||
|
||||
private static byte canRetrieveFromFredrick(MapleCharacter chr, List<Pair<Item, MapleInventoryType>> items) {
|
||||
if (!MapleInventory.checkSpotsAndOwnership(chr, items)) {
|
||||
if (!Inventory.checkSpotsAndOwnership(chr, items)) {
|
||||
List<Integer> itemids = new LinkedList<>();
|
||||
for (Pair<Item, MapleInventoryType> it : items) {
|
||||
itemids.add(it.getLeft().getItemId());
|
||||
|
||||
@@ -24,8 +24,8 @@ package client.processor.npc;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.autoban.AutobanFactory;
|
||||
import client.inventory.Inventory;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import client.inventory.manipulator.MapleInventoryManipulator;
|
||||
import client.inventory.manipulator.MapleKarmaManipulator;
|
||||
@@ -107,7 +107,7 @@ public class StorageProcessor {
|
||||
int itemId = p.readInt();
|
||||
short quantity = p.readShort();
|
||||
MapleInventoryType invType = ItemConstants.getInventoryType(itemId);
|
||||
MapleInventory inv = chr.getInventory(invType);
|
||||
Inventory inv = chr.getInventory(invType);
|
||||
if (slot < 1 || slot > inv.getSlotLimit()) { //player inv starts at one
|
||||
AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with storage.");
|
||||
FilePrinter.print(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to store item at slot " + slot);
|
||||
|
||||
Reference in New Issue
Block a user