package electrosphere.server.ai.creature; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; 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 java.util.Random; import org.joml.Vector3d; import org.joml.Vector3f; /** * * @author amaterasu */ public class MillAbout extends AI { Entity character; // float aggroRange = 10.0f; // float attackRange = 1.0f; // // int attackCooldownMax = 250; // int attackCooldown = 0; boolean millAbout = true; int millMoveTimer = 0; int millMoveTimerTimeout = 100; int MILL_MOVE_TIMEOUT_LOWER = 1500; int MILL_MOVE_TIMEOUT_UPPER = 2000; float millTargetMaxDist = 3; boolean moveToTarget = false; Vector3d moveTargetPosition; public MillAbout(Entity character){ this.character = character; } public static void attachToCreature(Entity creature){ MillAbout ai = new MillAbout(creature); Globals.aiManager.registerAI(ai); } @Override public void simulate(){ Vector3d position = EntityUtils.getPosition(character); //mill aboud if(millAbout){ if(millMoveTimer >= millMoveTimerTimeout){ Random rand = new Random(); millMoveTimer = 0; millMoveTimerTimeout = rand.nextInt(MILL_MOVE_TIMEOUT_UPPER - MILL_MOVE_TIMEOUT_LOWER) + MILL_MOVE_TIMEOUT_LOWER; Vector3d moveVector = new Vector3d(); //search for a spot to mill to // while(true){ moveVector.set( rand.nextFloat() - 0.5, rand.nextFloat() - 0.5, rand.nextFloat() - 0.5 ).normalize().mul(millTargetMaxDist); moveVector.y = position.y; //Globals.commonWorldData.getElevationAtPoint(new Vector3d(position).add(moveVector)); //TODO: search in navmeshmanager to make sure navigable, otherwise generate new pos // } moveTargetPosition = new Vector3d(position).add(moveVector); millAbout = false; moveToTarget = true; } else { millMoveTimer++; } } if(moveToTarget){ if(moveTargetPosition.distance(position) > 0.4){ Vector3d moveVector = new Vector3d(moveTargetPosition).sub(position).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); } } else { ClientGroundMovementTree characterMoveTree = (ClientGroundMovementTree)CreatureUtils.serverGetEntityMovementTree(character); characterMoveTree.slowdown(); // System.out.println("Made it to destination"); moveToTarget = false; millAbout = true; } } // if(target != null){ // if(inAttackRange()){ // attack(); // } else { // if(inAggroRange()){ // moveToTarget(); // } else { // target = null; // } // } // } else { // searchForTarget(); // } } // void attack(){ // if(attackCooldown == 0){ // attackCooldown = attackCooldownMax; // AttackTree attackTree = CreatureUtils.getAttackTree(character); // attackTree.start(EntityDataStrings.ATTACK_MOVE_TYPE_MELEE_SWING_ONE_HAND); // } else { // attackCooldown--; // } // } // void moveToTarget(){ // Vector3d targetPosition = EntityUtils.getPosition(target); // Vector3d characterPosition = EntityUtils.getPosition(character); // Vector3d moveVector = new Vector3d(targetPosition).sub(characterPosition).normalize(); // CreatureUtils.setMovementVector(character, new Vector3f((float)moveVector.x,(float)moveVector.y,(float)moveVector.z)); // GroundMovementTree characterMoveTree = CreatureUtils.getEntityMovementTree(character); // if(characterMoveTree.getState()==GroundMovementTree.MovementTreeState.IDLE || characterMoveTree.getState()==GroundMovementTree.MovementTreeState.SLOWDOWN){ // characterMoveTree.start(); // } // } // 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); // for(Entity current : Globals.entityManager.getLifeStateEntities()){ // if(current != character){ // Vector3d potentialTargetPosition = EntityUtils.getPosition(current); // if(position.distance(potentialTargetPosition) < aggroRange){ // target = current; // break; // } // } // } // } }