package tc.oc.pgm.physics;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.util.Vector;
import tc.oc.commons.bukkit.event.targeted.TargetedEventHandler;
import tc.oc.pgm.events.PlayerResetEvent;
import tc.oc.pgm.match.MatchPlayer;
import tc.oc.pgm.match.MatchPlayerFacet;
import tc.oc.pgm.match.MatchScope;
import tc.oc.pgm.match.Repeatable;
import tc.oc.pgm.spawns.events.ParticipantDespawnEvent;
public class AccelerationPlayerFacet implements MatchPlayerFacet, Listener {
private static final double MIN_FORCE = 0.0001;
private final Player player;
private final MatchPlayer matchPlayer;
private final Set<PlayerForce> forces = new HashSet<>();
@Inject AccelerationPlayerFacet(Player player, MatchPlayer matchPlayer) {
this.player = player;
this.matchPlayer = matchPlayer;
}
public void clearForces() {
forces.clear();
}
public PlayerForce addForce(Vector force) {
return addForce(force, false, false);
}
public PlayerForce addForce(Vector force, boolean relativeYaw, boolean relativePitch) {
return addForce(force, RelativeFlags.of(relativeYaw, relativePitch));
}
public PlayerForce addForce(Vector acceleration, RelativeFlags relative) {
final PlayerForce force = new PlayerForce(acceleration, relative);
addForce(force);
return force;
}
public boolean addForce(PlayerForce force) {
return forces.add(force);
}
public boolean removeForce(PlayerForce force) {
return forces.remove(force);
}
@Repeatable(scope = MatchScope.LOADED)
public void tickForce() {
final Vector acceleration = new Vector();
for(PlayerForce force : forces) {
acceleration.add(force.acceleration(matchPlayer));
}
if(acceleration.lengthSquared() > MIN_FORCE) {
player.applyImpulse(acceleration);
}
}
@TargetedEventHandler
public void onReset(PlayerResetEvent event) {
clearForces();
}
@TargetedEventHandler
public void onReset(ParticipantDespawnEvent event) {
clearForces();
}
}