package handling.channel.handler; import java.awt.Point; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import server.maps.AnimatedMapleMapObject; import server.movement.AbsoluteLifeMovement; import server.movement.ChangeEquipSpecialAwesome; import server.movement.GroundMovement; import server.movement.LifeMovement; import server.movement.LifeMovementFragment; import server.movement.RelativeLifeMovement; import server.movement.TeleportMovement; import tools.FileoutputUtil; import tools.data.LittleEndianAccessor; public class MovementParse { public static List<LifeMovementFragment> parseMovement(LittleEndianAccessor lea, int kind) { List res = new ArrayList(); byte numCommands = lea.readByte(); for (byte i = 0; i < numCommands; i = (byte) (i + 1)) { byte command = lea.readByte(); switch (command) { case 0: case 7: case 8: case 15: case 16: case 17: case 53: { short xpos = lea.readShort(); short ypos = lea.readShort(); short xwobble = lea.readShort(); short ywobble = lea.readShort(); short unk = lea.readShort(); short fh = 0; short xoffset = 0; short yoffset = 0; if (command == 15) { fh = lea.readShort(); } if (command != 44) { xoffset = lea.readShort(); 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.setFh(fh); alm.setPixelsPerSecond(new Point(xwobble, ywobble)); alm.setOffset(new Point(xoffset, yoffset)); res.add(alm); break; } case 1: case 2: case 14: case 19: case 20: case 21: case 24: case 45: { short xmod = lea.readShort(); short ymod = lea.readShort(); short unk = 0; if ((command == 14) || (command == 19) || (command == 20) || (command == 24) || (command == 45)) { unk = lea.readShort(); } byte newstate = lea.readByte(); short duration = lea.readShort(); RelativeLifeMovement rlm = new RelativeLifeMovement(command, new Point(xmod, ymod), duration, newstate); rlm.setUnk(unk); res.add(rlm); break; } case 18: case 22: case 23: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 44: case 46: { byte newstate = lea.readByte(); short unk = lea.readShort(); GroundMovement am = new GroundMovement(command, new Point(0, 0), unk, newstate); res.add(am); break; } case 3: case 4: case 5: case 6: case 9: case 10: case 11: case 13: case 47: { short xpos = lea.readShort(); short ypos = lea.readShort(); short fh = lea.readShort(); byte newstate = lea.readByte(); short duration = lea.readShort(); TeleportMovement tm = new TeleportMovement(command, new Point(xpos, ypos), duration, newstate); tm.setFh(fh); res.add(tm); break; } case 12: res.add(new ChangeEquipSpecialAwesome(command, lea.readByte())); break; case 48: case 49: case 50: case 51: case 52: default: System.out.println("Kind movement: " + kind + ", Remaining : " + (numCommands - res.size()) + " New type of movement ID : " + command + ", packet : " + lea.toString(true)); FileoutputUtil.log("Log_Movement.txt", "Kind movement: " + kind + ", Remaining : " + (numCommands - res.size()) + " New type of movement ID : " + command + ", packet : " + lea.toString(true)); return null; } } if (numCommands != res.size()) { return null; } return res; } public static void updatePosition(List<LifeMovementFragment> movement, AnimatedMapleMapObject target, int yoffset) { if (movement == null) { return; } 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()); } } } }