package com.jenjinstudios.demo.server;
import com.jenjinstudios.demo.server.event.Collision;
import com.jenjinstudios.world.Actor;
import com.jenjinstudios.world.WorldObject;
import com.jenjinstudios.world.math.Angle;
import com.jenjinstudios.world.math.Vector2D;
import com.jenjinstudios.world.state.MoveState;
import static com.jenjinstudios.world.math.Angle.FRONT;
/**
* @author Caleb Brinkman
*/
public class Bullet extends Actor
{
public static final double RANGE = 100;
private final Vector2D startVector;
public Bullet(Actor actorFiring) {
super("Bullet");
getProperties().put(Collision.SIZE_PROPERTY, 1.0);
setVector2D(actorFiring.getVector2D());
double targetAngle = actorFiring.getAngle().getAbsoluteAngle();
setAngle(new Angle(targetAngle, FRONT));
setMoveSpeed(Actor.DEFAULT_MOVE_SPEED * 3);
setResourceID(1);
setZoneID(actorFiring.getZoneID());
startVector = getVector2D();
addPostUpdateEvent("Collision", new Collision(this)
{
@Override
public void onCollision(WorldObject collided) {
if (!(collided instanceof Bullet) && collided instanceof Actor && collided != actorFiring)
{
Actor actor = (Actor) collided;
Angle idle = new Angle();
if (idle.getAbsoluteAngle() == collided.getAngle().getAbsoluteAngle())
{
idle = idle.reverseAbsoluteAngle();
}
long forceTime = collided.getWorld().getLastUpdateCompleted();
actor.setVector2D(Vector2D.ORIGIN);
actor.setForcedState(new MoveState(idle, Vector2D.ORIGIN, forceTime));
getWorld().getWorldObjects().remove(Bullet.this);
}
}
});
addPreUpdateEvent("RangeStop", () -> {
if (!getAngle().isNotIdle() || startVector.getDistanceToVector(getVector2D()) > RANGE)
{
getWorld().getWorldObjects().remove(Bullet.this);
}
});
}
}