Improved item & drop-point checking + Dojo fixes + Duey revamp
Fixed some issues with items being dropped sometimes out-of-reach and in a weird way. Improved item checking function, now looking up one-of-a-kind items properly. Fixed some issues with dojo skills and possible exploits in dojo progression. Improved Duey, now displaying better info to players.
This commit is contained in:
@@ -89,7 +89,6 @@ public class CashShop {
|
||||
}
|
||||
|
||||
public Item toItem() {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
Item item;
|
||||
|
||||
int petid = -1;
|
||||
@@ -97,8 +96,8 @@ public class CashShop {
|
||||
if (ItemConstants.isPet(itemId))
|
||||
petid = MaplePet.createPet(itemId);
|
||||
|
||||
if (ii.getInventoryType(itemId).equals(MapleInventoryType.EQUIP)) {
|
||||
item = ii.getEquipById(itemId);
|
||||
if (ItemConstants.getInventoryType(itemId).equals(MapleInventoryType.EQUIP)) {
|
||||
item = MapleItemInformationProvider.getInstance().getEquipById(itemId);
|
||||
} else {
|
||||
item = new Item(itemId, (byte) 0, count, petid);
|
||||
}
|
||||
@@ -353,7 +352,7 @@ public class CashShop {
|
||||
boolean isRing = false;
|
||||
Equip equip = null;
|
||||
for (Item item : getInventory()) {
|
||||
if (item.getType() == 1) {
|
||||
if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
|
||||
equip = (Equip) item;
|
||||
isRing = equip.getRingId() > -1;
|
||||
}
|
||||
@@ -440,7 +439,7 @@ public class CashShop {
|
||||
Item item = cItem.toItem();
|
||||
Equip equip = null;
|
||||
item.setGiftFrom(rs.getString("from"));
|
||||
if (item.getType() == MapleInventoryType.EQUIP.getType()) {
|
||||
if (item.getInventoryType().equals(MapleInventoryType.EQUIP)) {
|
||||
equip = (Equip) item;
|
||||
equip.setRingId(rs.getInt("ringid"));
|
||||
gifts.add(new Pair<Item, String>(equip, rs.getString("message")));
|
||||
@@ -491,7 +490,7 @@ public class CashShop {
|
||||
|
||||
List<Item> inv = getInventory();
|
||||
for (Item item : inv) {
|
||||
itemsWithType.add(new Pair<>(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId())));
|
||||
itemsWithType.add(new Pair<>(item, item.getInventoryType()));
|
||||
}
|
||||
|
||||
factory.saveItems(itemsWithType, accountId, con);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
package server;
|
||||
|
||||
import client.MapleBuffStat;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.inventory.Equip;
|
||||
import client.inventory.Item;
|
||||
@@ -65,7 +66,7 @@ public class MapleInventoryManipulator {
|
||||
|
||||
public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid, byte flag, long expiration) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = ii.getInventoryType(itemId);
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(itemId);
|
||||
if (!type.equals(MapleInventoryType.EQUIP)) {
|
||||
short slotMax = ii.getSlotMax(c, itemId);
|
||||
List<Item> existing = c.getPlayer().getInventory(type).listById(itemId);
|
||||
@@ -155,8 +156,8 @@ public class MapleInventoryManipulator {
|
||||
|
||||
public static boolean addFromDrop(MapleClient c, Item item, boolean show, int petId) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = ii.getInventoryType(item.getItemId());
|
||||
if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().getItemQuantity(item.getItemId(), true) > 0) {
|
||||
MapleInventoryType type = item.getInventoryType();
|
||||
if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().haveItemWithId(item.getItemId(), true)) {
|
||||
c.announce(MaplePacketCreator.getInventoryFull());
|
||||
c.announce(MaplePacketCreator.showItemUnavailable());
|
||||
return false;
|
||||
@@ -230,9 +231,18 @@ public class MapleInventoryManipulator {
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean haveItemWithId(MapleInventory inv, int itemid) {
|
||||
return inv.findById(itemid) != null;
|
||||
}
|
||||
|
||||
public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = ii.getInventoryType(itemid);
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(itemid);
|
||||
|
||||
if(ii.isPickupRestricted(itemid) && haveItemWithId(c.getPlayer().getInventory(type), itemid)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!type.equals(MapleInventoryType.EQUIP)) {
|
||||
short slotMax = ii.getSlotMax(c, itemid);
|
||||
List<Item> existing = c.getPlayer().getInventory(type).listById(itemid);
|
||||
@@ -273,7 +283,12 @@ public class MapleInventoryManipulator {
|
||||
int returnValue;
|
||||
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
MapleInventoryType type = ii.getInventoryType(itemid);
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(itemid);
|
||||
|
||||
if(ii.isPickupRestricted(itemid) && haveItemWithId(c.getPlayer().getInventory(type), itemid)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!type.equals(MapleInventoryType.EQUIP)) {
|
||||
short slotMax = ii.getSlotMax(c, itemid);
|
||||
if (!ItemConstants.isRechargable(itemid)) {
|
||||
|
||||
@@ -138,12 +138,7 @@ public class MapleItemInformationProvider {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public MapleInventoryType getInventoryType(int itemId) {
|
||||
final byte type = (byte) (itemId / 1000000);
|
||||
if (type < 1 || type > 5) {
|
||||
return MapleInventoryType.UNDEFINED;
|
||||
}
|
||||
return MapleInventoryType.getByType(type);
|
||||
// public MapleInventoryType getInventoryType(int itemId) {
|
||||
// if (inventoryTypeCache.containsKey(itemId)) {
|
||||
// return inventoryTypeCache.get(itemId);
|
||||
// }
|
||||
@@ -176,7 +171,7 @@ public class MapleItemInformationProvider {
|
||||
// ret = MapleInventoryType.UNDEFINED;
|
||||
// inventoryTypeCache.put(itemId, ret);
|
||||
// return ret;
|
||||
}
|
||||
// }
|
||||
|
||||
public List<Pair<Integer, String>> getAllItems() {
|
||||
if (!itemNameCache.isEmpty()) {
|
||||
@@ -879,6 +874,8 @@ public class MapleItemInformationProvider {
|
||||
prop = 30.0;
|
||||
} else if (vegaItemId == 5610001) {
|
||||
prop = 90.0;
|
||||
} else if (vegaItemId == 2049100) {
|
||||
prop = 100.0;
|
||||
}
|
||||
|
||||
if(assertGM || rollSuccessChance(prop)) {
|
||||
|
||||
@@ -743,7 +743,7 @@ public class MapleStatEffect {
|
||||
applyto.getClient().announce(MaplePacketCreator.enableActions());
|
||||
return false;
|
||||
}
|
||||
MapleInventoryManipulator.removeById(applyto.getClient(), MapleItemInformationProvider.getInstance().getInventoryType(itemCon), itemCon, itemConNo, false, true);
|
||||
MapleInventoryManipulator.removeById(applyto.getClient(), ItemConstants.getInventoryType(itemCon), itemCon, itemConNo, false, true);
|
||||
}
|
||||
}
|
||||
List<Pair<MapleStat, Integer>> hpmpupdate = new ArrayList<>(2);
|
||||
|
||||
@@ -138,7 +138,7 @@ public class MapleStorage {
|
||||
|
||||
List<Item> list = getItems();
|
||||
for (Item item : list) {
|
||||
itemsWithType.add(new Pair<>(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId())));
|
||||
itemsWithType.add(new Pair<>(item, item.getInventoryType()));
|
||||
}
|
||||
|
||||
ItemFactory.STORAGE.saveItems(itemsWithType, id, con);
|
||||
@@ -163,7 +163,7 @@ public class MapleStorage {
|
||||
try {
|
||||
ret = items.remove(slot);
|
||||
|
||||
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(ret.getItemId());
|
||||
MapleInventoryType type = ret.getInventoryType();
|
||||
typeItems.put(type, new ArrayList<>(filterItems(type)));
|
||||
} finally {
|
||||
lock.unlock();
|
||||
@@ -177,7 +177,7 @@ public class MapleStorage {
|
||||
try {
|
||||
items.add(item);
|
||||
|
||||
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId());
|
||||
MapleInventoryType type = item.getInventoryType();
|
||||
typeItems.put(type, new ArrayList<>(filterItems(type)));
|
||||
} finally {
|
||||
lock.unlock();
|
||||
@@ -196,10 +196,9 @@ public class MapleStorage {
|
||||
private List<Item> filterItems(MapleInventoryType type) {
|
||||
List<Item> storageItems = getItems();
|
||||
List<Item> ret = new LinkedList<>();
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
for (Item item : storageItems) {
|
||||
if (ii.getInventoryType(item.getItemId()) == type) {
|
||||
if (item.getInventoryType() == type) {
|
||||
ret.add(item);
|
||||
}
|
||||
}
|
||||
@@ -232,16 +231,14 @@ public class MapleStorage {
|
||||
}
|
||||
*/
|
||||
|
||||
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
lock.lock();
|
||||
try {
|
||||
Collections.sort(items, new Comparator<Item>() {
|
||||
@Override
|
||||
public int compare(Item o1, Item o2) {
|
||||
if (ii.getInventoryType(o1.getItemId()).getType() < ii.getInventoryType(o2.getItemId()).getType()) {
|
||||
if (o1.getInventoryType().getType() < o2.getInventoryType().getType()) {
|
||||
return -1;
|
||||
} else if (ii.getInventoryType(o1.getItemId()) == ii.getInventoryType(o2.getItemId())) {
|
||||
} else if (o1.getInventoryType() == o2.getInventoryType()) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
|
||||
@@ -194,7 +194,7 @@ public class MapleTrade {
|
||||
private boolean fitsInInventory() {
|
||||
List<Pair<Item, MapleInventoryType>> tradeItems = new LinkedList<>();
|
||||
for (Item item : exchangeItems) {
|
||||
tradeItems.add(new Pair(item, MapleItemInformationProvider.getInstance().getInventoryType(item.getItemId())));
|
||||
tradeItems.add(new Pair(item, item.getInventoryType()));
|
||||
}
|
||||
|
||||
return MapleInventory.checkSpotsAndOwnership(chr, tradeItems);
|
||||
|
||||
@@ -25,6 +25,7 @@ import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.ItemFactory;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import com.mysql.jdbc.Statement;
|
||||
import constants.ItemConstants;
|
||||
@@ -163,6 +164,10 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean canBuy(MapleClient c, Item newItem) {
|
||||
return MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && MapleInventoryManipulator.addFromDrop(c, newItem, false);
|
||||
}
|
||||
|
||||
public void buy(MapleClient c, int item, short quantity) {
|
||||
synchronized (items) {
|
||||
MaplePlayerShopItem pItem = items.get(item);
|
||||
@@ -175,7 +180,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
if (quantity < 1 || pItem.getBundles() < 1 || !pItem.isExist() || pItem.getBundles() < quantity) {
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
return;
|
||||
} else if (newItem.getType() == 1 && newItem.getQuantity() > 1) {
|
||||
} else if (newItem.getInventoryType().equals(MapleInventoryType.EQUIP) && newItem.getQuantity() > 1) {
|
||||
c.announce(MaplePacketCreator.enableActions());
|
||||
return;
|
||||
} else if (!pItem.isExist()) {
|
||||
@@ -185,8 +190,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
|
||||
int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE);
|
||||
if (c.getPlayer().getMeso() >= price) {
|
||||
if (MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner())) {
|
||||
MapleInventoryManipulator.addFromDrop(c, newItem, false);
|
||||
if (canBuy(c, newItem)) {
|
||||
c.getPlayer().gainMeso(-price, false);
|
||||
announceItemSold(newItem, price); // idea thanks to vcoc
|
||||
|
||||
@@ -216,7 +220,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
c.getPlayer().dropMessage(1, "Your inventory is full. Please clear a slot before buying this item.");
|
||||
c.getPlayer().dropMessage(1, "Your inventory is full. Please clean a slot before buying this item.");
|
||||
}
|
||||
} else {
|
||||
c.getPlayer().dropMessage(1, "You do not have enough mesos.");
|
||||
@@ -231,11 +235,10 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
|
||||
private void announceItemSold(Item item, int mesos) {
|
||||
String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : "";
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
MapleCharacter player = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(ownerId);
|
||||
if(player != null && player.isLoggedin() && !player.isAwayFromWorld()) {
|
||||
player.dropMessage(6, "[HIRED MERCHANT] Item '" + ii.getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
|
||||
player.dropMessage(6, "[HIRED MERCHANT] Item '" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,10 +299,12 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
List<MaplePlayerShopItem> copyItems = getItems();
|
||||
if (check(c.getPlayer(), copyItems) && !timeout) {
|
||||
for (MaplePlayerShopItem mpsi : copyItems) {
|
||||
if (mpsi.isExist() && (mpsi.getItem().getType() == MapleInventoryType.EQUIP.getType())) {
|
||||
MapleInventoryManipulator.addFromDrop(c, mpsi.getItem(), false);
|
||||
} else if (mpsi.isExist()) {
|
||||
MapleInventoryManipulator.addById(c, mpsi.getItem().getItemId(), (short) (mpsi.getBundles() * mpsi.getItem().getQuantity()), null, -1, mpsi.getItem().getFlag(), mpsi.getItem().getExpiration());
|
||||
if(mpsi.isExist()) {
|
||||
if (mpsi.getItem().getInventoryType().equals(MapleInventoryType.EQUIP)) {
|
||||
MapleInventoryManipulator.addFromDrop(c, mpsi.getItem(), false);
|
||||
} else {
|
||||
MapleInventoryManipulator.addById(c, mpsi.getItem().getItemId(), (short) (mpsi.getBundles() * mpsi.getItem().getQuantity()), null, -1, mpsi.getItem().getFlag(), mpsi.getItem().getExpiration());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,7 +470,7 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
newItem.setQuantity((short) (pItems.getItem().getQuantity()));
|
||||
}
|
||||
if (newBundle > 0) {
|
||||
itemsWithType.add(new Pair<>(newItem, MapleInventoryType.getByType(newItem.getType())));
|
||||
itemsWithType.add(new Pair<>(newItem, newItem.getInventoryType()));
|
||||
bundles.add(newBundle);
|
||||
}
|
||||
}
|
||||
@@ -476,49 +481,15 @@ public class MapleHiredMerchant extends AbstractMapleMapObject {
|
||||
}
|
||||
|
||||
private static boolean check(MapleCharacter chr, List<MaplePlayerShopItem> items) {
|
||||
byte eq = 0, use = 0, setup = 0, etc = 0, cash = 0;
|
||||
List<MapleInventoryType> li = new LinkedList<>();
|
||||
List<Pair<Item, MapleInventoryType>> li = new ArrayList<>();
|
||||
for (MaplePlayerShopItem item : items) {
|
||||
final MapleInventoryType invtype = MapleItemInformationProvider.getInstance().getInventoryType(item.getItem().getItemId());
|
||||
if (!li.contains(invtype)) {
|
||||
li.add(invtype);
|
||||
}
|
||||
if (invtype == MapleInventoryType.EQUIP) {
|
||||
eq++;
|
||||
} else if (invtype == MapleInventoryType.USE) {
|
||||
use++;
|
||||
} else if (invtype == MapleInventoryType.SETUP) {
|
||||
setup++;
|
||||
} else if (invtype == MapleInventoryType.ETC) {
|
||||
etc++;
|
||||
} else if (invtype == MapleInventoryType.CASH) {
|
||||
cash++;
|
||||
}
|
||||
Item it = item.getItem().copy();
|
||||
it.setQuantity((short)(it.getQuantity() * item.getBundles()));
|
||||
|
||||
li.add(new Pair<>(it, it.getInventoryType()));
|
||||
}
|
||||
for (MapleInventoryType mit : li) {
|
||||
if (mit == MapleInventoryType.EQUIP) {
|
||||
if (chr.getInventory(MapleInventoryType.EQUIP).getNumFreeSlot() <= eq) {
|
||||
return false;
|
||||
}
|
||||
} else if (mit == MapleInventoryType.USE) {
|
||||
if (chr.getInventory(MapleInventoryType.USE).getNumFreeSlot() <= use) {
|
||||
return false;
|
||||
}
|
||||
} else if (mit == MapleInventoryType.SETUP) {
|
||||
if (chr.getInventory(MapleInventoryType.SETUP).getNumFreeSlot() <= setup) {
|
||||
return false;
|
||||
}
|
||||
} else if (mit == MapleInventoryType.ETC) {
|
||||
if (chr.getInventory(MapleInventoryType.ETC).getNumFreeSlot() <= etc) {
|
||||
return false;
|
||||
}
|
||||
} else if (mit == MapleInventoryType.CASH) {
|
||||
if (chr.getInventory(MapleInventoryType.CASH).getNumFreeSlot() <= cash) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
||||
return MapleInventory.checkSpotsAndOwnership(chr, li);
|
||||
}
|
||||
|
||||
public int getChannel() {
|
||||
|
||||
@@ -560,27 +560,28 @@ public class MapleMap {
|
||||
return new Pair(getRoundedCoordinate(angle), Integer.valueOf((int)distn));
|
||||
}
|
||||
|
||||
private void dropFromMonster(final MapleCharacter chr, final MapleMonster mob) {
|
||||
if (mob.dropsDisabled() || !dropsOn) {
|
||||
return;
|
||||
private static void sortDropEntries(List<MonsterDropEntry> from, List<MonsterDropEntry> item, List<MonsterDropEntry> quest) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
for(MonsterDropEntry mde : from) {
|
||||
if(mde.itemId == 0 || !ii.isQuestItem(mde.itemId)) {
|
||||
item.add(mde);
|
||||
} else {
|
||||
quest.add(mde);
|
||||
}
|
||||
}
|
||||
final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
final byte droptype = (byte) (mob.getStats().isExplosiveReward() ? 3 : mob.getStats().isFfaLoot() ? 2 : chr.getParty() != null ? 1 : 0);
|
||||
final int mobpos = mob.getPosition().x;
|
||||
int chRate = chr.getDropRate();
|
||||
Item idrop;
|
||||
byte d = 1;
|
||||
Point pos = new Point(0, mob.getPosition().y);
|
||||
|
||||
MonsterStatusEffect stati = mob.getStati(MonsterStatus.SHOWDOWN);
|
||||
if (stati != null) {
|
||||
chRate *= (stati.getStati().get(MonsterStatus.SHOWDOWN).doubleValue() / 100.0 + 1.0);
|
||||
}
|
||||
|
||||
private byte dropItemsFromMonsterOnMap(List<MonsterDropEntry> dropEntry, Point pos, byte d, int chRate, byte droptype, int mobpos, MapleCharacter chr, MapleMonster mob) {
|
||||
if(dropEntry.isEmpty()) {
|
||||
return d;
|
||||
}
|
||||
|
||||
final MapleMonsterInformationProvider mi = MapleMonsterInformationProvider.getInstance();
|
||||
final List<MonsterDropEntry> dropEntry = new ArrayList<>(mi.retrieveDrop(mob.getId()));
|
||||
|
||||
|
||||
Collections.shuffle(dropEntry);
|
||||
|
||||
Item idrop;
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
for (final MonsterDropEntry de : dropEntry) {
|
||||
if (Randomizer.nextInt(999999) < de.chance * chRate) {
|
||||
if (droptype == 3) {
|
||||
@@ -611,8 +612,16 @@ public class MapleMap {
|
||||
d++;
|
||||
}
|
||||
}
|
||||
final List<MonsterGlobalDropEntry> globalEntry = mi.getGlobalDrop();
|
||||
// Global Drops
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
private byte dropGlobalItemsFromMonsterOnMap(List<MonsterGlobalDropEntry> globalEntry, Point pos, byte d, byte droptype, int mobpos, MapleCharacter chr, MapleMonster mob) {
|
||||
Collections.shuffle(globalEntry);
|
||||
|
||||
Item idrop;
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
for (final MonsterGlobalDropEntry de : globalEntry) {
|
||||
if (Randomizer.nextInt(999999) < de.chance) {
|
||||
if (droptype == 3) {
|
||||
@@ -631,6 +640,40 @@ public class MapleMap {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
private void dropFromMonster(final MapleCharacter chr, final MapleMonster mob) {
|
||||
if (mob.dropsDisabled() || !dropsOn) {
|
||||
return;
|
||||
}
|
||||
final byte droptype = (byte) (mob.getStats().isExplosiveReward() ? 3 : mob.getStats().isFfaLoot() ? 2 : chr.getParty() != null ? 1 : 0);
|
||||
final int mobpos = mob.getPosition().x;
|
||||
int chRate = chr.getDropRate();
|
||||
byte d = 1;
|
||||
Point pos = new Point(0, mob.getPosition().y);
|
||||
|
||||
MonsterStatusEffect stati = mob.getStati(MonsterStatus.SHOWDOWN);
|
||||
if (stati != null) {
|
||||
chRate *= (stati.getStati().get(MonsterStatus.SHOWDOWN).doubleValue() / 100.0 + 1.0);
|
||||
}
|
||||
|
||||
final MapleMonsterInformationProvider mi = MapleMonsterInformationProvider.getInstance();
|
||||
|
||||
final List<MonsterDropEntry> dropEntry = new ArrayList<>();
|
||||
final List<MonsterDropEntry> questEntry = new ArrayList<>();
|
||||
sortDropEntries(mi.retrieveDrop(mob.getId()), dropEntry, questEntry);
|
||||
|
||||
// Normal Drops
|
||||
d = dropItemsFromMonsterOnMap(dropEntry, pos, d, chRate, droptype, mobpos, chr, mob);
|
||||
|
||||
// Global Drops
|
||||
final List<MonsterGlobalDropEntry> globalEntry = mi.getGlobalDrop();
|
||||
d = dropGlobalItemsFromMonsterOnMap(globalEntry, pos, d, droptype, mobpos, chr, mob);
|
||||
|
||||
// Quest Drops
|
||||
dropItemsFromMonsterOnMap(questEntry, pos, d, chRate, droptype, mobpos, chr, mob);
|
||||
}
|
||||
|
||||
public void dropFromReactor(final MapleCharacter chr, final MapleReactor reactor, Item drop, Point dropPos, short questid) {
|
||||
@@ -1852,7 +1895,7 @@ public class MapleMap {
|
||||
final Item drop;
|
||||
int randomedId = list.get(i);
|
||||
|
||||
if (ii.getInventoryType(randomedId) != MapleInventoryType.EQUIP) {
|
||||
if (ItemConstants.getInventoryType(randomedId) != MapleInventoryType.EQUIP) {
|
||||
drop = new Item(randomedId, (short) 0, (short) (rnd.nextInt(copies) + minCopies));
|
||||
} else {
|
||||
drop = ii.randomizeStats((Equip) ii.getEquipById(randomedId));
|
||||
@@ -2567,7 +2610,7 @@ public class MapleMap {
|
||||
}
|
||||
|
||||
public void setMapPointBoundings(int px, int py, int h, int w) {
|
||||
mapArea.setBounds(px + 7, py, w - 14, h);
|
||||
mapArea.setBounds(px + 45, py, w - 90, h);
|
||||
}
|
||||
|
||||
public void setMapLineBoundings(int vrTop, int vrBottom, int vrLeft, int vrRight) {
|
||||
|
||||
@@ -144,6 +144,9 @@ public class MapleMapFactory {
|
||||
bounds[3] = MapleDataTool.getInt(minimapData.getChildByPath("width"));
|
||||
|
||||
map.setMapPointBoundings(bounds[0], bounds[1], bounds[2], bounds[3]);
|
||||
} else {
|
||||
int dist = (1 << 18);
|
||||
map.setMapPointBoundings(-dist / 2, -dist / 2, dist, dist);
|
||||
}
|
||||
} else {
|
||||
bounds[2] = MapleDataTool.getInt(infoData.getChildByPath("VRLeft"));
|
||||
|
||||
@@ -24,6 +24,7 @@ package server.maps;
|
||||
import client.MapleCharacter;
|
||||
import client.MapleClient;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
@@ -187,6 +188,10 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean canBuy(MapleClient c, Item newItem) {
|
||||
return MapleInventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && MapleInventoryManipulator.addFromDrop(c, newItem, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* no warnings for now o.o
|
||||
* @param c
|
||||
@@ -201,14 +206,14 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
|
||||
newItem.setQuantity(newItem.getQuantity());
|
||||
if (quantity < 1 || pItem.getBundles() < 1 || newItem.getQuantity() > pItem.getBundles() || !pItem.isExist()) {
|
||||
return;
|
||||
} else if (newItem.getType() == 1 && newItem.getQuantity() > 1) {
|
||||
} else if (newItem.getInventoryType().equals(MapleInventoryType.EQUIP) && newItem.getQuantity() > 1) {
|
||||
return;
|
||||
}
|
||||
synchronized (c.getPlayer()) {
|
||||
int price = (int) Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE);
|
||||
|
||||
if (c.getPlayer().getMeso() >= price) {
|
||||
if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) {
|
||||
if (canBuy(c, newItem)) {
|
||||
c.getPlayer().gainMeso(-price, false);
|
||||
|
||||
announceItemSold(newItem, price); // idea thanks to vcoc
|
||||
@@ -235,9 +240,8 @@ public class MaplePlayerShop extends AbstractMapleMapObject {
|
||||
|
||||
private void announceItemSold(Item item, int mesos) {
|
||||
String qtyStr = (item.getQuantity() > 1) ? " (qty. " + item.getQuantity() + ")" : "";
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
owner.dropMessage(6, "[PLAYER SHOP] Item '" + ii.getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
|
||||
owner.dropMessage(6, "[PLAYER SHOP] Item '" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos.");
|
||||
}
|
||||
|
||||
public void broadcastToVisitors(final byte[] packet) {
|
||||
|
||||
@@ -26,6 +26,7 @@ import client.MapleClient;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventory;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import constants.ItemConstants;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
@@ -34,7 +35,6 @@ import java.util.List;
|
||||
import provider.MapleData;
|
||||
import provider.MapleDataTool;
|
||||
import server.MapleInventoryManipulator;
|
||||
import server.MapleItemInformationProvider;
|
||||
import server.quest.MapleQuest;
|
||||
import server.quest.MapleQuestActionType;
|
||||
import tools.MaplePacketCreator;
|
||||
@@ -92,7 +92,6 @@ public class ItemAction extends MapleQuestAction {
|
||||
List<Pair<Integer, Integer>> takeItem = new LinkedList<>();
|
||||
List<Pair<Integer, Integer>> giveItem = new LinkedList<>();
|
||||
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
int props = 0, rndProps = 0, accProps = 0;
|
||||
for(ItemData item : items) {
|
||||
if(item.getProp() != null && item.getProp() != -1 && canGetItem(item, chr)) {
|
||||
@@ -133,7 +132,7 @@ public class ItemAction extends MapleQuestAction {
|
||||
// must take all needed items before giving others
|
||||
|
||||
for(Pair<Integer, Integer> iEntry: takeItem) {
|
||||
MapleInventoryType type = ii.getInventoryType(iEntry.getLeft());
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(iEntry.getLeft());
|
||||
int quantity = iEntry.getRight() * -1; // Invert
|
||||
if(type.equals(MapleInventoryType.EQUIP)) {
|
||||
if(chr.getInventory(type).countById(iEntry.getLeft()) < quantity) {
|
||||
@@ -157,8 +156,6 @@ public class ItemAction extends MapleQuestAction {
|
||||
|
||||
@Override
|
||||
public boolean check(MapleCharacter chr, Integer extSelection) {
|
||||
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
|
||||
|
||||
List<Pair<Item, MapleInventoryType>> gainList = new LinkedList<>();
|
||||
List<Pair<Item, MapleInventoryType>> selectList = new LinkedList<>();
|
||||
List<Pair<Item, MapleInventoryType>> randomList = new LinkedList<>();
|
||||
@@ -171,7 +168,7 @@ public class ItemAction extends MapleQuestAction {
|
||||
continue;
|
||||
}
|
||||
|
||||
MapleInventoryType type = ii.getInventoryType(item.getId());
|
||||
MapleInventoryType type = ItemConstants.getInventoryType(item.getId());
|
||||
if(item.getProp() != null) {
|
||||
Item toItem = new Item(item.getId(), (short) 0, (short) item.getCount());
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ import server.quest.MapleQuestRequirementType;
|
||||
import client.MapleCharacter;
|
||||
import client.inventory.Item;
|
||||
import client.inventory.MapleInventoryType;
|
||||
import constants.ItemConstants;
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -64,7 +65,7 @@ public class ItemRequirement extends MapleQuestRequirement {
|
||||
int countNeeded = items.get(itemId);
|
||||
int count = 0;
|
||||
|
||||
MapleInventoryType iType = ii.getInventoryType(itemId);
|
||||
MapleInventoryType iType = ItemConstants.getInventoryType(itemId);
|
||||
|
||||
if (iType.equals(MapleInventoryType.UNDEFINED)) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user