v111 multiplay

what i am need fix for v111 can multiplay

Code:
public static final String HOST = "YOURIP";
(Change YOURIP, TO YOUR IP) <= If you want it so just you can play, change that to 127.0.0.1. If you want others to connect, change it to the ip that you get at whatismyip.com
You will have to hex edit your client again to the ip from whatismyip.com though.
 
Upvote 0
Code:
package net.server.handlers.channel;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import net.AbstractMaplePacketHandler;
import server.maps.AnimatedMapleMapObject;
import server.movement.*;
import tools.FilePrinter;
import tools.data.input.LittleEndianAccessor;

public abstract class AbstractMovementPacketHandler extends AbstractMaplePacketHandler {
    private static final String FILE = "NEW_MOVEMENT.txt";
    
    protected List<LifeMovementFragment> parseMovement(LittleEndianAccessor lea) {
        List<LifeMovementFragment> res = new ArrayList<LifeMovementFragment>();
        byte numCommands = lea.readByte();
        for (byte i = 0; i < numCommands; i++) {
            byte command = lea.readByte();
            switch (command) {
                case -5:
                case -3:
                case -2: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short fh = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final UnknownMovement bm = new UnknownMovement(command, new Point(xpos, ypos), duration, newstate);
                    bm.setFH(fh);
                    bm.setPixelsPerSecond(new Point(xoffset, yoffset));
                    res.add(bm);
                    break;
                }
                case -1: // Bounce movement?
                case 20: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short unk = lea.readShort();
                    final short fh = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final BounceMovement bm = new BounceMovement(command, new Point(xpos, ypos), duration, newstate);
                    bm.setFH(fh);
                    bm.setUnk(unk);
                    res.add(bm);
                    break;
                }
                case 0: // normal move
                case 7:
                case 16:
                case 45:
                case 46:
                case 60:
                case 61:
                case 62: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final short unk = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final AbsoluteLifeMovement alm = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                    alm.setUnk(unk);
                    alm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    alm.setOffset(new Point(xoffset, yoffset));
                    res.add(alm);
                    break;
                }
                    
                case -4: //?
                case 25: //?
                case 26: //?
                case 27: //?
                case 28: //?
                case 29: //? <- has no offsets
                case 30:
                case 31:
                case 32:
                case 35: // i think, well in gms anyway
                case 36: //this too
                case 37:
                case 38:
                case 22:
                case 23: // Aran Combat Step
                case 24:
                case 17:
                case 33:
                case 34:
                case 39: {
                    final byte newstate = lea.readByte();
                    final short unk = lea.readShort();
                    final AranMovement am = new AranMovement(command, new Point(0, 0), unk, newstate);

                    res.add(am);
                    break;
                }
                case 40:
                case 41:
                case 42:
                case 43:
                case 1:
                case 2:
                case 21:
                case 18: 
                case 15:
                {
                    final short xmod = lea.readShort();
                    final short ymod = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final RelativeLifeMovement rlm = new RelativeLifeMovement(command, new Point(xmod, ymod), duration, newstate);
                    res.add(rlm);
                    break;
                }
                case 5:
                case 6: // assaulter
                case 19:
                case 100:
                case 101: //wut
                case 3: // rush
                case 4: // tele... -.-
                case 8: // assassinate
                {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final byte newstate = lea.readByte();
                    final TeleportMovement tm = new TeleportMovement(command, new Point(xpos, ypos), newstate);
                    tm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    res.add(tm);
                    break;
                }
                case 9:
                case 10:
                case 12: 
                case 13:
                {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short unk = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final ChairMovement cm = new ChairMovement(command, new Point(xpos, ypos), duration, newstate);
                    cm.setUnk(unk);
                    res.add(cm);
                    break;
                }
                case 11: {
                    res.add(new ChangeEquip(lea.readByte()));
                    break;
                }
                case 14: { // Jump Down
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final short unk = lea.readShort();
                    final short fh = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final JumpDownMovement jdm = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate);
                    jdm.setUnk(unk);
                    jdm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    jdm.setOffset(new Point(xoffset, yoffset));
                    jdm.setFH(fh);

                    res.add(jdm);
                    break;
                }
                /*
                case 0: // normal move
                case 5:
                case 17: { // Float
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                short unk = lea.readShort();
                short xoffset = lea.readShort();
                short yoffset = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                AbsoluteLifeMovement alm = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                alm.setUnk(unk);
                alm.setPixelsPerSecond(new Point(xwobble, ywobble));
                alm.setOffset(new Point(xoffset, yoffset));
                res.add(alm);
                break;
                }
                case 1:
                case 2:
                case 6: // fj
                //case 12:
                //case 13: // Shot-jump-back thing
                case 16: { // Float
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                RelativeLifeMovement rlm = new RelativeLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                res.add(rlm);
                break;
                }
                case 3:
                case 4: // tele... -.-
                case 7: // assaulter
                case 8: // assassinate
                case 9: {// rush
                lea.skip(9);
                break;
                case 14: {
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                byte newstate = lea.readByte();
                TeleportMovement tm = new TeleportMovement(command, new Point(xpos, ypos), newstate);
                tm.setPixelsPerSecond(new Point(xwobble, ywobble));
                res.add(tm);
                break;
                } 
                }
                case 10: // Change Equip
                res.add(new ChangeEquip(lea.readByte()));
                break;
                case 11: { // Chair
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short unk = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                ChairMovement cm = new ChairMovement(command, new Point(xpos, ypos), duration, newstate);
                cm.setUnk(unk);
                res.add(cm);
                break;
                }
                case 13:
                lea.skip(19);
                break;
                case 15: {
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                short unk = lea.readShort();
                short fh = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                JumpDownMovement jdm = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate);
                jdm.setUnk(unk);
                jdm.setPixelsPerSecond(new Point(xwobble, ywobble));
                jdm.setFH(fh);
                res.add(jdm);
                break;
                }
                case 28:
                case 21: //Causes aran to do weird stuff when attacking o.o
                /*byte newstate = lea.readByte();
                short unk = lea.readShort();
                AranMovement am = new AranMovement(command, new Point(0, 0), unk, newstate);
                res.add(am);
                lea.skip(3);  */
                default:
                    FilePrinter.print(FILE, "Remaining : " + (numCommands - res.size()) + " New type of movement ID : " + command + ", packet : " + lea.toString() + "\r\n\r\n");
                    return null;
            }
        }
        return res;
    }

    protected void updatePosition(List<LifeMovementFragment> movement, AnimatedMapleMapObject target, int yoffset) {
        for (LifeMovementFragment move : movement) {
            if (move instanceof LifeMovement) {
                if (move instanceof AbsoluteLifeMovement) {
                    Point position = ((LifeMovement) move).getPosition();
                    position.y += yoffset;
                    target.setPosition(position);
                }
                target.setStance(((LifeMovement) move).getNewstate());
            }
        }
    }
}

Code:
package net.server.handlers.channel;

import client.MapleCharacter;
import java.util.List;
import client.MapleClient;
import server.movement.LifeMovementFragment;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;

public final class MovePlayerHandler extends AbstractMovementPacketHandler {
    @Override
    public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        MapleCharacter chr = c.getPlayer();
        slea.skip(17);
        final List<LifeMovementFragment> res = parseMovement(slea);
        if (res != null && chr.getMap() != null) {
            updatePosition(res, c.getPlayer(), 0);
            chr.getMap().movePlayer(c.getPlayer(), chr.getPosition());
            if (chr.isHidden()) {
                chr.getMap().broadcastGMMessage(c.getPlayer(), MaplePacketCreator.movePlayer(chr.getId(), res), false);
            } else {
                chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.movePlayer(chr.getId(), res), false);
            }            
        }
    }
}

Code:
public static byte[] spawnPlayerMapobject(final MapleCharacter chr) {
        final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendOpcode.SPAWN_PLAYER.getValue());
        mplew.writeInt(chr.getId());
        mplew.write(chr.getLevel()); //v83
        mplew.writeMapleAsciiString(chr.getName());
        mplew.writeShort(0);//Ultimate Explorer
        if (chr.getGuildId() < 1) {
            mplew.writeMapleAsciiString("");
            mplew.write(new byte[6]);
        } else {
            MapleGuildSummary gs = chr.getClient().getWorldServer().getGuildSummary(chr.getGuildId());
            if (gs != null) {
                mplew.writeMapleAsciiString(gs.getName());
                mplew.writeShort(gs.getLogoBG());
                mplew.write(gs.getLogoBGColor());
                mplew.writeShort(gs.getLogo());
                mplew.write(gs.getLogoColor());
            } else {
                mplew.writeMapleAsciiString("");
                mplew.write(new byte[6]);
            }
        }
        final List<Pair<Integer, Integer>> buffvalue = new ArrayList<Pair<Integer, Integer>>();
        final long[] mask = new long[4];
        mask[0] |= WHATEVER_BUFF;
        if (chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null || chr.isHidden()) {
            mask[mask.length - 1] |= MapleBuffStat.DARKSIGHT.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.SOULARROW) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SOULARROW.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.COMBO) != null) {
            mask[mask.length - 1] |= MapleBuffStat.COMBO.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.COMBO).intValue()), 1));
        }
        if (chr.getBuffedValue(MapleBuffStat.WK_CHARGE) != null) {
            mask[mask.length - 1] |= MapleBuffStat.WK_CHARGE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.WK_CHARGE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.WK_CHARGE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SHADOWPARTNER.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.SHADOWPARTNER)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.MORPH) != null) {
            mask[mask.length - 1] |= MapleBuffStat.MORPH.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getStatForBuff(MapleBuffStat.MORPH).getMorph(chr)), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.MORPH)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DIVINE_BODY) != null) {
            mask[mask.length - 1] |= MapleBuffStat.DIVINE_BODY.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.BERSERK_FURY) != null) {
            mask[mask.length - 1] |= MapleBuffStat.BERSERK_FURY.getValue();
        }
        //---------------------------------------------------------------
        if (chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null) {
            mask[mask.length - 2] |= MapleBuffStat.WIND_WALK.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.ITEM_EFFECT) != null) {
            mask[mask.length - 2] |= MapleBuffStat.ITEM_EFFECT.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.ITEM_EFFECT).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.ITEM_EFFECT)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SOARING) != null) {
            mask[mask.length - 2] |= MapleBuffStat.SOARING.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SOARING).intValue()), 2));
        }
        if (chr.getBuffedValue(MapleBuffStat.INFILTRATE) != null) {
            mask[mask.length - 2] |= MapleBuffStat.INFILTRATE.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.MECH_MODE) != null) {
            mask[mask.length - 2] |= MapleBuffStat.MECH_MODE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.MECH_MODE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.MECH_MODE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DARK_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.DARK_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.DARK_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.DARK_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.BLUE_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.BLUE_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.BLUE_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.BLUE_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.YELLOW_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.YELLOW_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.YELLOW_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.YELLOW_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DIVINE_SHIELD) != null) {
            mask[mask.length - 2] |= MapleBuffStat.DIVINE_SHIELD.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.INFLATION) != null) {
            mask[mask.length - 2] |= MapleBuffStat.INFLATION.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.INFLATION).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.INFLATION)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.WATER_SHIELD) != null) {
            mask[mask.length - 1] |= MapleBuffStat.WATER_SHIELD.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.SPIRIT_SURGE) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SPIRIT_SURGE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SPIRIT_SURGE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.SPIRIT_SURGE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SPIRIT_LINK) != null) {
            mask[mask.length - 2] |= MapleBuffStat.SPIRIT_LINK.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SPIRIT_LINK).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.SPIRIT_LINK)), 3));
        }
//        if (chr.getBuffedValue(MapleBuffStat.HOLY_MAGIC_SHELL) != null) { 
//            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.HOLY_MAGIC_SHELL).intValue()), 1));
//        }
        for (int i = 0; i < mask.length; i++) {
            mplew.writeLong(mask[i]);
        }
        for (Pair<Integer, Integer> i : buffvalue) {
            if (i.getRight() == 3) {
                mplew.writeInt(i.getLeft().intValue());
            } else if (i.getRight() == 2) {
                mplew.writeShort(i.getLeft().shortValue());
            } else if (i.getRight() == 1) {
                mplew.write(i.getLeft().byteValue());
            }
        }
        final int CHAR_MAGIC_SPAWN = Randomizer.nextInt();//server tick value o.o
        mplew.writeShort(0);
        mplew.writeShort(0);
        mplew.writeLong(0);//energy charge
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);
        mplew.writeLong(0);//dash_speed
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);//v74

        mplew.writeShort(0);
        mplew.writeLong(0);//dash_jump
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);
        final int buffSrc = chr.getBuffSource(MapleBuffStat.MONSTER_RIDING);
        if (buffSrc > 0) {
            final Item c_mount = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -118);
            final Item mount = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -18);
            if (GameConstants.getMountItem(buffSrc, chr) == 0 && c_mount != null && chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -119) != null) {
                mplew.writeInt(c_mount.getItemId());
            } else if (GameConstants.getMountItem(buffSrc, chr) == 0 && mount != null && chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -19) != null) {
                mplew.writeInt(mount.getItemId());
            } else {
                mplew.writeInt(GameConstants.getMountItem(buffSrc, chr));
            }
            mplew.writeInt(buffSrc);
        } else {
            mplew.writeLong(0);
        }
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeLong(0);//speed infusion
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeInt(1);
        mplew.writeLong(0); //homing beacon
        mplew.write(0); //random
        mplew.writeShort(0);
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeLong(0);
        mplew.writeLong(0);
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);//v107
        mplew.writeShort(chr.getJob().getId());
        mplew.writeShort(0);

        addCharLook(mplew, chr, false);

        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        //31 75 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C3 00 BB 00 04 10 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        mplew.writeInt(Math.min(100, chr.getInventory(MapleInventoryType.CASH).countById(5110000)));
        final int itemEffect = chr.getItemEffect();
        final int mod = itemEffect / 1000000;
        mplew.writeInt(mod == 5 ? itemEffect : 0);
        mplew.writeInt(0);
        mplew.writeInt(mod == 3 ? itemEffect : 0);
        int lolwings;
        if (chr.getJob().getId() >= 3100 && chr.getJob().getId() <= 3111) {
            lolwings = 5010084;
        } else if (chr.getJob().getId() == 3001 || chr.getJob().getId() == 3112) {
            lolwings = 5010085;
        } else {
            lolwings = 0;
        }
        mplew.writeInt(lolwings);//v104, demon slayer **** 5010084/5010085 -_- wing effect
        mplew.writeInt(0);
        mplew.writeInt(chr.getChair());
        mplew.writeInt(0);//v106
        mplew.writePos(chr.getTruePosition());
        mplew.write(chr.getStance());
        mplew.writeShort(0);//chr.getFh()
        mplew.write(0);
        final MaplePet[] pet = chr.getPets();
        for (int i = 0; i < 3; i++) {//correct :)
            if (pet[i] != null) {
                addPetInfo(mplew, pet[i]);
            }
        }
        mplew.write(0); //end of pets
        mplew.writeShort(1);//??
        if (chr.getMount() == null) {
            mplew.writeInt(1); // mob level
            mplew.writeLong(0); // mob exp + tiredness
        } else {
            mplew.writeInt(chr.getMount().getLevel());
            mplew.writeInt(chr.getMount().getExp());
            mplew.writeInt(chr.getMount().getTiredness());
        }
        if (chr.getPlayerShop() != null && chr.getPlayerShop().isOwner(chr)) {
            if (chr.getPlayerShop().hasFreeSlot()) {
                addAnnounceBox(mplew, chr.getPlayerShop(), chr.getPlayerShop().getVisitors().length);
            } else {
                addAnnounceBox(mplew, chr.getPlayerShop(), 1);
            }
        } else if (chr.getMiniGame() != null && chr.getMiniGame().isOwner(chr)) {
            if (chr.getMiniGame().hasFreeSlot()) {
                addAnnounceBox(mplew, chr.getMiniGame(), 1, 0, 1, 0);
            } else {
                addAnnounceBox(mplew, chr.getMiniGame(), 1, 0, 2, 1);
            }
        } else {
            mplew.write(0);
        }
        if (chr.getChalkboard() != null) {
            mplew.write(1);
            mplew.writeMapleAsciiString(chr.getChalkboard());
        } else {
            mplew.write(0);
        }
        addRingLook(mplew, chr, true);
        addRingLook(mplew, chr, false);
        addMarriageRingLook(mplew, chr);
        mplew.write(0);//berserk
        mplew.writeInt(0);
        mplew.write(0);
        mplew.writeInt(0);//v107 lol? where must this be added (maybe 3 bytes only because of team not written)
        mplew.write(chr.getTeam());//team is only send when it's needed, but idc :P
        return mplew.getPacket();
    }
 
Upvote 0
Code:
package net.server.handlers.channel;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import net.AbstractMaplePacketHandler;
import server.maps.AnimatedMapleMapObject;
import server.movement.*;
import tools.FilePrinter;
import tools.data.input.LittleEndianAccessor;

public abstract class AbstractMovementPacketHandler extends AbstractMaplePacketHandler {
    private static final String FILE = "NEW_MOVEMENT.txt";
    
    protected List<LifeMovementFragment> parseMovement(LittleEndianAccessor lea) {
        List<LifeMovementFragment> res = new ArrayList<LifeMovementFragment>();
        byte numCommands = lea.readByte();
        for (byte i = 0; i < numCommands; i++) {
            byte command = lea.readByte();
            switch (command) {
                case -5:
                case -3:
                case -2: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short fh = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final UnknownMovement bm = new UnknownMovement(command, new Point(xpos, ypos), duration, newstate);
                    bm.setFH(fh);
                    bm.setPixelsPerSecond(new Point(xoffset, yoffset));
                    res.add(bm);
                    break;
                }
                case -1: // Bounce movement?
                case 20: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short unk = lea.readShort();
                    final short fh = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final BounceMovement bm = new BounceMovement(command, new Point(xpos, ypos), duration, newstate);
                    bm.setFH(fh);
                    bm.setUnk(unk);
                    res.add(bm);
                    break;
                }
                case 0: // normal move
                case 7:
                case 16:
                case 45:
                case 46:
                case 60:
                case 61:
                case 62: {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final short unk = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final AbsoluteLifeMovement alm = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                    alm.setUnk(unk);
                    alm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    alm.setOffset(new Point(xoffset, yoffset));
                    res.add(alm);
                    break;
                }
                    
                case -4: //?
                case 25: //?
                case 26: //?
                case 27: //?
                case 28: //?
                case 29: //? <- has no offsets
                case 30:
                case 31:
                case 32:
                case 35: // i think, well in gms anyway
                case 36: //this too
                case 37:
                case 38:
                case 22:
                case 23: // Aran Combat Step
                case 24:
                case 17:
                case 33:
                case 34:
                case 39: {
                    final byte newstate = lea.readByte();
                    final short unk = lea.readShort();
                    final AranMovement am = new AranMovement(command, new Point(0, 0), unk, newstate);

                    res.add(am);
                    break;
                }
                case 40:
                case 41:
                case 42:
                case 43:
                case 1:
                case 2:
                case 21:
                case 18: 
                case 15:
                {
                    final short xmod = lea.readShort();
                    final short ymod = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final RelativeLifeMovement rlm = new RelativeLifeMovement(command, new Point(xmod, ymod), duration, newstate);
                    res.add(rlm);
                    break;
                }
                case 5:
                case 6: // assaulter
                case 19:
                case 100:
                case 101: //wut
                case 3: // rush
                case 4: // tele... -.-
                case 8: // assassinate
                {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final byte newstate = lea.readByte();
                    final TeleportMovement tm = new TeleportMovement(command, new Point(xpos, ypos), newstate);
                    tm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    res.add(tm);
                    break;
                }
                case 9:
                case 10:
                case 12: 
                case 13:
                {
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short unk = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final ChairMovement cm = new ChairMovement(command, new Point(xpos, ypos), duration, newstate);
                    cm.setUnk(unk);
                    res.add(cm);
                    break;
                }
                case 11: {
                    res.add(new ChangeEquip(lea.readByte()));
                    break;
                }
                case 14: { // Jump Down
                    final short xpos = lea.readShort();
                    final short ypos = lea.readShort();
                    final short xwobble = lea.readShort();
                    final short ywobble = lea.readShort();
                    final short unk = lea.readShort();
                    final short fh = lea.readShort();
                    final short xoffset = lea.readShort();
                    final short yoffset = lea.readShort();
                    final byte newstate = lea.readByte();
                    final short duration = lea.readShort();
                    final JumpDownMovement jdm = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate);
                    jdm.setUnk(unk);
                    jdm.setPixelsPerSecond(new Point(xwobble, ywobble));
                    jdm.setOffset(new Point(xoffset, yoffset));
                    jdm.setFH(fh);

                    res.add(jdm);
                    break;
                }
                /*
                case 0: // normal move
                case 5:
                case 17: { // Float
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                short unk = lea.readShort();
                short xoffset = lea.readShort();
                short yoffset = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                AbsoluteLifeMovement alm = new AbsoluteLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                alm.setUnk(unk);
                alm.setPixelsPerSecond(new Point(xwobble, ywobble));
                alm.setOffset(new Point(xoffset, yoffset));
                res.add(alm);
                break;
                }
                case 1:
                case 2:
                case 6: // fj
                //case 12:
                //case 13: // Shot-jump-back thing
                case 16: { // Float
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                RelativeLifeMovement rlm = new RelativeLifeMovement(command, new Point(xpos, ypos), duration, newstate);
                res.add(rlm);
                break;
                }
                case 3:
                case 4: // tele... -.-
                case 7: // assaulter
                case 8: // assassinate
                case 9: {// rush
                lea.skip(9);
                break;
                case 14: {
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                byte newstate = lea.readByte();
                TeleportMovement tm = new TeleportMovement(command, new Point(xpos, ypos), newstate);
                tm.setPixelsPerSecond(new Point(xwobble, ywobble));
                res.add(tm);
                break;
                } 
                }
                case 10: // Change Equip
                res.add(new ChangeEquip(lea.readByte()));
                break;
                case 11: { // Chair
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short unk = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                ChairMovement cm = new ChairMovement(command, new Point(xpos, ypos), duration, newstate);
                cm.setUnk(unk);
                res.add(cm);
                break;
                }
                case 13:
                lea.skip(19);
                break;
                case 15: {
                short xpos = lea.readShort();
                short ypos = lea.readShort();
                short xwobble = lea.readShort();
                short ywobble = lea.readShort();
                short unk = lea.readShort();
                short fh = lea.readShort();
                byte newstate = lea.readByte();
                short duration = lea.readShort();
                JumpDownMovement jdm = new JumpDownMovement(command, new Point(xpos, ypos), duration, newstate);
                jdm.setUnk(unk);
                jdm.setPixelsPerSecond(new Point(xwobble, ywobble));
                jdm.setFH(fh);
                res.add(jdm);
                break;
                }
                case 28:
                case 21: //Causes aran to do weird stuff when attacking o.o
                /*byte newstate = lea.readByte();
                short unk = lea.readShort();
                AranMovement am = new AranMovement(command, new Point(0, 0), unk, newstate);
                res.add(am);
                lea.skip(3);  */
                default:
                    FilePrinter.print(FILE, "Remaining : " + (numCommands - res.size()) + " New type of movement ID : " + command + ", packet : " + lea.toString() + "\r\n\r\n");
                    return null;
            }
        }
        return res;
    }

    protected void updatePosition(List<LifeMovementFragment> movement, AnimatedMapleMapObject target, int yoffset) {
        for (LifeMovementFragment move : movement) {
            if (move instanceof LifeMovement) {
                if (move instanceof AbsoluteLifeMovement) {
                    Point position = ((LifeMovement) move).getPosition();
                    position.y += yoffset;
                    target.setPosition(position);
                }
                target.setStance(((LifeMovement) move).getNewstate());
            }
        }
    }
}

Code:
package net.server.handlers.channel;

import client.MapleCharacter;
import java.util.List;
import client.MapleClient;
import server.movement.LifeMovementFragment;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;

public final class MovePlayerHandler extends AbstractMovementPacketHandler {
    @Override
    public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
        MapleCharacter chr = c.getPlayer();
        slea.skip(17);
        final List<LifeMovementFragment> res = parseMovement(slea);
        if (res != null && chr.getMap() != null) {
            updatePosition(res, c.getPlayer(), 0);
            chr.getMap().movePlayer(c.getPlayer(), chr.getPosition());
            if (chr.isHidden()) {
                chr.getMap().broadcastGMMessage(c.getPlayer(), MaplePacketCreator.movePlayer(chr.getId(), res), false);
            } else {
                chr.getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.movePlayer(chr.getId(), res), false);
            }            
        }
    }
}

Code:
public static byte[] spawnPlayerMapobject(final MapleCharacter chr) {
        final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendOpcode.SPAWN_PLAYER.getValue());
        mplew.writeInt(chr.getId());
        mplew.write(chr.getLevel()); //v83
        mplew.writeMapleAsciiString(chr.getName());
        mplew.writeShort(0);//Ultimate Explorer
        if (chr.getGuildId() < 1) {
            mplew.writeMapleAsciiString("");
            mplew.write(new byte[6]);
        } else {
            MapleGuildSummary gs = chr.getClient().getWorldServer().getGuildSummary(chr.getGuildId());
            if (gs != null) {
                mplew.writeMapleAsciiString(gs.getName());
                mplew.writeShort(gs.getLogoBG());
                mplew.write(gs.getLogoBGColor());
                mplew.writeShort(gs.getLogo());
                mplew.write(gs.getLogoColor());
            } else {
                mplew.writeMapleAsciiString("");
                mplew.write(new byte[6]);
            }
        }
        final List<Pair<Integer, Integer>> buffvalue = new ArrayList<Pair<Integer, Integer>>();
        final long[] mask = new long[4];
        mask[0] |= WHATEVER_BUFF;
        if (chr.getBuffedValue(MapleBuffStat.DARKSIGHT) != null || chr.isHidden()) {
            mask[mask.length - 1] |= MapleBuffStat.DARKSIGHT.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.SOULARROW) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SOULARROW.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.COMBO) != null) {
            mask[mask.length - 1] |= MapleBuffStat.COMBO.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.COMBO).intValue()), 1));
        }
        if (chr.getBuffedValue(MapleBuffStat.WK_CHARGE) != null) {
            mask[mask.length - 1] |= MapleBuffStat.WK_CHARGE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.WK_CHARGE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.WK_CHARGE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SHADOWPARTNER.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SHADOWPARTNER).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.SHADOWPARTNER)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.MORPH) != null) {
            mask[mask.length - 1] |= MapleBuffStat.MORPH.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getStatForBuff(MapleBuffStat.MORPH).getMorph(chr)), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.MORPH)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DIVINE_BODY) != null) {
            mask[mask.length - 1] |= MapleBuffStat.DIVINE_BODY.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.BERSERK_FURY) != null) {
            mask[mask.length - 1] |= MapleBuffStat.BERSERK_FURY.getValue();
        }
        //---------------------------------------------------------------
        if (chr.getBuffedValue(MapleBuffStat.WIND_WALK) != null) {
            mask[mask.length - 2] |= MapleBuffStat.WIND_WALK.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.ITEM_EFFECT) != null) {
            mask[mask.length - 2] |= MapleBuffStat.ITEM_EFFECT.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.ITEM_EFFECT).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.ITEM_EFFECT)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SOARING) != null) {
            mask[mask.length - 2] |= MapleBuffStat.SOARING.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SOARING).intValue()), 2));
        }
        if (chr.getBuffedValue(MapleBuffStat.INFILTRATE) != null) {
            mask[mask.length - 2] |= MapleBuffStat.INFILTRATE.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.MECH_MODE) != null) {
            mask[mask.length - 2] |= MapleBuffStat.MECH_MODE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.MECH_MODE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.MECH_MODE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DARK_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.DARK_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.DARK_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.DARK_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.BLUE_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.BLUE_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.BLUE_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.BLUE_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.YELLOW_AURA) != null) {
            mask[mask.length - 2] |= MapleBuffStat.YELLOW_AURA.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.YELLOW_AURA).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.YELLOW_AURA)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.DIVINE_SHIELD) != null) {
            mask[mask.length - 2] |= MapleBuffStat.DIVINE_SHIELD.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.INFLATION) != null) {
            mask[mask.length - 2] |= MapleBuffStat.INFLATION.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.INFLATION).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.INFLATION)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.WATER_SHIELD) != null) {
            mask[mask.length - 1] |= MapleBuffStat.WATER_SHIELD.getValue();
        }
        if (chr.getBuffedValue(MapleBuffStat.SPIRIT_SURGE) != null) {
            mask[mask.length - 1] |= MapleBuffStat.SPIRIT_SURGE.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SPIRIT_SURGE).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffSource(MapleBuffStat.SPIRIT_SURGE)), 3));
        }
        if (chr.getBuffedValue(MapleBuffStat.SPIRIT_LINK) != null) {
            mask[mask.length - 2] |= MapleBuffStat.SPIRIT_LINK.getValue();
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.SPIRIT_LINK).intValue()), 2));
            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getTrueBuffSource(MapleBuffStat.SPIRIT_LINK)), 3));
        }
//        if (chr.getBuffedValue(MapleBuffStat.HOLY_MAGIC_SHELL) != null) { 
//            buffvalue.add(new Pair<Integer, Integer>(Integer.valueOf(chr.getBuffedValue(MapleBuffStat.HOLY_MAGIC_SHELL).intValue()), 1));
//        }
        for (int i = 0; i < mask.length; i++) {
            mplew.writeLong(mask[i]);
        }
        for (Pair<Integer, Integer> i : buffvalue) {
            if (i.getRight() == 3) {
                mplew.writeInt(i.getLeft().intValue());
            } else if (i.getRight() == 2) {
                mplew.writeShort(i.getLeft().shortValue());
            } else if (i.getRight() == 1) {
                mplew.write(i.getLeft().byteValue());
            }
        }
        final int CHAR_MAGIC_SPAWN = Randomizer.nextInt();//server tick value o.o
        mplew.writeShort(0);
        mplew.writeShort(0);
        mplew.writeLong(0);//energy charge
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);
        mplew.writeLong(0);//dash_speed
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);//v74

        mplew.writeShort(0);
        mplew.writeLong(0);//dash_jump
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);
        final int buffSrc = chr.getBuffSource(MapleBuffStat.MONSTER_RIDING);
        if (buffSrc > 0) {
            final Item c_mount = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -118);
            final Item mount = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -18);
            if (GameConstants.getMountItem(buffSrc, chr) == 0 && c_mount != null && chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -119) != null) {
                mplew.writeInt(c_mount.getItemId());
            } else if (GameConstants.getMountItem(buffSrc, chr) == 0 && mount != null && chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -19) != null) {
                mplew.writeInt(mount.getItemId());
            } else {
                mplew.writeInt(GameConstants.getMountItem(buffSrc, chr));
            }
            mplew.writeInt(buffSrc);
        } else {
            mplew.writeLong(0);
        }
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeLong(0);//speed infusion
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeInt(1);
        mplew.writeLong(0); //homing beacon
        mplew.write(0); //random
        mplew.writeShort(0);
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeLong(0);
        mplew.writeLong(0);
        mplew.write(1);
        mplew.writeInt(CHAR_MAGIC_SPAWN);

        mplew.writeShort(0);//v107
        mplew.writeShort(chr.getJob().getId());
        mplew.writeShort(0);

        addCharLook(mplew, chr, false);

        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        mplew.writeInt(0);
        //31 75 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C3 00 BB 00 04 10 00 00 00 01 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        mplew.writeInt(Math.min(100, chr.getInventory(MapleInventoryType.CASH).countById(5110000)));
        final int itemEffect = chr.getItemEffect();
        final int mod = itemEffect / 1000000;
        mplew.writeInt(mod == 5 ? itemEffect : 0);
        mplew.writeInt(0);
        mplew.writeInt(mod == 3 ? itemEffect : 0);
        int lolwings;
        if (chr.getJob().getId() >= 3100 && chr.getJob().getId() <= 3111) {
            lolwings = 5010084;
        } else if (chr.getJob().getId() == 3001 || chr.getJob().getId() == 3112) {
            lolwings = 5010085;
        } else {
            lolwings = 0;
        }
        mplew.writeInt(lolwings);//v104, demon slayer **** 5010084/5010085 -_- wing effect
        mplew.writeInt(0);
        mplew.writeInt(chr.getChair());
        mplew.writeInt(0);//v106
        mplew.writePos(chr.getTruePosition());
        mplew.write(chr.getStance());
        mplew.writeShort(0);//chr.getFh()
        mplew.write(0);
        final MaplePet[] pet = chr.getPets();
        for (int i = 0; i < 3; i++) {//correct :)
            if (pet[i] != null) {
                addPetInfo(mplew, pet[i]);
            }
        }
        mplew.write(0); //end of pets
        mplew.writeShort(1);//??
        if (chr.getMount() == null) {
            mplew.writeInt(1); // mob level
            mplew.writeLong(0); // mob exp + tiredness
        } else {
            mplew.writeInt(chr.getMount().getLevel());
            mplew.writeInt(chr.getMount().getExp());
            mplew.writeInt(chr.getMount().getTiredness());
        }
        if (chr.getPlayerShop() != null && chr.getPlayerShop().isOwner(chr)) {
            if (chr.getPlayerShop().hasFreeSlot()) {
                addAnnounceBox(mplew, chr.getPlayerShop(), chr.getPlayerShop().getVisitors().length);
            } else {
                addAnnounceBox(mplew, chr.getPlayerShop(), 1);
            }
        } else if (chr.getMiniGame() != null && chr.getMiniGame().isOwner(chr)) {
            if (chr.getMiniGame().hasFreeSlot()) {
                addAnnounceBox(mplew, chr.getMiniGame(), 1, 0, 1, 0);
            } else {
                addAnnounceBox(mplew, chr.getMiniGame(), 1, 0, 2, 1);
            }
        } else {
            mplew.write(0);
        }
        if (chr.getChalkboard() != null) {
            mplew.write(1);
            mplew.writeMapleAsciiString(chr.getChalkboard());
        } else {
            mplew.write(0);
        }
        addRingLook(mplew, chr, true);
        addRingLook(mplew, chr, false);
        addMarriageRingLook(mplew, chr);
        mplew.write(0);//berserk
        mplew.writeInt(0);
        mplew.write(0);
        mplew.writeInt(0);//v107 lol? where must this be added (maybe 3 bytes only because of team not written)
        mplew.write(chr.getTeam());//team is only send when it's needed, but idc :P
        return mplew.getPacket();
    }

this is give me multiplay ?
and where i am need past this cods ?
 
Upvote 0
Back