package com.jenjinstudios.world.client.message;
import com.jenjinstudios.core.io.Message;
import com.jenjinstudios.world.Actor;
import com.jenjinstudios.world.WorldObject;
import com.jenjinstudios.world.client.WorldClient;
import com.jenjinstudios.world.math.Angle;
import com.jenjinstudios.world.math.Vector2D;
/**
* Process a StateChangeMessage.
*
* @author Caleb Brinkman
*/
public class ExecutableStateChangeMessage extends WorldClientExecutableMessage
{
/** The ID of the actor to which to add the state. */
private int actorID;
private Angle angle;
private Vector2D oldVector;
private long time;
/**
* Construct an ExecutableMessage with the given Message.
*
* @param client The client invoking this message.
* @param message The Message.
*/
public ExecutableStateChangeMessage(WorldClient client, Message message) {
super(client, message);
}
@Override
public void runDelayed() {
WorldObject obj = getConnection().getWorld().getWorldObjects().get(actorID);
if (obj != null && obj instanceof Actor)
{
Actor actor = (Actor) obj;
double dist = actor.getMoveSpeed() * ((double) (System.currentTimeMillis() - time) / 1000d);
Vector2D position = oldVector.getVectorInDirection(dist, angle.getStepAngle());
actor.setAngle(angle);
actor.setVector2D(position);
}
}
@Override
public void runImmediate() {
actorID = (int) getMessage().getArgument("id");
double relativeAngle = (double) getMessage().getArgument("relativeAngle");
double absoluteAngle = (double) getMessage().getArgument("absoluteAngle");
time = (long) getMessage().getArgument("timeOfChange");
double x = (double) getMessage().getArgument("xCoordinate");
double y = (double) getMessage().getArgument("yCoordinate");
oldVector = new Vector2D(x, y);
angle = new Angle(absoluteAngle, relativeAngle);
}
}