package electrosphere.server.ai.creature; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityTags; import electrosphere.entity.EntityUtils; import electrosphere.entity.state.attack.ClientAttackTree; import electrosphere.entity.state.attack.ServerAttackTree; import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree; import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementRelativeFacing; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.server.ai.AI; import electrosphere.server.datacell.Realm; import electrosphere.server.datacell.utils.DataCellSearchUtils; import org.joml.Vector3d; import org.joml.Vector3f; /** * * @author amaterasu */ public class MindlessAttacker extends AI{ Entity character; Entity target; float aggroRange = 10.0f; float attackRange = 1.0f; int attackCooldownMax = 250; int attackCooldown = 0; public MindlessAttacker(Entity character){ this.character = character; } public static void attachToCreature(Entity creature){ MindlessAttacker ai = new MindlessAttacker(creature); Globals.aiManager.registerAI(ai); } @Override public void simulate(){ if(target != null){ if(inAttackRange()){ attack(); } else { if(inAggroRange()){ moveToTarget(); } else { target = null; } } } else { searchForTarget(); } } void attack(){ if(attackCooldown == 0){ attackCooldown = attackCooldownMax; ServerAttackTree attackTree = CreatureUtils.serverGetAttackTree(character); attackTree.start(); } else { attackCooldown--; } } void moveToTarget(){ Vector3d targetPosition = EntityUtils.getPosition(target); Vector3d characterPosition = EntityUtils.getPosition(character); Vector3d moveVector = new Vector3d(targetPosition).sub(characterPosition).normalize(); CreatureUtils.setFacingVector(character, new Vector3d((float)moveVector.x,(float)moveVector.y,(float)moveVector.z)); ClientGroundMovementTree characterMoveTree = (ClientGroundMovementTree)CreatureUtils.serverGetEntityMovementTree(character); if(characterMoveTree.getState()==ClientGroundMovementTree.MovementTreeState.IDLE || characterMoveTree.getState()==ClientGroundMovementTree.MovementTreeState.SLOWDOWN){ characterMoveTree.start(MovementRelativeFacing.FORWARD); } } boolean inAttackRange(){ boolean rVal = false; Vector3d position = EntityUtils.getPosition(character); Vector3d targetPosition = EntityUtils.getPosition(target); if(new Vector3d(position).distance(targetPosition) < attackRange){ rVal = true; } return rVal; } boolean inAggroRange(){ boolean rVal = false; Vector3d position = EntityUtils.getPosition(character); Vector3d targetPosition = EntityUtils.getPosition(target); if(new Vector3d(position).distance(targetPosition) < aggroRange){ rVal = true; } return rVal; } void searchForTarget(){ Vector3d position = EntityUtils.getPosition(character); Realm realm = Globals.realmManager.getEntityRealm(character); for(Entity current : DataCellSearchUtils.getEntitiesWithTagAroundLocation(realm,position,EntityTags.LIFE_STATE)){ if(current != character){ Vector3d potentialTargetPosition = EntityUtils.getPosition(current); if(position.distance(potentialTargetPosition) < aggroRange){ target = current; break; } } } } }