I have a few things that I couldn't find fixes for on Ragezone or Google.
Please help me out.
Problem 1:
When I use Dragon Roar, Genesis or any skill that can hit more than 5 Mobs there is Damage done to the mobs but it only kills 2 - 3 mobs.
(All mobs have the same problem)
Example:
Damage done on 4 Snails
2 Snails killed only.
Any fixes/script to fix this problem?
Problem 2:
When I hit bigfoot it gives me +- <amount> EXP.
Any fixes/script to make the character get the full EXP amount (+ only) instead of getting +-<amount> exp?
(My server rates are 1000x/500x/5x)
Problem 3:
My server can't drop untradeable items. Anywhere I can find the script to make untradeable item be able to me dropped?
(Throwing untradeable item NOT !drop <itemid>)
It would be great if you could provide me the scripts for my problems or just give me a link to the fixes. You'll be a great help
My MapleInventoryManipulator.java script
Please help me out.
Problem 1:
When I use Dragon Roar, Genesis or any skill that can hit more than 5 Mobs there is Damage done to the mobs but it only kills 2 - 3 mobs.
(All mobs have the same problem)
Example:
Damage done on 4 Snails
2 Snails killed only.
Any fixes/script to fix this problem?
Problem 2:
When I hit bigfoot it gives me +- <amount> EXP.
Any fixes/script to make the character get the full EXP amount (+ only) instead of getting +-<amount> exp?
(My server rates are 1000x/500x/5x)
Problem 3:
My server can't drop untradeable items. Anywhere I can find the script to make untradeable item be able to me dropped?
(Throwing untradeable item NOT !drop <itemid>)
It would be great if you could provide me the scripts for my problems or just give me a link to the fixes. You'll be a great help
My MapleInventoryManipulator.java script
/*
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package server;
import java.awt.Point;
import java.util.Iterator;
import java.util.List;
import client.Equip;
import client.IItem;
import client.Item;
import client.MapleBuffStat;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleInventoryType;
import constants.InventoryConstants;
import tools.MaplePacketCreator;
/**
*
* @author Matze
*/
public class MapleInventoryManipulator {
public static boolean addRing(MapleCharacter chr, int itemId, int ringId) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemId);
IItem nEquip = ii.getEquipById(itemId, ringId);
byte newSlot = chr.getInventory(type).addItem(nEquip);
if (newSlot == -1) {
return false;
}
chr.getClient().getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
return true;
}
public static boolean addById(MapleClient c, int itemId, short quantity) {
return addById(c, itemId, quantity, null, -1);
}
public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemId);
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemId);
List<IItem> existing = c.getPlayer().getInventory(type).listById(itemId);
if (!InventoryConstants.isRechargable(itemId)) {
if (existing.size() > 0) { // first update all existing slots to slotMax
Iterator<IItem> i = existing.iterator();
while (quantity > 0) {
if (i.hasNext()) {
Item eItem = (Item) i.next();
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && (eItem.getOwner().equals(owner) || owner == null)) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
eItem.setQuantity(newQ);
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem));
}
} else {
break;
}
}
}
while (quantity > 0 || InventoryConstants.isRechargable(itemId)) {
short newQ = (short) Math.min(quantity, slotMax);
if (newQ != 0) {
quantity -= newQ;
Item nItem = new Item(itemId, (byte) 0, newQ, petid);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
if (owner != null) {
nItem.setOwner(owner);
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
if ((InventoryConstants.isRechargable(itemId)) && quantity == 0) {
break;
}
} else {
c.getSession().write(MaplePacketCreator.enableActions());
return false;
}
}
} else {
Item nItem = new Item(itemId, (byte) 0, quantity);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
c.getSession().write(MaplePacketCreator.enableActions());
}
} else if (quantity == 1) {
IItem nEquip = ii.getEquipById(itemId);
if (owner != null) {
nEquip.setOwner(owner);
}
byte newSlot = c.getPlayer().getInventory(type).addItem(nEquip);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
} else {
throw new RuntimeException("Trying to create equip with non-one quantity");
}
return true;
}
public static boolean addFromDrop(MapleClient c, IItem item, boolean show) {
return addFromDrop(c, item, show, true);
}
public static boolean addFromDrop(MapleClient c, IItem item, boolean show, boolean showAnyMessage) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(item.getItemId());
if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().getItemQuantity(item.getItemId(), true) > 0 && showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.showItemUnavailable());
return false;
}
short quantity = item.getQuantity();
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, item.getItemId());
List<IItem> existing = c.getPlayer().getInventory(type).listById(item.getItemId());
if (!InventoryConstants.isRechargable(item.getItemId())) {
if (existing.size() > 0) { // first update all existing slots to slotMax
Iterator<IItem> i = existing.iterator();
while (quantity > 0) {
if (i.hasNext()) {
Item eItem = (Item) i.next();
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && item.getOwner().equals(eItem.getOwner())) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
eItem.setQuantity(newQ);
short newQi = (short) Math.min(quantity, slotMax);
quantity -= newQi;
Item nItem = new Item(item.getItemId(), (byte) 0, newQi);
nItem.setOwner(item.getOwner());
if (c.getPlayer().getInventory(type).fakeAddItem(nItem) == -1) {
eItem.setQuantity(oldQ);
return false;
}
quantity += newQi;
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem, showAnyMessage));
}
} else {
break;
}
}
}
while (quantity > 0 || InventoryConstants.isRechargable(item.getItemId())) {
short newQ = (short) Math.min(quantity, slotMax);
quantity -= newQ;
Item nItem = new Item(item.getItemId(), (byte) 0, newQ);
nItem.setOwner(item.getOwner());
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
item.setQuantity((short) (quantity + newQ));
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem, true));
if ((InventoryConstants.isRechargable(item.getItemId())) && quantity == 0) {
break;
}
}
} else {
Item nItem = new Item(item.getItemId(), (byte) 0, quantity);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
c.getSession().write(MaplePacketCreator.enableActions());
}
} else if (quantity == 1) {
byte newSlot = c.getPlayer().getInventory(type).addItem(item);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, item, true));
} else {
return false;
}
if (show) {
c.getSession().write(MaplePacketCreator.getShowItemGain(item.getItemId(), item.getQuantity()));
}
return true;
}
public static void removeAllById(MapleClient c, int itemId, boolean checkEquipped) {
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(itemId);
for (IItem item : c.getPlayer().getInventory(type).listById(itemId)) {
if (item != null) {
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), true, false);
}
}
if (checkEquipped) {
IItem ii = c.getPlayer().getInventory(type).findById(itemId);
if (ii != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeItem(ii.getPosition());
c.getPlayer().equipChanged();
}
}
}
public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemid);
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid);
List<IItem> existing = c.getPlayer().getInventory(type).listById(itemid);
if (!InventoryConstants.isRechargable(itemid)) {
if (existing.size() > 0) // first update all existing slots to slotMax
{
for (IItem eItem : existing) {
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && owner.equals(eItem.getOwner())) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
}
if (quantity <= 0) {
break;
}
}
}
}
final int numSlotsNeeded;
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else if (InventoryConstants.isRechargable(itemid)) {
numSlotsNeeded = 1;
} else {
numSlotsNeeded = 1;
System.out.println("checkSpace error");
}
return !c.getPlayer().getInventory(type).isFull(numSlotsNeeded - 1);
} else {
return !c.getPlayer().getInventory(type).isFull();
}
}
public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop) {
removeFromSlot(c, type, slot, quantity, fromDrop, false);
}
public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop, boolean consume) {
IItem item = c.getPlayer().getInventory(type).getItem(slot);
boolean allowZero = consume && InventoryConstants.isRechargable(item.getItemId());
c.getPlayer().getInventory(type).removeItem(slot, quantity, allowZero);
if (item.getQuantity() == 0 && !allowZero) {
c.getSession().write(MaplePacketCreator.clearInventoryItem(type, item.getPosition(), fromDrop));
} else {
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, (Item) item, fromDrop));
}
}
public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
List<IItem> items = c.getPlayer().getInventory(type).listById(itemId);
int remremove = quantity;
for (IItem item : items) {
if (remremove <= item.getQuantity()) {
removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume);
remremove = 0;
break;
} else {
remremove -= item.getQuantity();
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
}
}
if (remremove > 0) {
throw new RuntimeException("[h4x] Not enough items available (" + itemId + ", " + (quantity - remremove) + "/" + quantity + ")");
}
}
public static void move(MapleClient c, MapleInventoryType type, byte src, byte dst) {
if (src < 0 || dst < 0) {
return;
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
IItem source = c.getPlayer().getInventory(type).getItem(src);
IItem initialTarget = c.getPlayer().getInventory(type).getItem(dst);
if (source == null) {
return;
}
short olddstQ = -1;
if (initialTarget != null) {
olddstQ = initialTarget.getQuantity();
}
short oldsrcQ = source.getQuantity();
short slotMax = ii.getSlotMax(c, source.getItemId());
c.getPlayer().getInventory(type).move(src, dst, slotMax);
if (!type.equals(MapleInventoryType.EQUIP) && initialTarget != null && initialTarget.getItemId() == source.getItemId() && !InventoryConstants.isRechargable(source.getItemId())) {
if ((olddstQ + oldsrcQ) > slotMax) {
c.getSession().write(MaplePacketCreator.moveAndMergeWithRestInventoryItem(type, src, dst, (short) ((olddstQ + oldsrcQ) - slotMax), slotMax));
} else {
c.getSession().write(MaplePacketCreator.moveAndMergeInventoryItem(type, src, dst, ((Item) c.getPlayer().getInventory(type).getItem(dst)).getQuantity()));
}
} else {
c.getSession().write(MaplePacketCreator.moveInventoryItem(type, src, dst));
}
}
public static void equip(MapleClient c, byte src, byte dst) {
Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
if (source == null) {
return;
} else if ((((source.getItemId() >= 1902000 && source.getItemId() <= 1902002) || source.getItemId() == 1912000) && c.getPlayer().isCygnus()) || ((source.getItemId() >= 1902005 && source.getItemId() <= 1902007) || source.getItemId() == 1912005) && !c.getPlayer().isCygnus()) {// Adventurer taming equipment
return;
}
if (MapleItemInformationProvider.getInstance().isUntradeableOnEquip(source.getItemId())) {
source.setFlag((byte) InventoryConstants.UNTRADEABLE);
}
if (dst == -6) { // unequip the overall
IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
if (top != null && isOverall(top.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -5) {
final IItem bottom = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6);
if (bottom != null && isOverall(source.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -10) {// check if weapon is two-handed
IItem weapon = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
if (weapon != null && MapleItemInformationProvider.getInstance().isTwoHanded(weapon.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -11) {
IItem shield = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10);
if (shield != null && MapleItemInformationProvider.getInstance().isTwoHanded(source.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
}
if (dst == -18) {
if (c.getPlayer().getMount() != null) {
c.getPlayer().getMount().setItemId(source.getItemId());
}
}
source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(src);
if (target != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
}
source.setPosition(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
if (target != null) {
target.setPosition(src);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(target);
}
if (c.getPlayer().getBuffedValue(MapleBuffStat.BOOSTER) != null && isWeapon(source.getItemId())) {
c.getPlayer().cancelBuffStats(MapleBuffStat.BOOSTER);
}
c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2));
c.getPlayer().equipChanged();
}
public static void unequip(MapleClient c, byte src, byte dst) {
Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src);
Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
if (dst < 0) {
System.out.println("Unequipping to negative slot.");
}
if (source == null) {
return;
}
if (target != null && src <= 0) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
return;
}
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(src);
if (target != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(dst);
}
source.setPosition(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(source);
if (target != null) {
target.setPosition(src);
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(target);
}
c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1));
c.getPlayer().equipChanged();
}
public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
if (src < 0) {
type = MapleInventoryType.EQUIPPED;
}
IItem source = c.getPlayer().getInventory(type).getItem(src);
int itemId = source.getItemId();
if (c.getPlayer().getItemEffect() == itemId && source.getQuantity() == 1) {
c.getPlayer().setItemEffect(0);
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.itemEffect(c.getPlayer().getId(), 0));
} else if (itemId == 5370000 || itemId == 5370001) { // not actually possible
if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
c.getPlayer().setChalkboard(null);
}
} else if (itemId >= 5000000 && itemId <= 5000100) {
return;
}
if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || (quantity == 0 && !InventoryConstants.isRechargable(itemId))) {
return;
}
Point dropPos = new Point(c.getPlayer().getPosition());
if (quantity < source.getQuantity() && !InventoryConstants.isRechargable(itemId)) {
IItem target = source.copy();
target.setQuantity(quantity);
source.setQuantity((short) (source.getQuantity() - quantity));
c.getSession().write(MaplePacketCreator.dropInventoryItemUpdate(type, source));
dropItem(c, target, dropPos);
} else {
c.getPlayer().getInventory(type).removeSlot(src);
c.getSession().write(MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
if (src < 0) {
c.getPlayer().equipChanged();
}
dropItem(c, source, dropPos);
}
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, int newval) {
return editEquipById(chr,max,itemid,stat,(short)newval);
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, short newval) {
// Is it an equip?
if (!MapleItemInformationProvider.getInstance().isEquip(itemid)) {
return -1;
}
// Get List
List<IItem> equips = chr.getInventory(MapleInventoryType.EQUIP).listById(itemid);
List<IItem> equipped = chr.getInventory(MapleInventoryType.EQUIPPED).listById(itemid);
// Do you have any?
if (equips.size() == 0 && equipped.size() == 0) {
return 0;
}
int edited = 0;
// edit items
for(IItem itm : equips) {
Equip e = (Equip)itm;
if (edited >= max) {
break;
}
edited++;
if (stat.equals("str")) {
e.setStr(newval);
} else if (stat.equals("dex")) {
e.setDex(newval);
} else if (stat.equals("int")) {
e.setInt(newval);
} else if (stat.equals("luk")) {
e.setLuk(newval);
} else if (stat.equals("watk")) {
e.setWatk(newval);
} else if (stat.equals("matk")) {
e.setMatk(newval);
} else {
return -2;
}
}
for(IItem itm : equipped) {
Equip e = (Equip)itm;
if (edited >= max) {
break;
}
edited++;
if (stat.equals("str")) {
e.setStr(newval);
} else if (stat.equals("dex")) {
e.setDex(newval);
} else if (stat.equals("int")) {
e.setInt(newval);
} else if (stat.equals("luk")) {
e.setLuk(newval);
} else if (stat.equals("watk")) {
e.setWatk(newval);
} else if (stat.equals("matk")) {
e.setMatk(newval);
} else {
return -2;
}
}
// Return items edited
return (edited);
}
private static final void dropItem(MapleClient c, IItem target, Point dropPos) {
if (MapleItemInformationProvider.getInstance().isDropRestricted(target.getItemId())) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer().getObjectId(), c.getPlayer().getPosition(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer().getObjectId(), c.getPlayer().getPosition(), c.getPlayer(), target, dropPos, true, !c.getPlayer().getMap().getEverlast());
}
}
private static final boolean isOverall(int itemId) {
return itemId / 10000 == 105;
}
private static final boolean isWeapon(int itemId) {
return itemId >= 1302000 && itemId < 1492024;
}
public static boolean addFromDrop(MapleClient c, IItem item) {
return addFromDrop(c, item, true);
}
}
This file is part of the OdinMS Maple Story Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package server;
import java.awt.Point;
import java.util.Iterator;
import java.util.List;
import client.Equip;
import client.IItem;
import client.Item;
import client.MapleBuffStat;
import client.MapleCharacter;
import client.MapleClient;
import client.MapleInventoryType;
import constants.InventoryConstants;
import tools.MaplePacketCreator;
/**
*
* @author Matze
*/
public class MapleInventoryManipulator {
public static boolean addRing(MapleCharacter chr, int itemId, int ringId) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemId);
IItem nEquip = ii.getEquipById(itemId, ringId);
byte newSlot = chr.getInventory(type).addItem(nEquip);
if (newSlot == -1) {
return false;
}
chr.getClient().getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
return true;
}
public static boolean addById(MapleClient c, int itemId, short quantity) {
return addById(c, itemId, quantity, null, -1);
}
public static boolean addById(MapleClient c, int itemId, short quantity, String owner, int petid) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemId);
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemId);
List<IItem> existing = c.getPlayer().getInventory(type).listById(itemId);
if (!InventoryConstants.isRechargable(itemId)) {
if (existing.size() > 0) { // first update all existing slots to slotMax
Iterator<IItem> i = existing.iterator();
while (quantity > 0) {
if (i.hasNext()) {
Item eItem = (Item) i.next();
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && (eItem.getOwner().equals(owner) || owner == null)) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
eItem.setQuantity(newQ);
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem));
}
} else {
break;
}
}
}
while (quantity > 0 || InventoryConstants.isRechargable(itemId)) {
short newQ = (short) Math.min(quantity, slotMax);
if (newQ != 0) {
quantity -= newQ;
Item nItem = new Item(itemId, (byte) 0, newQ, petid);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
if (owner != null) {
nItem.setOwner(owner);
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
if ((InventoryConstants.isRechargable(itemId)) && quantity == 0) {
break;
}
} else {
c.getSession().write(MaplePacketCreator.enableActions());
return false;
}
}
} else {
Item nItem = new Item(itemId, (byte) 0, quantity);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
c.getSession().write(MaplePacketCreator.enableActions());
}
} else if (quantity == 1) {
IItem nEquip = ii.getEquipById(itemId);
if (owner != null) {
nEquip.setOwner(owner);
}
byte newSlot = c.getPlayer().getInventory(type).addItem(nEquip);
if (newSlot == -1) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nEquip));
} else {
throw new RuntimeException("Trying to create equip with non-one quantity");
}
return true;
}
public static boolean addFromDrop(MapleClient c, IItem item, boolean show) {
return addFromDrop(c, item, show, true);
}
public static boolean addFromDrop(MapleClient c, IItem item, boolean show, boolean showAnyMessage) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(item.getItemId());
if (ii.isPickupRestricted(item.getItemId()) && c.getPlayer().getItemQuantity(item.getItemId(), true) > 0 && showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.showItemUnavailable());
return false;
}
short quantity = item.getQuantity();
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, item.getItemId());
List<IItem> existing = c.getPlayer().getInventory(type).listById(item.getItemId());
if (!InventoryConstants.isRechargable(item.getItemId())) {
if (existing.size() > 0) { // first update all existing slots to slotMax
Iterator<IItem> i = existing.iterator();
while (quantity > 0) {
if (i.hasNext()) {
Item eItem = (Item) i.next();
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && item.getOwner().equals(eItem.getOwner())) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
eItem.setQuantity(newQ);
short newQi = (short) Math.min(quantity, slotMax);
quantity -= newQi;
Item nItem = new Item(item.getItemId(), (byte) 0, newQi);
nItem.setOwner(item.getOwner());
if (c.getPlayer().getInventory(type).fakeAddItem(nItem) == -1) {
eItem.setQuantity(oldQ);
return false;
}
quantity += newQi;
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, eItem, showAnyMessage));
}
} else {
break;
}
}
}
while (quantity > 0 || InventoryConstants.isRechargable(item.getItemId())) {
short newQ = (short) Math.min(quantity, slotMax);
quantity -= newQ;
Item nItem = new Item(item.getItemId(), (byte) 0, newQ);
nItem.setOwner(item.getOwner());
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
item.setQuantity((short) (quantity + newQ));
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem, true));
if ((InventoryConstants.isRechargable(item.getItemId())) && quantity == 0) {
break;
}
}
} else {
Item nItem = new Item(item.getItemId(), (byte) 0, quantity);
byte newSlot = c.getPlayer().getInventory(type).addItem(nItem);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, nItem));
c.getSession().write(MaplePacketCreator.enableActions());
}
} else if (quantity == 1) {
byte newSlot = c.getPlayer().getInventory(type).addItem(item);
if (newSlot == -1) {
if (showAnyMessage) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
}
return false;
}
c.getSession().write(MaplePacketCreator.addInventorySlot(type, item, true));
} else {
return false;
}
if (show) {
c.getSession().write(MaplePacketCreator.getShowItemGain(item.getItemId(), item.getQuantity()));
}
return true;
}
public static void removeAllById(MapleClient c, int itemId, boolean checkEquipped) {
MapleInventoryType type = MapleItemInformationProvider.getInstance().getInventoryType(itemId);
for (IItem item : c.getPlayer().getInventory(type).listById(itemId)) {
if (item != null) {
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), true, false);
}
}
if (checkEquipped) {
IItem ii = c.getPlayer().getInventory(type).findById(itemId);
if (ii != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeItem(ii.getPosition());
c.getPlayer().equipChanged();
}
}
}
public static boolean checkSpace(MapleClient c, int itemid, int quantity, String owner) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
MapleInventoryType type = ii.getInventoryType(itemid);
if (!type.equals(MapleInventoryType.EQUIP)) {
short slotMax = ii.getSlotMax(c, itemid);
List<IItem> existing = c.getPlayer().getInventory(type).listById(itemid);
if (!InventoryConstants.isRechargable(itemid)) {
if (existing.size() > 0) // first update all existing slots to slotMax
{
for (IItem eItem : existing) {
short oldQ = eItem.getQuantity();
if (oldQ < slotMax && owner.equals(eItem.getOwner())) {
short newQ = (short) Math.min(oldQ + quantity, slotMax);
quantity -= (newQ - oldQ);
}
if (quantity <= 0) {
break;
}
}
}
}
final int numSlotsNeeded;
if (slotMax > 0) {
numSlotsNeeded = (int) (Math.ceil(((double) quantity) / slotMax));
} else if (InventoryConstants.isRechargable(itemid)) {
numSlotsNeeded = 1;
} else {
numSlotsNeeded = 1;
System.out.println("checkSpace error");
}
return !c.getPlayer().getInventory(type).isFull(numSlotsNeeded - 1);
} else {
return !c.getPlayer().getInventory(type).isFull();
}
}
public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop) {
removeFromSlot(c, type, slot, quantity, fromDrop, false);
}
public static void removeFromSlot(MapleClient c, MapleInventoryType type, byte slot, short quantity, boolean fromDrop, boolean consume) {
IItem item = c.getPlayer().getInventory(type).getItem(slot);
boolean allowZero = consume && InventoryConstants.isRechargable(item.getItemId());
c.getPlayer().getInventory(type).removeItem(slot, quantity, allowZero);
if (item.getQuantity() == 0 && !allowZero) {
c.getSession().write(MaplePacketCreator.clearInventoryItem(type, item.getPosition(), fromDrop));
} else {
c.getSession().write(MaplePacketCreator.updateInventorySlot(type, (Item) item, fromDrop));
}
}
public static void removeById(MapleClient c, MapleInventoryType type, int itemId, int quantity, boolean fromDrop, boolean consume) {
List<IItem> items = c.getPlayer().getInventory(type).listById(itemId);
int remremove = quantity;
for (IItem item : items) {
if (remremove <= item.getQuantity()) {
removeFromSlot(c, type, item.getPosition(), (short) remremove, fromDrop, consume);
remremove = 0;
break;
} else {
remremove -= item.getQuantity();
removeFromSlot(c, type, item.getPosition(), item.getQuantity(), fromDrop, consume);
}
}
if (remremove > 0) {
throw new RuntimeException("[h4x] Not enough items available (" + itemId + ", " + (quantity - remremove) + "/" + quantity + ")");
}
}
public static void move(MapleClient c, MapleInventoryType type, byte src, byte dst) {
if (src < 0 || dst < 0) {
return;
}
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
IItem source = c.getPlayer().getInventory(type).getItem(src);
IItem initialTarget = c.getPlayer().getInventory(type).getItem(dst);
if (source == null) {
return;
}
short olddstQ = -1;
if (initialTarget != null) {
olddstQ = initialTarget.getQuantity();
}
short oldsrcQ = source.getQuantity();
short slotMax = ii.getSlotMax(c, source.getItemId());
c.getPlayer().getInventory(type).move(src, dst, slotMax);
if (!type.equals(MapleInventoryType.EQUIP) && initialTarget != null && initialTarget.getItemId() == source.getItemId() && !InventoryConstants.isRechargable(source.getItemId())) {
if ((olddstQ + oldsrcQ) > slotMax) {
c.getSession().write(MaplePacketCreator.moveAndMergeWithRestInventoryItem(type, src, dst, (short) ((olddstQ + oldsrcQ) - slotMax), slotMax));
} else {
c.getSession().write(MaplePacketCreator.moveAndMergeInventoryItem(type, src, dst, ((Item) c.getPlayer().getInventory(type).getItem(dst)).getQuantity()));
}
} else {
c.getSession().write(MaplePacketCreator.moveInventoryItem(type, src, dst));
}
}
public static void equip(MapleClient c, byte src, byte dst) {
Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
if (source == null) {
return;
} else if ((((source.getItemId() >= 1902000 && source.getItemId() <= 1902002) || source.getItemId() == 1912000) && c.getPlayer().isCygnus()) || ((source.getItemId() >= 1902005 && source.getItemId() <= 1902007) || source.getItemId() == 1912005) && !c.getPlayer().isCygnus()) {// Adventurer taming equipment
return;
}
if (MapleItemInformationProvider.getInstance().isUntradeableOnEquip(source.getItemId())) {
source.setFlag((byte) InventoryConstants.UNTRADEABLE);
}
if (dst == -6) { // unequip the overall
IItem top = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -5);
if (top != null && isOverall(top.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -5, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -5) {
final IItem bottom = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -6);
if (bottom != null && isOverall(source.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -6, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -10) {// check if weapon is two-handed
IItem weapon = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -11);
if (weapon != null && MapleItemInformationProvider.getInstance().isTwoHanded(weapon.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -11, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
} else if (dst == -11) {
IItem shield = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -10);
if (shield != null && MapleItemInformationProvider.getInstance().isTwoHanded(source.getItemId())) {
if (c.getPlayer().getInventory(MapleInventoryType.EQUIP).isFull()) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
c.getSession().write(MaplePacketCreator.getShowInventoryFull());
return;
}
unequip(c, (byte) -10, c.getPlayer().getInventory(MapleInventoryType.EQUIP).getNextFreeSlot());
}
}
if (dst == -18) {
if (c.getPlayer().getMount() != null) {
c.getPlayer().getMount().setItemId(source.getItemId());
}
}
source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(src);
target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(src);
if (target != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(dst);
}
source.setPosition(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(source);
if (target != null) {
target.setPosition(src);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(target);
}
if (c.getPlayer().getBuffedValue(MapleBuffStat.BOOSTER) != null && isWeapon(source.getItemId())) {
c.getPlayer().cancelBuffStats(MapleBuffStat.BOOSTER);
}
c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 2));
c.getPlayer().equipChanged();
}
public static void unequip(MapleClient c, byte src, byte dst) {
Equip source = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).getItem(src);
Equip target = (Equip) c.getPlayer().getInventory(MapleInventoryType.EQUIP).getItem(dst);
if (dst < 0) {
System.out.println("Unequipping to negative slot.");
}
if (source == null) {
return;
}
if (target != null && src <= 0) {
c.getSession().write(MaplePacketCreator.getInventoryFull());
return;
}
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).removeSlot(src);
if (target != null) {
c.getPlayer().getInventory(MapleInventoryType.EQUIP).removeSlot(dst);
}
source.setPosition(dst);
c.getPlayer().getInventory(MapleInventoryType.EQUIP).addFromDB(source);
if (target != null) {
target.setPosition(src);
c.getPlayer().getInventory(MapleInventoryType.EQUIPPED).addFromDB(target);
}
c.getSession().write(MaplePacketCreator.moveInventoryItem(MapleInventoryType.EQUIP, src, dst, (byte) 1));
c.getPlayer().equipChanged();
}
public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
if (src < 0) {
type = MapleInventoryType.EQUIPPED;
}
IItem source = c.getPlayer().getInventory(type).getItem(src);
int itemId = source.getItemId();
if (c.getPlayer().getItemEffect() == itemId && source.getQuantity() == 1) {
c.getPlayer().setItemEffect(0);
c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.itemEffect(c.getPlayer().getId(), 0));
} else if (itemId == 5370000 || itemId == 5370001) { // not actually possible
if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
c.getPlayer().setChalkboard(null);
}
} else if (itemId >= 5000000 && itemId <= 5000100) {
return;
}
if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || (quantity == 0 && !InventoryConstants.isRechargable(itemId))) {
return;
}
Point dropPos = new Point(c.getPlayer().getPosition());
if (quantity < source.getQuantity() && !InventoryConstants.isRechargable(itemId)) {
IItem target = source.copy();
target.setQuantity(quantity);
source.setQuantity((short) (source.getQuantity() - quantity));
c.getSession().write(MaplePacketCreator.dropInventoryItemUpdate(type, source));
dropItem(c, target, dropPos);
} else {
c.getPlayer().getInventory(type).removeSlot(src);
c.getSession().write(MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
if (src < 0) {
c.getPlayer().equipChanged();
}
dropItem(c, source, dropPos);
}
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, int newval) {
return editEquipById(chr,max,itemid,stat,(short)newval);
}
public static int editEquipById(MapleCharacter chr, int max, int itemid, String stat, short newval) {
// Is it an equip?
if (!MapleItemInformationProvider.getInstance().isEquip(itemid)) {
return -1;
}
// Get List
List<IItem> equips = chr.getInventory(MapleInventoryType.EQUIP).listById(itemid);
List<IItem> equipped = chr.getInventory(MapleInventoryType.EQUIPPED).listById(itemid);
// Do you have any?
if (equips.size() == 0 && equipped.size() == 0) {
return 0;
}
int edited = 0;
// edit items
for(IItem itm : equips) {
Equip e = (Equip)itm;
if (edited >= max) {
break;
}
edited++;
if (stat.equals("str")) {
e.setStr(newval);
} else if (stat.equals("dex")) {
e.setDex(newval);
} else if (stat.equals("int")) {
e.setInt(newval);
} else if (stat.equals("luk")) {
e.setLuk(newval);
} else if (stat.equals("watk")) {
e.setWatk(newval);
} else if (stat.equals("matk")) {
e.setMatk(newval);
} else {
return -2;
}
}
for(IItem itm : equipped) {
Equip e = (Equip)itm;
if (edited >= max) {
break;
}
edited++;
if (stat.equals("str")) {
e.setStr(newval);
} else if (stat.equals("dex")) {
e.setDex(newval);
} else if (stat.equals("int")) {
e.setInt(newval);
} else if (stat.equals("luk")) {
e.setLuk(newval);
} else if (stat.equals("watk")) {
e.setWatk(newval);
} else if (stat.equals("matk")) {
e.setMatk(newval);
} else {
return -2;
}
}
// Return items edited
return (edited);
}
private static final void dropItem(MapleClient c, IItem target, Point dropPos) {
if (MapleItemInformationProvider.getInstance().isDropRestricted(target.getItemId())) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer().getObjectId(), c.getPlayer().getPosition(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer().getObjectId(), c.getPlayer().getPosition(), c.getPlayer(), target, dropPos, true, !c.getPlayer().getMap().getEverlast());
}
}
private static final boolean isOverall(int itemId) {
return itemId / 10000 == 105;
}
private static final boolean isWeapon(int itemId) {
return itemId >= 1302000 && itemId < 1492024;
}
public static boolean addFromDrop(MapleClient c, IItem item) {
return addFromDrop(c, item, true);
}
}
Last edited: