- Joined
- Apr 17, 2010
- Messages
- 351
- Reaction score
- 2
what i am need fix for v111 can multiplay
what i am need fix for v111 can multiplay
public static final String HOST = "YOURIP";
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());
}
}
}
}
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);
}
}
}
}
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();
}
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(); }
I didn't have to do any of this...
this is give me multiplay ?
and where i am need past this cods ?