MXD-Server/src/handling/channel/handler/MovementParse.java

139 lines
5.6 KiB
Java

package handling.channel.handler;
import java.util.Iterator;
import server.movement.LifeMovement;
import server.maps.AnimatedMapleMapObject;
import server.movement.StaticLifeMovement;
import java.awt.Point;
import java.util.ArrayList;
import server.movement.LifeMovementFragment;
import java.util.List;
import tools.data.LittleEndianAccessor;
public class MovementParse {
public static final List<LifeMovementFragment> parseMovement(final LittleEndianAccessor lea, final int kind) {
final List<LifeMovementFragment> res = (List<LifeMovementFragment>) new ArrayList();
final byte numCommands = lea.readByte();
if (numCommands <= 0) {
return null;
}
for (byte i = 0; i < numCommands; ++i) {
final byte command = lea.readByte();
switch (command) {
case 0:
case 5:
case 15:
case 17: {
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();
short fh = 0;
if (command == 15) {
fh = lea.readShort();
}
final byte newstate = lea.readByte();
final short duration = lea.readShort();
final StaticLifeMovement mov = new StaticLifeMovement((int) command, new Point((int) xpos, (int) ypos), (int) duration, (int) newstate, (int) unk);
mov.setUnk(unk);
mov.setFh(fh);
mov.setPixelsPerSecond(new Point((int) xwobble, (int) ywobble));
res.add(mov);
break;
}
case 1:
case 2:
case 6:
case 12:
case 13:
case 16:
case 18:
case 19:
case 22: {
final short xwobble2 = lea.readShort();
final short ywobble2 = lea.readShort();
final byte newstate2 = lea.readByte();
final short duration2 = lea.readShort();
final StaticLifeMovement mov2 = new StaticLifeMovement((int) command, null, (int) duration2, (int) newstate2, 0);
mov2.setPixelsPerSecond(new Point((int) xwobble2, (int) ywobble2));
res.add(mov2);
break;
}
case 3:
case 4:
case 7:
case 8:
case 9:
case 11: {
final short xpos = lea.readShort();
final short ypos = lea.readShort();
final short unk2 = lea.readShort();
final byte newstate3 = lea.readByte();
final short duration3 = lea.readShort();
final StaticLifeMovement mov3 = new StaticLifeMovement((int) command, new Point((int) xpos, (int) ypos), 0, (int) newstate3, 0);
mov3.setUnk(unk2);
res.add(mov3);
break;
}
case 10: {
final byte newstate4 = 0;
final short duration4 = 0;
final int wui = lea.readByte();
final StaticLifeMovement mov4 = new StaticLifeMovement((int) command, null, 0, 0, 0);
mov4.setWui(wui);
res.add(mov4);
break;
}
case 14: {
final short xwobble2 = lea.readShort();
final short ywobble2 = lea.readShort();
final short fh2 = lea.readShort();
final byte newstate3 = lea.readByte();
final short duration3 = lea.readShort();
final StaticLifeMovement mov3 = new StaticLifeMovement((int) command, null, (int) duration3, (int) newstate3, 0);
mov3.setPixelsPerSecond(new Point((int) xwobble2, (int) ywobble2));
mov3.setFh(fh2);
res.add(mov3);
break;
}
default: {
final byte newstate4 = lea.readByte();
final short duration4 = lea.readShort();
final StaticLifeMovement mov5 = new StaticLifeMovement((int) command, null, (int) duration4, (int) newstate4, 0);
res.add(mov5);
break;
}
}
}
double skip = (double) lea.readByte();
skip = Math.ceil(skip / 2.0);
lea.skip((int) skip);
if (numCommands != res.size()) {
return null;
}
return res;
}
public static final void updatePosition(final List<LifeMovementFragment> movement, final AnimatedMapleMapObject target, final int yoffset) {
for (final LifeMovementFragment move : movement) {
if (move instanceof LifeMovement) {
if (move instanceof StaticLifeMovement) {
final Point position = ((StaticLifeMovement) move).getPosition();
if (position != null) {
final Point point = position;
point.y += yoffset;
target.setPosition(position);
}
}
target.setStance(((StaticLifeMovement) move).getNewstate());
}
}
}
}