package rts.core.engine.layers.entities.projectiles; import org.newdawn.slick.GameContainer; import org.newdawn.slick.SlickException; import rts.core.engine.Engine; import rts.core.engine.Utils; import rts.core.engine.layers.entities.ActiveEntity; import rts.core.engine.layers.entities.BasicEntity; import rts.core.engine.layers.entities.IBigEntity; import rts.core.engine.layers.entities.buildings.Turret; public abstract class Projectile extends BasicEntity { private int playerId; protected int power; protected float tx; protected float ty; protected float ang; protected float dirX; protected float dirY; protected float speed; protected ActiveEntity target; public Projectile(Engine engine, ActiveEntity owner, ActiveEntity target, int layer, int decX, int decY) { super(engine, layer); this.playerId = owner.getPlayerId(); this.target = target; this.tx = getTargetX(); this.ty = getTargetY(); if (owner instanceof Turret) { this.ang = Utils.getTargetAngle(owner.getX() + 20, owner.getY() + 20, tx, ty); } else this.ang = Utils.getTargetAngle(owner.getX(), owner.getY(), tx, ty); this.dirX = (float) Math.sin(Math.toRadians(ang)); this.dirY = (float) -Math.cos(Math.toRadians(ang)); if (owner instanceof Turret) { this.x = owner.getX() + 20 + (dirX * decX); this.y = owner.getY() + 20 + (dirY * decY); } else { this.x = owner.getX() + (dirX * decX); this.y = owner.getY() + (dirY * decY); } } private float getTargetX() { return (target instanceof IBigEntity) ? ((IBigEntity) target).getRealX() : target.getX() + (engine.getTileW() / 2); } private float getTargetY() { return (target instanceof IBigEntity) ? ((IBigEntity) target).getRealY() : target.getY() + (engine.getTileH() / 2); } @Override public void update(GameContainer container, int delta) throws SlickException { float nextX = (dirX * speed * delta) + x; float nextY = (dirY * speed * delta) + y; if (Utils.getDistanceBetween(nextX, nextY, tx, ty) < 5) { if (Utils.getDistanceBetween(nextX, nextY, getTargetX(), getTargetY()) < 5) { if (target.getPlayerId() == -1) { target.removeLife(power); engine.getNetworkManager().sendUpdateNPEntity(target.getState()); } else { if (!engine.isPlayerEntity(playerId)) { target.removeLife(power); } } } destroy(); engine.removeEntity(this); } else { x = nextX; y = nextY; } } protected abstract void destroy(); }