From 1b945bca1078d2f82c8cf2e019d6c28c8b203578 Mon Sep 17 00:00:00 2001 From: P0nk Date: Tue, 7 Sep 2021 08:00:14 +0200 Subject: [PATCH 1/4] Rename and clean up MapleInventory --- src/main/java/client/MapleCharacter.java | 34 +- .../commands/gm4/SetEqStatCommand.java | 4 +- .../java/client/creator/CharacterFactory.java | 4 +- .../{MapleInventory.java => Inventory.java} | 311 +++++++++--------- .../client/inventory/MapleInventoryProof.java | 4 +- .../MapleInventoryManipulator.java | 30 +- .../processor/action/PetAutopotProcessor.java | 4 +- .../client/processor/npc/DueyProcessor.java | 4 +- .../processor/npc/FredrickProcessor.java | 4 +- .../processor/npc/StorageProcessor.java | 4 +- .../channel/handlers/AdminCommandHandler.java | 4 +- .../handlers/CashOperationHandler.java | 4 +- .../handlers/InventoryMergeHandler.java | 4 +- .../handlers/InventorySortHandler.java | 2 +- .../channel/handlers/PetFoodHandler.java | 4 +- .../handlers/PlayerInteractionHandler.java | 4 +- .../handlers/PlayerLoggedinHandler.java | 2 +- .../channel/handlers/RaiseIncExpHandler.java | 4 +- .../channel/handlers/RangedAttackHandler.java | 6 +- .../channel/handlers/ScrollHandler.java | 6 +- .../channel/handlers/SkillBookHandler.java | 4 +- .../channel/handlers/TakeDamageHandler.java | 4 +- .../channel/handlers/UseCashItemHandler.java | 4 +- .../channel/handlers/UseMountFoodHandler.java | 4 +- .../channel/handlers/UseSolomonHandler.java | 4 +- .../channel/handlers/WeddingHandler.java | 8 +- .../scripting/AbstractPlayerInteraction.java | 12 +- .../server/MapleItemInformationProvider.java | 2 +- src/main/java/server/MapleMarriage.java | 4 +- src/main/java/server/MapleStatEffect.java | 4 +- src/main/java/server/MapleTrade.java | 4 +- .../java/server/maps/MapleHiredMerchant.java | 6 +- .../java/server/maps/MaplePlayerShop.java | 4 +- src/main/java/tools/PacketCreator.java | 4 +- 34 files changed, 260 insertions(+), 251 deletions(-) rename src/main/java/client/inventory/{MapleInventory.java => Inventory.java} (76%) diff --git a/src/main/java/client/MapleCharacter.java b/src/main/java/client/MapleCharacter.java index ec0d1a5929..94a2e7b047 100644 --- a/src/main/java/client/MapleCharacter.java +++ b/src/main/java/client/MapleCharacter.java @@ -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 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> 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 statups, short pos) { - MapleInventory inv = getInventory(MapleInventoryType.EQUIP); + Inventory inv = getInventory(MapleInventoryType.EQUIP); inv.lockInventory(); try { for(short i = pos; i <= inv.getSlotLimit(); i++) { diff --git a/src/main/java/client/command/commands/gm4/SetEqStatCommand.java b/src/main/java/client/command/commands/gm4/SetEqStatCommand.java index ae35e89cff..c9fc51298d 100644 --- a/src/main/java/client/command/commands/gm4/SetEqStatCommand.java +++ b/src/main/java/client/command/commands/gm4/SetEqStatCommand.java @@ -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 { diff --git a/src/main/java/client/creator/CharacterFactory.java b/src/main/java/client/creator/CharacterFactory.java index d4d74e1768..a2ed797925 100644 --- a/src/main/java/client/creator/CharacterFactory.java +++ b/src/main/java/client/creator/CharacterFactory.java @@ -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(); diff --git a/src/main/java/client/inventory/MapleInventory.java b/src/main/java/client/inventory/Inventory.java similarity index 76% rename from src/main/java/client/inventory/MapleInventory.java rename to src/main/java/client/inventory/Inventory.java index 86be247466..d1f23d9903 100644 --- a/src/main/java/client/inventory/MapleInventory.java +++ b/src/main/java/client/inventory/Inventory.java @@ -37,18 +37,18 @@ import java.util.Map.Entry; import java.util.concurrent.locks.Lock; /** - * * @author Matze, Ronan */ -public class MapleInventory implements Iterable { +public class Inventory implements Iterable { + protected final Map inventory; + protected final MapleInventoryType type; + protected final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.INVENTORY, true); + protected MapleCharacter owner; - protected Map 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 { 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 { lock.unlock(); } } - + public Item findById(int itemId) { for (Item item : list()) { if (item.getItemId() == itemId) { @@ -111,16 +111,16 @@ public class MapleInventory implements Iterable { } 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 { } return qty; } - + public int countNotOwnedById(int itemId) { int qty = 0; for (Item item : list()) { @@ -147,18 +147,20 @@ public class MapleInventory implements Iterable { } return qty; } - + public int freeSlotCountById(int itemId, int required) { List 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 { 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 { ret.add(item); } } - + if (ret.size() > 1) { ret.sort((i1, i2) -> i1.getPosition() - i2.getPosition()); } - + return ret; } - + public List linkedListById(int itemId) { List ret = new LinkedList<>(); for (Item item : list()) { @@ -201,11 +205,11 @@ public class MapleInventory implements Iterable { 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 { 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 { } 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 { 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 { return slotId; } - + protected void addSlotFromDB(short slot, Item item) { lock.lock(); try { @@ -330,12 +334,12 @@ public class MapleInventory implements Iterable { } 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 { } finally { lock.unlock(); } - + if (item != null && ItemConstants.isRateCoupon(item.getItemId())) { ThreadManager.getInstance().newTask(() -> owner.updateCouponRates()); } @@ -368,7 +372,7 @@ public class MapleInventory implements Iterable { lock.unlock(); } } - + public boolean isFullAfterSomeItems(int margin, int used) { lock.lock(); try { @@ -383,7 +387,7 @@ public class MapleInventory implements Iterable { if (isFull()) { return -1; } - + lock.lock(); try { for (short i = 1; i <= slotLimit; i++) { @@ -398,10 +402,10 @@ public class MapleInventory implements Iterable { } 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 { lock.unlock(); } } - + private static boolean checkItemRestricted(List> items) { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); - + // thanks Shavit for noticing set creation that would be only effective in rare situations for (Pair p : items) { int itemid = p.getLeft().getItemId(); @@ -426,165 +430,173 @@ public class MapleInventory implements Iterable { 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 items) { List> 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> items) { return checkSpots(chr, items, false); } - + public static boolean checkSpots(MapleCharacter chr, List> items, boolean useProofInv) { int invTypesSize = MapleInventoryType.values().length; List 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> items, List typesSlotsUsed, boolean useProofInv) { // assumption: no "UNDEFINED" or "EQUIPPED" items shall be tested here, all counts are >= 0. - + if (!checkItemRestricted(items)) { return false; } - + Map> rcvItems = new LinkedHashMap<>(); Map rcvTypes = new LinkedHashMap<>(); - - for (Pair item : items) { - Integer itemId = item.left.getItemId(); - List qty = rcvItems.get(itemId); - - if(qty == null) { - List 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> 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 : items) { + Integer itemId = item.left.getItemId(); + List qty = rcvItems.get(itemId); + + if (qty == null) { + List 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> 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> items) { return checkSpotsAndOwnership(chr, items, false); } - + public static boolean checkSpotsAndOwnership(MapleCharacter chr, List> items, boolean useProofInv) { List 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> items, List 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> rcvItems = new LinkedHashMap<>(); Map rcvTypes = new LinkedHashMap<>(); Map rcvOwners = new LinkedHashMap<>(); - - for (Pair item : items) { - Long itemHash = hashKey(item.left.getItemId(), item.left.getOwner()); - List qty = rcvItems.get(itemHash); - - if(qty == null) { - List 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> 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 : items) { + Long itemHash = hashKey(item.left.getItemId(), item.left.getOwner()); + List qty = rcvItems.get(itemHash); + + if (qty == null) { + List 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> 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 { return Collections.unmodifiableCollection(list()).iterator(); } - public Collection 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 { lock.unlock(); } } - + public void lockInventory() { lock.lock(); } - + public void unlockInventory() { lock.unlock(); } - + public void dispose() { owner = null; } diff --git a/src/main/java/client/inventory/MapleInventoryProof.java b/src/main/java/client/inventory/MapleInventoryProof.java index f90c5191d8..12bbd73219 100644 --- a/src/main/java/client/inventory/MapleInventoryProof.java +++ b/src/main/java/client/inventory/MapleInventoryProof.java @@ -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 { diff --git a/src/main/java/client/inventory/manipulator/MapleInventoryManipulator.java b/src/main/java/client/inventory/manipulator/MapleInventoryManipulator.java index 1199cdfd2a..bf47df80b0 100644 --- a/src/main/java/client/inventory/manipulator/MapleInventoryManipulator.java +++ b/src/main/java/client/inventory/manipulator/MapleInventoryManipulator.java @@ -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) diff --git a/src/main/java/client/processor/action/PetAutopotProcessor.java b/src/main/java/client/processor/action/PetAutopotProcessor.java index 45114854bb..508d54c870 100644 --- a/src/main/java/client/processor/action/PetAutopotProcessor.java +++ b/src/main/java/client/processor/action/PetAutopotProcessor.java @@ -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); diff --git a/src/main/java/client/processor/npc/DueyProcessor.java b/src/main/java/client/processor/npc/DueyProcessor.java index 8e955a7d22..fa45802c88 100644 --- a/src/main/java/client/processor/npc/DueyProcessor.java +++ b/src/main/java/client/processor/npc/DueyProcessor.java @@ -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(); diff --git a/src/main/java/client/processor/npc/FredrickProcessor.java b/src/main/java/client/processor/npc/FredrickProcessor.java index d15b4bf63d..46222fe641 100644 --- a/src/main/java/client/processor/npc/FredrickProcessor.java +++ b/src/main/java/client/processor/npc/FredrickProcessor.java @@ -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> items) { - if (!MapleInventory.checkSpotsAndOwnership(chr, items)) { + if (!Inventory.checkSpotsAndOwnership(chr, items)) { List itemids = new LinkedList<>(); for (Pair it : items) { itemids.add(it.getLeft().getItemId()); diff --git a/src/main/java/client/processor/npc/StorageProcessor.java b/src/main/java/client/processor/npc/StorageProcessor.java index 65679e7439..4c0fcb1f0d 100644 --- a/src/main/java/client/processor/npc/StorageProcessor.java +++ b/src/main/java/client/processor/npc/StorageProcessor.java @@ -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); diff --git a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java index c57db236a9..4ab9586cc1 100644 --- a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java +++ b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java @@ -23,7 +23,7 @@ package net.server.channel.handlers; import client.MapleCharacter; import client.MapleClient; -import client.inventory.MapleInventory; +import client.inventory.Inventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import net.AbstractPacketHandler; @@ -62,7 +62,7 @@ public final class AdminCommandHandler extends AbstractPacketHandler { break; case 0x01: { // /d (inv) byte type = p.readByte(); - MapleInventory in = c.getPlayer().getInventory(MapleInventoryType.getByType(type)); + Inventory in = c.getPlayer().getInventory(MapleInventoryType.getByType(type)); for (short i = 1; i <= in.getSlotLimit(); i++) { //TODO What is the point of this loop? if (in.getItem(i) != null) { MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.getByType(type), i, in.getItem(i).getQuantity(), false); diff --git a/src/main/java/net/server/channel/handlers/CashOperationHandler.java b/src/main/java/net/server/channel/handlers/CashOperationHandler.java index 8eb518cc30..d7e6dbd967 100644 --- a/src/main/java/net/server/channel/handlers/CashOperationHandler.java +++ b/src/main/java/net/server/channel/handlers/CashOperationHandler.java @@ -25,8 +25,8 @@ import client.MapleCharacter; import client.MapleClient; import client.MapleRing; import client.inventory.Equip; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import config.YamlConfig; @@ -280,7 +280,7 @@ public final class CashOperationHandler extends AbstractPacketHandler { return; } - MapleInventory mi = chr.getInventory(MapleInventoryType.getByType(invType)); + Inventory mi = chr.getInventory(MapleInventoryType.getByType(invType)); Item item = mi.findByCashId(cashId); if (item == null) { c.enableCSActions(); diff --git a/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java b/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java index 671d3dc152..1f933f52b4 100644 --- a/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java +++ b/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java @@ -23,8 +23,8 @@ package net.server.channel.handlers; 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; @@ -54,7 +54,7 @@ public final class InventoryMergeHandler extends AbstractPacketHandler { } MapleInventoryType inventoryType = MapleInventoryType.getByType(invType); - MapleInventory inventory = c.getPlayer().getInventory(inventoryType); + Inventory inventory = c.getPlayer().getInventory(inventoryType); inventory.lockInventory(); try { //------------------- RonanLana's SLOT MERGER ----------------- diff --git a/src/main/java/net/server/channel/handlers/InventorySortHandler.java b/src/main/java/net/server/channel/handlers/InventorySortHandler.java index 5e9c1f7cd6..e2d42ba806 100644 --- a/src/main/java/net/server/channel/handlers/InventorySortHandler.java +++ b/src/main/java/net/server/channel/handlers/InventorySortHandler.java @@ -280,7 +280,7 @@ public final class InventorySortHandler extends AbstractPacketHandler { ArrayList itemarray = new ArrayList<>(); List mods = new ArrayList<>(); - MapleInventory inventory = chr.getInventory(MapleInventoryType.getByType(invType)); + Inventory inventory = chr.getInventory(MapleInventoryType.getByType(invType)); inventory.lockInventory(); try { for (short i = 1; i <= inventory.getSlotLimit(); i++) { diff --git a/src/main/java/net/server/channel/handlers/PetFoodHandler.java b/src/main/java/net/server/channel/handlers/PetFoodHandler.java index a40f8369ed..a97d6e89f8 100644 --- a/src/main/java/net/server/channel/handlers/PetFoodHandler.java +++ b/src/main/java/net/server/channel/handlers/PetFoodHandler.java @@ -24,8 +24,8 @@ package net.server.channel.handlers; import client.MapleCharacter; import client.MapleClient; import client.autoban.AutobanManager; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.MaplePet; import client.inventory.manipulator.MapleInventoryManipulator; @@ -71,7 +71,7 @@ public final class PetFoodHandler extends AbstractPacketHandler { if (c.tryacquireClient()) { try { - MapleInventory useInv = chr.getInventory(MapleInventoryType.USE); + Inventory useInv = chr.getInventory(MapleInventoryType.USE); useInv.lockInventory(); try { Item use = useInv.getItem(pos); diff --git a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java index 2299b8b225..2bf4ae05ec 100644 --- a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java @@ -24,8 +24,8 @@ package net.server.channel.handlers; 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; @@ -518,7 +518,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } } - MapleInventory inv = chr.getInventory(ivType); + Inventory inv = chr.getInventory(ivType); inv.lockInventory(); try { Item checkItem = chr.getInventory(ivType).getItem(pos); diff --git a/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java index 5aef0a9ca5..aafec75622 100644 --- a/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -314,7 +314,7 @@ public final class PlayerLoggedinHandler extends AbstractPacketHandler { player.updatePartyMemberHP(); } - MapleInventory eqpInv = player.getInventory(MapleInventoryType.EQUIPPED); + Inventory eqpInv = player.getInventory(MapleInventoryType.EQUIPPED); eqpInv.lockInventory(); try { for (Item it : eqpInv.list()) { diff --git a/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java b/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java index 9e58bf5261..186f925af7 100644 --- a/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java +++ b/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java @@ -3,7 +3,7 @@ package net.server.channel.handlers; import client.MapleCharacter; import client.MapleClient; import client.MapleQuestStatus; -import client.inventory.MapleInventory; +import client.inventory.Inventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import net.AbstractPacketHandler; @@ -47,7 +47,7 @@ public class RaiseIncExpHandler extends AbstractPacketHandler { } int consId; - MapleInventory inv = chr.getInventory(MapleInventoryType.getByType(inventorytype)); + Inventory inv = chr.getInventory(MapleInventoryType.getByType(inventorytype)); inv.lockInventory(); try { consId = inv.getItem(slot).getItemId(); diff --git a/src/main/java/net/server/channel/handlers/RangedAttackHandler.java b/src/main/java/net/server/channel/handlers/RangedAttackHandler.java index 231928b404..8fa683db8e 100644 --- a/src/main/java/net/server/channel/handlers/RangedAttackHandler.java +++ b/src/main/java/net/server/channel/handlers/RangedAttackHandler.java @@ -22,8 +22,8 @@ along with this program. If not, see . package net.server.channel.handlers; import client.*; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.MapleWeaponType; import client.inventory.manipulator.MapleInventoryManipulator; @@ -123,7 +123,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { if (hasShadowPartner) { bulletCount *= 2; } - MapleInventory inv = chr.getInventory(MapleInventoryType.USE); + Inventory inv = chr.getInventory(MapleInventoryType.USE); for (short i = 1; i <= inv.getSlotLimit(); i++) { Item item = inv.getItem(i); if (item != null) { @@ -174,7 +174,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { if (projectile != 0 || soulArrow || attack.skill == 11101004 || attack.skill == 15111007 || attack.skill == 14101006 || attack.skill == 4111004 || attack.skill == 13101005) { int visProjectile = projectile; //visible projectile sent to players if (ItemConstants.isThrowingStar(projectile)) { - MapleInventory cash = chr.getInventory(MapleInventoryType.CASH); + Inventory cash = chr.getInventory(MapleInventoryType.CASH); for (int i = 1; i <= cash.getSlotLimit(); i++) { // impose order... Item item = cash.getItem((short) i); if (item != null) { diff --git a/src/main/java/net/server/channel/handlers/ScrollHandler.java b/src/main/java/net/server/channel/handlers/ScrollHandler.java index b1d439c528..049195cc58 100644 --- a/src/main/java/net/server/channel/handlers/ScrollHandler.java +++ b/src/main/java/net/server/channel/handlers/ScrollHandler.java @@ -68,7 +68,7 @@ public final class ScrollHandler extends AbstractPacketHandler { } byte oldLevel = toScroll.getLevel(); byte oldSlots = toScroll.getUpgradeSlots(); - MapleInventory useInventory = chr.getInventory(MapleInventoryType.USE); + Inventory useInventory = chr.getInventory(MapleInventoryType.USE); Item scroll = useInventory.getItem(slot); Item wscroll = null; @@ -141,7 +141,7 @@ public final class ScrollHandler extends AbstractPacketHandler { if(!ItemConstants.isWeddingRing(toScroll.getItemId())) { mods.add(new ModifyInventory(3, toScroll)); if (dst < 0) { - MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); + Inventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); inv.lockInventory(); try { @@ -151,7 +151,7 @@ public final class ScrollHandler extends AbstractPacketHandler { inv.unlockInventory(); } } else { - MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIP); + Inventory inv = chr.getInventory(MapleInventoryType.EQUIP); inv.lockInventory(); try { diff --git a/src/main/java/net/server/channel/handlers/SkillBookHandler.java b/src/main/java/net/server/channel/handlers/SkillBookHandler.java index 46fbe159c2..c0a2f711b8 100644 --- a/src/main/java/net/server/channel/handlers/SkillBookHandler.java +++ b/src/main/java/net/server/channel/handlers/SkillBookHandler.java @@ -25,8 +25,8 @@ import client.MapleCharacter; import client.MapleClient; import client.Skill; import client.SkillFactory; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import net.AbstractPacketHandler; @@ -56,7 +56,7 @@ public final class SkillBookHandler extends AbstractPacketHandler { MapleCharacter player = c.getPlayer(); if (c.tryacquireClient()) { try { - MapleInventory inv = c.getPlayer().getInventory(MapleInventoryType.USE); + Inventory inv = c.getPlayer().getInventory(MapleInventoryType.USE); Item toUse = inv.getItem(slot); if (toUse == null || toUse.getItemId() != itemId) { return; diff --git a/src/main/java/net/server/channel/handlers/TakeDamageHandler.java b/src/main/java/net/server/channel/handlers/TakeDamageHandler.java index a8ee3c0b2f..a6c05afeb1 100644 --- a/src/main/java/net/server/channel/handlers/TakeDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/TakeDamageHandler.java @@ -22,8 +22,8 @@ along with this program. If not, see . package net.server.channel.handlers; import client.*; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import client.status.MonsterStatus; @@ -105,7 +105,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { if (dropCount > 0) { int qty; - MapleInventory inv = chr.getInventory(type); + Inventory inv = chr.getInventory(type); inv.lockInventory(); try { qty = Math.min(chr.countItem(loseItem.getId()), dropCount); diff --git a/src/main/java/net/server/channel/handlers/UseCashItemHandler.java b/src/main/java/net/server/channel/handlers/UseCashItemHandler.java index 7db167a8d2..e587f6bb1a 100644 --- a/src/main/java/net/server/channel/handlers/UseCashItemHandler.java +++ b/src/main/java/net/server/channel/handlers/UseCashItemHandler.java @@ -68,7 +68,7 @@ public final class UseCashItemHandler extends AbstractPacketHandler { int itemId = p.readInt(); int itemType = itemId / 10000; - MapleInventory cashInv = player.getInventory(MapleInventoryType.CASH); + Inventory cashInv = player.getInventory(MapleInventoryType.CASH); Item toUse = cashInv.getItem(position); if (toUse == null || toUse.getItemId() != itemId) { toUse = cashInv.findById(itemId); @@ -601,7 +601,7 @@ public final class UseCashItemHandler extends AbstractPacketHandler { } private static void remove(MapleClient c, short position, int itemid) { - MapleInventory cashInv = c.getPlayer().getInventory(MapleInventoryType.CASH); + Inventory cashInv = c.getPlayer().getInventory(MapleInventoryType.CASH); cashInv.lockInventory(); try { Item it = cashInv.getItem(position); diff --git a/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java b/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java index bf940ebc60..af689945bb 100644 --- a/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java +++ b/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java @@ -24,8 +24,8 @@ package net.server.channel.handlers; import client.MapleCharacter; import client.MapleClient; import client.MapleMount; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import constants.game.ExpTable; @@ -46,7 +46,7 @@ public final class UseMountFoodHandler extends AbstractPacketHandler { MapleCharacter chr = c.getPlayer(); MapleMount mount = chr.getMount(); - MapleInventory useInv = chr.getInventory(MapleInventoryType.USE); + Inventory useInv = chr.getInventory(MapleInventoryType.USE); if (c.tryacquireClient()) { try { diff --git a/src/main/java/net/server/channel/handlers/UseSolomonHandler.java b/src/main/java/net/server/channel/handlers/UseSolomonHandler.java index 94afa50451..d2b3533aa4 100644 --- a/src/main/java/net/server/channel/handlers/UseSolomonHandler.java +++ b/src/main/java/net/server/channel/handlers/UseSolomonHandler.java @@ -23,8 +23,8 @@ package net.server.channel.handlers; 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 net.AbstractPacketHandler; @@ -50,7 +50,7 @@ public final class UseSolomonHandler extends AbstractPacketHandler { if (c.tryacquireClient()) { try { MapleCharacter chr = c.getPlayer(); - MapleInventory inv = chr.getInventory(MapleInventoryType.USE); + Inventory inv = chr.getInventory(MapleInventoryType.USE); inv.lockInventory(); try { Item slotItem = inv.getItem(slot); diff --git a/src/main/java/net/server/channel/handlers/WeddingHandler.java b/src/main/java/net/server/channel/handlers/WeddingHandler.java index 2bb0b9a1c5..37ec41c22c 100644 --- a/src/main/java/net/server/channel/handlers/WeddingHandler.java +++ b/src/main/java/net/server/channel/handlers/WeddingHandler.java @@ -9,8 +9,8 @@ package net.server.channel.handlers; 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 client.inventory.manipulator.MapleKarmaManipulator; @@ -57,7 +57,7 @@ public final class WeddingHandler extends AbstractPacketHandler { MapleCharacter spouse = marriage.getPlayerById(cid); if (spouse != null) { MapleInventoryType type = ItemConstants.getInventoryType(itemid); - MapleInventory chrInv = chr.getInventory(type); + Inventory chrInv = chr.getInventory(type); Item newItem = null; chrInv.lockInventory(); @@ -111,7 +111,7 @@ public final class WeddingHandler extends AbstractPacketHandler { if (groomWishlist != null) { Item item = marriage.getGiftItem(c, groomWishlist, itemPos); if (item != null) { - if (MapleInventory.checkSpot(chr, item)) { + if (Inventory.checkSpot(chr, item)) { marriage.removeGiftItem(groomWishlist, item); marriage.saveGiftItemsToDb(c, groomWishlist, chr.getId()); @@ -131,7 +131,7 @@ public final class WeddingHandler extends AbstractPacketHandler { List items = c.getAbstractPlayerInteraction().getUnclaimedMarriageGifts(); try { Item item = items.get(itemPos); - if (MapleInventory.checkSpot(chr, item)) { + if (Inventory.checkSpot(chr, item)) { items.remove(itemPos); MapleMarriage.saveGiftItemsToDb(c, items, chr.getId()); diff --git a/src/main/java/scripting/AbstractPlayerInteraction.java b/src/main/java/scripting/AbstractPlayerInteraction.java index e4734b8cc1..24214ebd43 100644 --- a/src/main/java/scripting/AbstractPlayerInteraction.java +++ b/src/main/java/scripting/AbstractPlayerInteraction.java @@ -169,11 +169,11 @@ public class AbstractPlayerInteraction { return getPlayer().getEventInstance(); } - public MapleInventory getInventory(int type) { + public Inventory getInventory(int type) { return getPlayer().getInventory(MapleInventoryType.getByType((byte) type)); } - public MapleInventory getInventory(MapleInventoryType type) { + public Inventory getInventory(MapleInventoryType type) { return getPlayer().getInventory(type); } @@ -251,7 +251,7 @@ public class AbstractPlayerInteraction { addedItems.add(new Pair<>(it, ItemConstants.getInventoryType(itemids.get(i)))); } - return MapleInventory.checkSpots(c.getPlayer(), addedItems, false); + return Inventory.checkSpots(c.getPlayer(), addedItems); } private List> prepareProofInventoryItems(List> items) { @@ -293,7 +293,7 @@ public class AbstractPlayerInteraction { if(!toAdd.isEmpty()) { List> toRemove = toRemoveItemList.get(i); - MapleInventory inv = this.getInventory(i); + Inventory inv = this.getInventory(i); prfInv.cloneContents(inv); for(Pair p : toRemove) { @@ -302,7 +302,7 @@ public class AbstractPlayerInteraction { List> addItems = prepareProofInventoryItems(toAdd); - boolean canHold = MapleInventory.checkSpots(c.getPlayer(), addItems, true); + boolean canHold = Inventory.checkSpots(c.getPlayer(), addItems, true); if(!canHold) { return false; } @@ -843,7 +843,7 @@ public class AbstractPlayerInteraction { public void removeFromParty(int id, List party) { for (MapleCharacter chr : party) { MapleInventoryType type = ItemConstants.getInventoryType(id); - MapleInventory iv = chr.getInventory(type); + Inventory iv = chr.getInventory(type); int possesed = iv.countById(id); if (possesed > 0) { MapleInventoryManipulator.removeById(c, ItemConstants.getInventoryType(id), id, possesed, true, false); diff --git a/src/main/java/server/MapleItemInformationProvider.java b/src/main/java/server/MapleItemInformationProvider.java index c74b8b1bba..5dca23d0dd 100644 --- a/src/main/java/server/MapleItemInformationProvider.java +++ b/src/main/java/server/MapleItemInformationProvider.java @@ -1581,7 +1581,7 @@ public class MapleItemInformationProvider { } public Collection canWearEquipment(MapleCharacter chr, Collection items) { - MapleInventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); + Inventory inv = chr.getInventory(MapleInventoryType.EQUIPPED); if (inv.checked()) { return items; } diff --git a/src/main/java/server/MapleMarriage.java b/src/main/java/server/MapleMarriage.java index 3f9110b846..ee3200c552 100644 --- a/src/main/java/server/MapleMarriage.java +++ b/src/main/java/server/MapleMarriage.java @@ -21,9 +21,9 @@ package server; 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 scripting.event.EventInstanceManager; @@ -118,7 +118,7 @@ public class MapleMarriage extends EventInstanceManager { public static boolean claimGiftItems(MapleClient c, MapleCharacter chr) { List gifts = loadGiftItemsFromDb(c, chr.getId()); - if (MapleInventory.checkSpot(chr, gifts)) { + if (Inventory.checkSpot(chr, gifts)) { try (Connection con = DatabaseConnection.getConnection()) { ItemFactory.MARRIAGE_GIFTS.saveItems(new LinkedList<>(), chr.getId(), con); } catch (SQLException sqle) { diff --git a/src/main/java/server/MapleStatEffect.java b/src/main/java/server/MapleStatEffect.java index 0f8d5def92..3eea513439 100644 --- a/src/main/java/server/MapleStatEffect.java +++ b/src/main/java/server/MapleStatEffect.java @@ -22,8 +22,8 @@ package server; import client.*; +import client.inventory.Inventory; import client.inventory.Item; -import client.inventory.MapleInventory; import client.inventory.MapleInventoryType; import client.inventory.manipulator.MapleInventoryManipulator; import client.status.MonsterStatus; @@ -940,7 +940,7 @@ public class MapleStatEffect { if (isShadowClaw()) { short projectileConsume = this.getBulletConsume(); // noticed by shavit - MapleInventory use = applyto.getInventory(MapleInventoryType.USE); + Inventory use = applyto.getInventory(MapleInventoryType.USE); use.lockInventory(); try { Item projectile = null; diff --git a/src/main/java/server/MapleTrade.java b/src/main/java/server/MapleTrade.java index 7ad5d30e8e..1aee9d427c 100644 --- a/src/main/java/server/MapleTrade.java +++ b/src/main/java/server/MapleTrade.java @@ -22,8 +22,8 @@ package server; import client.MapleCharacter; +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; @@ -251,7 +251,7 @@ public class MapleTrade { tradeItems.add(new Pair<>(item, item.getInventoryType())); } - return MapleInventory.checkSpotsAndOwnership(chr, tradeItems); + return Inventory.checkSpotsAndOwnership(chr, tradeItems); } private boolean fitsUniquesInInventory() { diff --git a/src/main/java/server/maps/MapleHiredMerchant.java b/src/main/java/server/maps/MapleHiredMerchant.java index 7af984f59e..e2343658ed 100644 --- a/src/main/java/server/maps/MapleHiredMerchant.java +++ b/src/main/java/server/maps/MapleHiredMerchant.java @@ -23,9 +23,9 @@ package server.maps; 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 client.inventory.manipulator.MapleKarmaManipulator; @@ -220,7 +220,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject { Item iitem = shopItem.getItem().copy(); iitem.setQuantity((short) (shopItem.getItem().getQuantity() * shopItem.getBundles())); - if (!MapleInventory.checkSpot(chr, iitem)) { + if (!Inventory.checkSpot(chr, iitem)) { chr.sendPacket(PacketCreator.serverNotice(1, "Have a slot available on your inventory to claim back the item.")); chr.sendPacket(PacketCreator.enableActions()); return; @@ -656,7 +656,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject { li.add(new Pair<>(it, it.getInventoryType())); } - return MapleInventory.checkSpotsAndOwnership(chr, li); + return Inventory.checkSpotsAndOwnership(chr, li); } public int getChannel() { diff --git a/src/main/java/server/maps/MaplePlayerShop.java b/src/main/java/server/maps/MaplePlayerShop.java index 8becaa0c3a..cc5fa3df31 100644 --- a/src/main/java/server/maps/MaplePlayerShop.java +++ b/src/main/java/server/maps/MaplePlayerShop.java @@ -23,8 +23,8 @@ package server.maps; 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 client.inventory.manipulator.MapleKarmaManipulator; @@ -224,7 +224,7 @@ public class MaplePlayerShop extends AbstractMapleMapObject { Item iitem = shopItem.getItem().copy(); iitem.setQuantity((short) (shopItem.getItem().getQuantity() * shopItem.getBundles())); - if (!MapleInventory.checkSpot(chr, iitem)) { + if (!Inventory.checkSpot(chr, iitem)) { chr.sendPacket(PacketCreator.serverNotice(1, "Have a slot available on your inventory to claim back the item.")); chr.sendPacket(PacketCreator.enableActions()); return; diff --git a/src/main/java/tools/PacketCreator.java b/src/main/java/tools/PacketCreator.java index ee23f8ae6b..c3ebe4d167 100644 --- a/src/main/java/tools/PacketCreator.java +++ b/src/main/java/tools/PacketCreator.java @@ -246,7 +246,7 @@ public class PacketCreator { } private static void addCharEquips(final OutPacket p, MapleCharacter chr) { - MapleInventory equip = chr.getInventory(MapleInventoryType.EQUIPPED); + Inventory equip = chr.getInventory(MapleInventoryType.EQUIPPED); Collection ii = MapleItemInformationProvider.getInstance().canWearEquipment(chr, equip.list()); Map myEquip = new LinkedHashMap<>(); Map maskedEquip = new LinkedHashMap<>(); @@ -444,7 +444,7 @@ public class PacketCreator { p.writeByte(chr.getInventory(MapleInventoryType.getByType(i)).getSlotLimit()); } p.writeLong(getTime(-2)); - MapleInventory iv = chr.getInventory(MapleInventoryType.EQUIPPED); + Inventory iv = chr.getInventory(MapleInventoryType.EQUIPPED); Collection equippedC = iv.list(); List equipped = new ArrayList<>(equippedC.size()); List equippedCash = new ArrayList<>(equippedC.size()); From 0196d6978082d6498e13e38592d5c6bac44f8b17 Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 9 Sep 2021 08:36:13 +0200 Subject: [PATCH 2/4] Change default timezone to GMT --- config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yaml b/config.yaml index f09e0b9fdd..7aacf24b03 100644 --- a/config.yaml +++ b/config.yaml @@ -306,7 +306,7 @@ server: PARTY_BONUS_EXP_RATE: 1.0 #Rate for the party exp bonus reward. #Miscellaneous Configuration - TIMEZONE: GMT-3 + TIMEZONE: GMT CHARSET: US-ASCII # Is loaded first, so applies to the rest of this config. Defaults to US-ASCII if invalid or not set. USE_DISPLAY_NUMBERS_WITH_COMMA: true #Enforce comma on displayed strings (use this when USE_UNITPRICE_WITH_COMMA is active and you still want to display comma-separated values). USE_UNITPRICE_WITH_COMMA: true #Set this accordingly with the layout of the unitPrices on Item.wz XML's, whether it's using commas or dots to represent fractions. From 9df2758ae66302d80ed2d20b10a8a853d5a42601 Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 9 Sep 2021 19:53:44 +0200 Subject: [PATCH 3/4] Allow configurable wz directory path with launch property Example: "java -Dwz-path= -jar Cosmic.jar " --- launch.bat | 2 +- src/main/java/provider/wz/WZFiles.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/launch.bat b/launch.bat index 903ce475cf..bed9d39b83 100644 --- a/launch.bat +++ b/launch.bat @@ -1,4 +1,4 @@ @echo off @title Cosmic -java -Xmx2048m -jar target\Cosmic.jar +java -Xmx2048m -Dwz-path= -jar target\Cosmic.jar pause \ No newline at end of file diff --git a/src/main/java/provider/wz/WZFiles.java b/src/main/java/provider/wz/WZFiles.java index e5073d0058..f563941118 100644 --- a/src/main/java/provider/wz/WZFiles.java +++ b/src/main/java/provider/wz/WZFiles.java @@ -17,7 +17,7 @@ public enum WZFiles { SOUND("Sound"), UI("UI"); - public static final String DIRECTORY = "wz"; + public static final String DIRECTORY = getWzDirectory(); private final String fileName; @@ -32,4 +32,15 @@ public enum WZFiles { public String getFilePath() { return getFile().getPath(); } + + private static String getWzDirectory() { + // Either provide a custom directory path through the "wz-path" property when launching the .jar, + // or don't provide one to use the default "wz" directory + String propertyPath = System.getProperty("wz-path"); + if (propertyPath != null && new File(propertyPath).isDirectory()) { + return propertyPath; + } + + return "wz"; + } } From eb2f4648264c9689d69d4c60e61901df777f000b Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 9 Sep 2021 20:37:53 +0200 Subject: [PATCH 4/4] Remove removal of cryptography restrictions This is no longer needed as of Java 9 --- src/main/java/net/server/Server.java | 4 -- src/main/java/tools/AutoJCE.java | 61 ---------------------------- 2 files changed, 65 deletions(-) delete mode 100644 src/main/java/tools/AutoJCE.java diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index 58bc95252d..2d564cae79 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -62,12 +62,10 @@ import server.TimerManager; import server.expeditions.MapleExpeditionBossLog; import server.life.MaplePlayerNPCFactory; import server.quest.MapleQuest; -import tools.AutoJCE; import tools.DatabaseConnection; import tools.FilePrinter; import tools.Pair; -import java.security.Security; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -958,8 +956,6 @@ public class Server { } public static void main(String[] args) { - Security.setProperty("crypto.policy", "unlimited"); - AutoJCE.removeCryptographyRestrictions(); Server.getInstance().init(); } diff --git a/src/main/java/tools/AutoJCE.java b/src/main/java/tools/AutoJCE.java deleted file mode 100644 index 5ab9a175e5..0000000000 --- a/src/main/java/tools/AutoJCE.java +++ /dev/null @@ -1,61 +0,0 @@ -package tools; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.security.Permission; -import java.security.PermissionCollection; -import java.util.Map; - -public class AutoJCE{ // AutoJCE into server source thanks to Acernis dev team - - /** - * Credits: ntoskrnl of StackOverflow - * http://stackoverflow.com/questions/1179672/ - */ - public static byte removeCryptographyRestrictions(){ - if(!isRestrictedCryptography()){ - //System.out.println("Cryptography restrictions removal not needed"); - return 0; - } - try{ - /* - * Do the following, but with reflection to bypass access checks: - * - * JceSecurity.isRestricted = false; - * JceSecurity.defaultPolicy.perms.clear(); - * JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE); - */ - final Class jceSecurity = Class.forName("javax.crypto.JceSecurity"); - final Class cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions"); - final Class cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission"); - final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");// was set to final in Java 8 Update 112. Requires you to remove the final modifier. - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL); - isRestrictedField.setAccessible(true); - isRestrictedField.set(null, false); - final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy"); - defaultPolicyField.setAccessible(true); - final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null); - final Field perms = cryptoPermissions.getDeclaredField("perms"); - perms.setAccessible(true); - ((Map) perms.get(defaultPolicy)).clear(); - final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE"); - instance.setAccessible(true); - defaultPolicy.add((Permission) instance.get(null)); - - //System.out.println("Successfully removed cryptography restrictions"); - return 1; - }catch(final Exception e){ - e.printStackTrace(); - - System.err.println("Failed to remove cryptography restrictions"); - return -1; - } - } - - private static boolean isRestrictedCryptography(){ - // This simply matches the Oracle JRE, but not OpenJDK. - return "Java(TM) SE Runtime Environment".equals(System.getProperty("java.runtime.name")); - } -} \ No newline at end of file