Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

[HELP] Fixes needed for my Server.

Newbie Spellweaver
Joined
Aug 15, 2009
Messages
14
Reaction score
0
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

/*
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:
Skilled Illusionist
Joined
Apr 21, 2012
Messages
337
Reaction score
144
Problem 2 is likely caused by the experience rolling over into the negative. That is, you're receiving too much experience.
Problem 3 is client-side. Just find a localhost that lets you drop untradeable items.
 
Upvote 0
Newbie Spellweaver
Joined
Aug 15, 2009
Messages
14
Reaction score
0
Problem 2 is likely caused by the experience rolling over into the negative. That is, you're receiving too much experience.
Problem 3 is client-side. Just find a localhost that lets you drop untradeable items.

Problem 1:
Any idea on this?

Problem 2:
But some other servers rates are 1500 or even higher but they don't get any +- <amount> EXP. Any idea?

Problem 3:
I've search the forum and most people say that dropping cash item is changing of localhost but dropping of untradeable is server sided.
 
Upvote 0
Custom Title Activated
Loyal Member
Joined
Mar 14, 2010
Messages
5,363
Reaction score
1,343
Problem 2:
But some other servers rates are 1500 or even higher but they don't get any +- <amount> EXP. Any idea?

I'd guess it's from an NPC. That's because the NPC you're using has it's own set EXP to give for the mob. So whatever EXP is defined for the mob in the NPC is multiplied by your EXP rate. If it's over max value, you get +-
 
Upvote 0
Skilled Illusionist
Joined
Apr 21, 2012
Messages
337
Reaction score
144
I'd guess it's from an NPC. That's because the NPC you're using has it's own set EXP to give for the mob. So whatever EXP is defined for the mob in the NPC is multiplied by your EXP rate. If it's over max value, you get +-

This makes absolutely no sense. Experience for mobs are defined in the Wz files or similar alternatives (depending on source).

Anyway, to actually solve problem two: Bigfoot grants 2,660,000 experience in GMS. Multiply that by 1,000 and you're well over the Integer max value (2^31 - 1 or about 2.1 billion). The maximum your experience rate could be without Bigfoot giving you problems is 807. There's likely other mobs that would also do something similar though.

To solve problem three:

MapleInventoryManager.java - Replace the drop method with this one.
PHP:
		public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
		MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
		if (src < 0) {
			type = MapleInventoryType.EQUIPPED;
		}
		IItem source = c.getPlayer().getInventory(type).getItem(src);
		int itemId = source.getItemId();
		if (itemId >= 5000000 && itemId <= 5000100) {
			return;
		}
		if (type == MapleInventoryType.EQUIPPED && itemId == 1122017) {
			c.getPlayer().unequipPendantOfSpirit();
		}
		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) {
			if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
				c.getPlayer().setChalkboard(null);
			}
		}
		if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || quantity == 0 && !ItemConstants.isRechargable(itemId)) {
			return;
		}
		Point dropPos = new Point(c.getPlayer().getPosition());
		if (quantity < source.getQuantity() && !ItemConstants.isRechargable(itemId)) {
			IItem target = source.copy();
			target.setQuantity(quantity);
			source.setQuantity((short) (source.getQuantity() - quantity));
			c.announce(MaplePacketCreator.dropInventoryItemUpdate(type, source));
			boolean weddingRing = source.getItemId() == 1112803 || source.getItemId() == 1112806 || source.getItemId() == 1112807 || source.getItemId() == 1112809;
			if (weddingRing) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
			} else if (c.getPlayer().getMap().getEverlast()) {
				if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
					c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
				} else {
					c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, false);
				}
			} else if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
			} else {
				c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
			}
		} else {
			c.getPlayer().getInventory(type).removeSlot(src);
			c.announce(MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
			if (src < 0) {
				c.getPlayer().equipChanged();
			}
			if (c.getPlayer().getMap().getEverlast()) {
				if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
					c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
				} else {
					c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, false);
				}
			} else if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
			} else {
				c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
			}
		}
	}

ServerConstants - add this line:
Code:
public static final boolean DROP_UNTRADEABLE_ITEMS = true;
 
Upvote 0
Newbie Spellweaver
Joined
May 28, 2012
Messages
45
Reaction score
4
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)
There're many possibilities, it might be the mobCount in MapleStatEffect, or it could be your attack handler if you're updating to a higher version. It could also be some kind of break statement in the code which doesn't allows you to kill more than a defined value.

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)
In your gainEXP method in MapleCharacter, modify it, change the exp from an int to a long, this helps to prevent overflowing. Also, don't forget to add a check, or maybe a loop and the exp will be deducted from that long and used to level.

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>)
In the drop function in MapleInventoryManipulator, don't send the spawnDisappearingDrop packet for untradeable items, send the spawnItemDrop instead.
 
Upvote 0
Skilled Illusionist
Joined
Apr 21, 2012
Messages
337
Reaction score
144
AlphaEta, yes, please do respond with the exact same things I said but in a less helpful way.
 
Upvote 0
Newbie Spellweaver
Joined
Aug 15, 2009
Messages
14
Reaction score
0
This makes absolutely no sense. Experience for mobs are defined in the Wz files or similar alternatives (depending on source).

Anyway, to actually solve problem two: Bigfoot grants 2,660,000 experience in GMS. Multiply that by 1,000 and you're well over the Integer max value (2^31 - 1 or about 2.1 billion). The maximum your experience rate could be without Bigfoot giving you problems is 807. There's likely other mobs that would also do something similar though.

To solve problem three:

MapleInventoryManager.java - Replace the drop method with this one.
PHP:
		public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
		MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
		if (src < 0) {
			type = MapleInventoryType.EQUIPPED;
		}
		IItem source = c.getPlayer().getInventory(type).getItem(src);
		int itemId = source.getItemId();
		if (itemId >= 5000000 && itemId <= 5000100) {
			return;
		}
		if (type == MapleInventoryType.EQUIPPED && itemId == 1122017) {
[COLOR="#FF0000"]			c.getPlayer().unequipPendantOfSpirit();[/COLOR]
		}
		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) {
			if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
				c.getPlayer().setChalkboard(null);
			}
		}
		if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || quantity == 0 && !ItemConstants.isRechargable(itemId)) {
			return;
		}
		Point dropPos = new Point(c.getPlayer().getPosition());
		if (quantity < source.getQuantity() && !ItemConstants.isRechargable(itemId)) {
			IItem target = source.copy();
			target.setQuantity(quantity);
			source.setQuantity((short) (source.getQuantity() - quantity));
			[COLOR="#FF0000"]c.announce[/COLOR](MaplePacketCreator.dropInventoryItemUpdate(type, source));
			boolean weddingRing = source.getItemId() == 1112803 || source.getItemId() == 1112806 || source.getItemId() == 1112807 || source.getItemId() == 1112809;
			if (weddingRing) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
			} else if (c.getPlayer().getMap().getEverlast()) {
				if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
					c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
				} else {
					c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, false);
				}
			} else if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
			} else {
				c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
			}
		} else {
			c.getPlayer().getInventory(type).removeSlot(src);
			       public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
        MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
        if (src < 0) {
            type = MapleInventoryType.EQUIPPED;
        }
        IItem source = c.getPlayer().getInventory(type).getItem(src);
        int itemId = source.getItemId();
        if (itemId >= 5000000 && itemId <= 5000100) {
            return;
        }
        if (type == MapleInventoryType.EQUIPPED && itemId == 1122017) {
 [COLOR="#FF0000"]           c.getPlayer().unequipPendantOfSpirit();[/COLOR]
        }
        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) {
            if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
                c.getPlayer().setChalkboard(null);
            }
        }
        if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || quantity == 0 && !ItemConstants.isRechargable(itemId)) {
            return;
        }
        Point dropPos = new Point(c.getPlayer().getPosition());
        if (quantity < source.getQuantity() && !ItemConstants.isRechargable(itemId)) {
            IItem target = source.copy();
            target.setQuantity(quantity);
            source.setQuantity((short) (source.getQuantity() - quantity));
           [COLOR="#FF0000"][/COLOR](MaplePacketCreator.dropInventoryItemUpdate(type, source));
            boolean weddingRing = source.getItemId() == 1112803 || source.getItemId() == 1112806 || source.getItemId() == 1112807 || source.getItemId() == 1112809;
            if (weddingRing) {
                c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
            } else if (c.getPlayer().getMap().getEverlast()) {
                if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
                    c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
                } else {
                    c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, false);
                }
            } else if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
                c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
            } else {
                c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);
            }
        } else {
            c.getPlayer().getInventory(type).removeSlot(src);
          [COLOR="#FF0000"]  c.announce[/COLOR](MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
            if (src < 0) {
                c.getPlayer().equipChanged();
            }
            if (c.getPlayer().getMap().getEverlast()) {
                if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
                    c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
                } else {
                    c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, false);
                }
            } else if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
                c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
            } else {
                c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
            }
        }
    }  (MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
			if (src < 0) {
				c.getPlayer().equipChanged();
			}
			if (c.getPlayer().getMap().getEverlast()) {
				if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
					c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
				} else {
					c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, false);
				}
			} else if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
				c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
			} else {
				c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);
			}
		}
	}

ServerConstants - add this line:
Code:
public static final boolean DROP_UNTRADEABLE_ITEMS = true;

public static void drop(MapleClient c, MapleInventoryType type, byte src, short quantity) {
MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
if (src < 0) {
type = MapleInventoryType.EQUIPPED;
}
IItem source = c.getPlayer().getInventory(type).getItem(src);
int itemId = source.getItemId();
if (itemId >= 5000000 && itemId <= 5000100) {
return;
}
if (type == MapleInventoryType.EQUIPPED && itemId == 1122017) {
c.getPlayer().unequipPendantOfSpirit();
}
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) {
if (c.getPlayer().getItemQuantity(itemId, false) == 1) {
c.getPlayer().setChalkboard(null);
}
}
if (c.getPlayer().getItemQuantity(itemId, true) < quantity || quantity < 0 || source == null || quantity == 0 && !ItemConstants.isRechargable(itemId)) {
return;
}
Point dropPos = new Point(c.getPlayer().getPosition());
if (quantity < source.getQuantity() && !ItemConstants.isRechargable(itemId)) {
IItem target = source.copy();
target.setQuantity(quantity);
source.setQuantity((short) (source.getQuantity() - quantity));
c.announce(MaplePacketCreator.dropInventoryItemUpdate(type, source));
boolean weddingRing = source.getItemId() == 1112803 || source.getItemId() == 1112806 || source.getItemId() == 1112807 || source.getItemId() == 1112809;
if (weddingRing) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else if (c.getPlayer().getMap().getEverlast()) {
if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, false);

}
} else if ((ii.isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) || MapleItemInformationProvider.getInstance().isCash(target.getItemId())) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), target, dropPos, true, true);

}
} else {
c.getPlayer().getInventory(type).removeSlot(src);
c.announce(MaplePacketCreator.dropInventoryItem((src < 0 ? MapleInventoryType.EQUIP : type), src));
if (src < 0) {
c.getPlayer().equipChanged();
}
if (c.getPlayer().getMap().getEverlast()) {
if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, false);
}

} else if ((ii.isDropRestricted(itemId) && !ServerConstants.DROP_UNTRADEABLE_ITEMS)) {
c.getPlayer().getMap().disappearingItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos);
} else {
c.getPlayer().getMap().spawnItemDrop(c.getPlayer(), c.getPlayer(), source, dropPos, true, true);

}
}
}

Basically the one in red is those error please help me fix that :) , It'll be a great help if you fix those of it for me .
 
Last edited:
Upvote 0
Skilled Illusionist
Joined
Apr 21, 2012
Messages
337
Reaction score
144
Basically the one in red is those error please help me fix that :) , It'll be a great help if you fix those of it for me .

Heh, I apparently shouldn't assume things about your source. Just edit the dropItems method. Replace it with this one:
PHP:
private static final void dropItem(MapleClient c, IItem target, Point dropPos) {
    if (MapleItemInformationProvider.getInstance().isDropRestricted(target.getItemId()) && !ServerConstants.DROP_UNTRADEABLE_ITEMS) {
        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());
    }
}

(You'll still need the extra line in ServerConstants)
 
Upvote 0
Back
Top