You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
package net.sector.level.drivers.functors;
|
|
|
|
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
import net.sector.entities.Entity;
|
|
import net.sector.level.dataobj.AiObjParser;
|
|
import net.sector.level.drivers.EAiTaskType;
|
|
import net.sector.level.drivers.FunctorBase;
|
|
import net.sector.level.drivers.INavigated;
|
|
|
|
import com.porcupine.coord.Vec;
|
|
import com.porcupine.math.Calc;
|
|
|
|
|
|
/**
|
|
* AI fly to closest of type, accelerate when getting close.<br>
|
|
* <br>
|
|
* "target" type of target entity PLAYER, ENEMY, SHOT_GOOD, SHOT_BAD<br>
|
|
* "weight" eg. 0.4 strength of steering<br>
|
|
* "range" scan range, eg. 15
|
|
*/
|
|
public class FnMagnet extends FunctorBase {
|
|
@Override
|
|
public boolean execute(INavigated drone, Map<String, Object> memory, Map<String, Object> args) {
|
|
if (drone.isEmpParalyzed()) return false;
|
|
|
|
double desiredSpeed = drone.getDesiredSpeed();
|
|
|
|
|
|
double range = AiObjParser.getDouble(args.get("range"), 15);
|
|
double weight = AiObjParser.getDouble(args.get("weight"), 1) * 0.4 * speedMul(drone);
|
|
String target = AiObjParser.getString(args.get("target"), "");
|
|
|
|
|
|
Set<Entity> ents = drone.getScene().getEntitiesInRange(drone.getPos(), range);
|
|
if (!ents.isEmpty()) {
|
|
for (Entity e : ents) {
|
|
if (e == drone) continue;
|
|
if (target.contains(e.getType().toString())) {
|
|
double dist = e.getPos().distTo(drone.getPos()) - e.getRadius();
|
|
if (dist < 0) dist = 0;
|
|
double move = weight / dist;
|
|
move = Calc.clampd(move, 0, weight);
|
|
drone.getMotion().add_ip(((Vec) drone.getPos().vecTo(e.getPos()).setY(0)).norm(move));
|
|
drone.getMotion().norm_ip(desiredSpeed);
|
|
}
|
|
}
|
|
}
|
|
|
|
drone.getMotion().norm_ip(desiredSpeed);
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public EAiTaskType getFunctorType() {
|
|
return EAiTaskType.TASK;
|
|
}
|
|
}
|
|
|