diff --git a/assets/Config/settings.json b/assets/Config/settings.json index f3e76ec1..cd9e6e31 100644 --- a/assets/Config/settings.json +++ b/assets/Config/settings.json @@ -12,8 +12,8 @@ "graphicsPerformanceEnableVSync" : false, "graphicsPerformanceDrawShadows" : true, - "graphicsDebugDrawCollisionSpheres" : true, - "graphicsDebugDrawPhysicsObjects" : true, + "graphicsDebugDrawCollisionSpheres" : false, + "graphicsDebugDrawPhysicsObjects" : false, "graphicsDebugDrawMovementVectors" : false, "graphicsDebugDrawNavmesh" : false diff --git a/assets/Data/creatures.json b/assets/Data/creatures.json index 2dbd9e14..46770e6c 100644 --- a/assets/Data/creatures.json +++ b/assets/Data/creatures.json @@ -90,7 +90,22 @@ { "type" : "GROUND", "acceleration" : 16.0, - "maxVelocity" : 3.0 + "maxVelocity" : 3.0, + "animationStartup" : { + "name" : "Armature|WalkStart", + "length" : 1, + "loops" : false + }, + "animationLoop" : { + "name" : "Armature|Walk", + "length" : 1, + "loops" : false + }, + "animationWindDown" : { + "name" : "Armature|WalkStart", + "length" : 1, + "loops" : false + } } ], "collidable" : { @@ -214,8 +229,23 @@ "movementSystems" : [ { "type" : "GROUND", - "acceleration" : 0.001, - "maxVelocity" : 0.025 + "acceleration" : 13.0, + "maxVelocity" : 2.8, + "animationStartup" : { + "name" : "Walk", + "length" : 1, + "loops" : false + }, + "animationLoop" : { + "name" : "Walk", + "length" : 1, + "loops" : false + }, + "animationWindDown" : { + "name" : "Armature|WalkForwardStart", + "length" : 1, + "loops" : false + } } ], "collidable" : { diff --git a/assets/Models/goblin1.fbx b/assets/Models/goblin1.fbx index 139c3fcb..baee626a 100644 Binary files a/assets/Models/goblin1.fbx and b/assets/Models/goblin1.fbx differ diff --git a/src/main/java/electrosphere/audio/AudioEngine.java b/src/main/java/electrosphere/audio/AudioEngine.java index b293303d..8404292f 100644 --- a/src/main/java/electrosphere/audio/AudioEngine.java +++ b/src/main/java/electrosphere/audio/AudioEngine.java @@ -15,6 +15,8 @@ import org.lwjgl.openal.ALC; //import org.lwjgl.openal.*; import org.lwjgl.openal.ALC10; import org.lwjgl.openal.ALCCapabilities; +import static org.lwjgl.openal.ALC10.alcDestroyContext​; +import static org.lwjgl.openal.ALC10.alcCloseDevice​; import static org.lwjgl.system.MemoryUtil.NULL; public class AudioEngine { @@ -70,8 +72,8 @@ public class AudioEngine { } public void shutdown(){ - ALC10.alcDestroyContext​(context); - ALC10.alcCloseDevice​(device); + alcDestroyContext​(context); + alcCloseDevice​(device); } diff --git a/src/main/java/electrosphere/controls/ControlHandler.java b/src/main/java/electrosphere/controls/ControlHandler.java index ff7ff80d..c83cfe6a 100644 --- a/src/main/java/electrosphere/controls/ControlHandler.java +++ b/src/main/java/electrosphere/controls/ControlHandler.java @@ -241,7 +241,7 @@ public class ControlHandler { */ if(controls.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)){ if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && glfwGetKey(Globals.window, controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue()) == GLFW_PRESS){ - Vector3f newFacingVector = new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize(); + Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize(); CreatureUtils.setMovementVector(Globals.playerCharacter, newFacingVector); // System.out.println("Movement vector: " + newFacingVector); if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){ @@ -270,7 +270,7 @@ public class ControlHandler { */ if(controls.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)){ if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).isIsKey() && glfwGetKey(Globals.window, controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).getKeyValue()) == GLFW_PRESS){ - CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(cameraEyeVector.x,0,cameraEyeVector.z).normalize()); + CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3d(cameraEyeVector.x,0,cameraEyeVector.z).normalize()); if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){ movementTree.start(); } @@ -297,7 +297,7 @@ public class ControlHandler { */ if(controls.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)){ if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).isIsKey() && glfwGetKey(Globals.window, controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).getKeyValue()) == GLFW_PRESS){ - CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(90 * Math.PI / 180)).normalize()); + CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(90 * Math.PI / 180)).normalize()); if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){ movementTree.start(); } @@ -324,7 +324,7 @@ public class ControlHandler { */ if(controls.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)){ if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).isIsKey() && glfwGetKey(Globals.window, controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).getKeyValue()) == GLFW_PRESS){ - CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(-90 * Math.PI / 180)).normalize()); + CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(-90 * Math.PI / 180)).normalize()); if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){ movementTree.start(); } @@ -388,7 +388,7 @@ public class ControlHandler { if(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).isState() == true){ //make menu dialog visible //change control scheme to in game main menu scheme - System.out.println("Press main menu"); +// System.out.println("Press main menu"); Globals.currentMenu = MenuUtils.createInGameMainMenu(); MenuUtils.makeMenuDrawable(Globals.currentMenu); Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index 91edefa4..50df5564 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -46,6 +46,7 @@ import electrosphere.game.client.targeting.crosshair.Crosshair; import electrosphere.game.server.pathfinding.NavMeshPathfinder; import electrosphere.game.server.pathfinding.navmesh.NavCube; import electrosphere.game.server.pathfinding.navmesh.NavMesh; +import electrosphere.game.server.unit.UnitUtils; import electrosphere.renderer.ui.Widget; import electrosphere.renderer.ui.WidgetUtils; import java.util.Random; @@ -622,6 +623,8 @@ public class LoadingThread extends Thread { // //attach ai to evil goblin // MindlessAttacker.attachToCreature(goblin); +// UnitUtils.spawnTextGoblin(10, 0, 10); + // StructureUtils.spawnBasicStructure("building1", new Vector3f(5,2.4f,5), new Quaternionf()); // Entity bow = ItemUtils.spawnBasicItem("Bow"); diff --git a/src/main/java/electrosphere/entity/state/AttackTree.java b/src/main/java/electrosphere/entity/state/AttackTree.java index afef4088..3f360098 100644 --- a/src/main/java/electrosphere/entity/state/AttackTree.java +++ b/src/main/java/electrosphere/entity/state/AttackTree.java @@ -78,7 +78,7 @@ public class AttackTree { float velocity = CreatureUtils.getVelocity(parent); Actor entityActor = EntityUtils.getActor(parent); Vector3d position = EntityUtils.getPosition(parent); - Vector3f movementVector = CreatureUtils.getMovementVector(parent); + Vector3d movementVector = CreatureUtils.getMovementVector(parent); //parse attached network messages for(EntityMessage message : networkMessageQueue){ @@ -113,7 +113,7 @@ public class AttackTree { } } EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ()); - CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ())); + CreatureUtils.setMovementVector(parent, new Vector3d(message.getrotationX(),message.getrotationY(),message.getrotationZ())); break; } } diff --git a/src/main/java/electrosphere/entity/state/IdleTree.java b/src/main/java/electrosphere/entity/state/IdleTree.java index 5aba5eaf..64fc0eb8 100644 --- a/src/main/java/electrosphere/entity/state/IdleTree.java +++ b/src/main/java/electrosphere/entity/state/IdleTree.java @@ -11,6 +11,7 @@ import electrosphere.net.parser.net.message.EntityMessage; import electrosphere.renderer.Actor; import electrosphere.renderer.anim.Animation; import java.util.concurrent.CopyOnWriteArrayList; +import org.joml.Vector3d; import org.joml.Vector3f; public class IdleTree { @@ -83,7 +84,7 @@ public class IdleTree { break; } EntityUtils.getPosition(parent).set(message.getpositionX(),message.getpositionY(),message.getpositionZ()); - CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ())); + CreatureUtils.setMovementVector(parent, new Vector3d(message.getrotationX(),message.getrotationY(),message.getrotationZ())); break; } } diff --git a/src/main/java/electrosphere/entity/state/equip/EquipState.java b/src/main/java/electrosphere/entity/state/equip/EquipState.java new file mode 100644 index 00000000..bbe68f34 --- /dev/null +++ b/src/main/java/electrosphere/entity/state/equip/EquipState.java @@ -0,0 +1,9 @@ +package electrosphere.entity.state.equip; + +/** + * + * @author amaterasu + */ +public class EquipState { + +} diff --git a/src/main/java/electrosphere/entity/state/equip/EquipTree.java b/src/main/java/electrosphere/entity/state/equip/EquipTree.java new file mode 100644 index 00000000..2b6bd870 --- /dev/null +++ b/src/main/java/electrosphere/entity/state/equip/EquipTree.java @@ -0,0 +1,9 @@ +package electrosphere.entity.state.equip; + +/** + * + * @author amaterasu + */ +public class EquipTree { + +} diff --git a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java index 3f8ad261..154c6a16 100644 --- a/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java +++ b/src/main/java/electrosphere/entity/state/movement/GroundMovementTree.java @@ -43,6 +43,10 @@ public class GroundMovementTree { static final double STATE_DIFFERENCE_SOFT_UPDATE_THRESHOLD = 0.2; static final double SOFT_UPDATE_MULTIPLIER = 0.1; + String animationStartUp = Animation.ANIMATION_MOVEMENT_STARTUP; + String animationMain = Animation.ANIMATION_MOVEMENT_MOVE; + String animationSlowDown = Animation.ANIMATION_MOVEMENT_MOVE; + MovementTreeState state; Entity parent; @@ -84,9 +88,9 @@ public class GroundMovementTree { Actor entityActor = EntityUtils.getActor(parent); // Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent)); Vector3d position = EntityUtils.getPosition(parent); - Vector3f movementVector = CreatureUtils.getMovementVector(parent); + Vector3d movementVector = CreatureUtils.getMovementVector(parent); // float movementYaw = CameraEntityUtils.getCameraYaw(Globals.playerCamera); - Quaternionf movementQuaternion = new Quaternionf().rotationTo(new Vector3f(0,0,1), movementVector).normalize(); + Quaternionf movementQuaternion = new Quaternionf().rotationTo(new Vector3f(0,0,1), new Vector3f((float)movementVector.x,(float)movementVector.y,(float)movementVector.z)).normalize(); Quaternionf rotation = EntityUtils.getRotation(parent); Vector3d newPosition; @@ -145,7 +149,7 @@ public class GroundMovementTree { } else if(position.distance(message.getpositionX(),message.getpositionY(),message.getpositionZ()) > STATE_DIFFERENCE_SOFT_UPDATE_THRESHOLD){ EntityUtils.getPosition(parent).add(new Vector3d(message.getpositionX(),message.getpositionY(),message.getpositionZ()).mul(SOFT_UPDATE_MULTIPLIER)); } - CreatureUtils.setMovementVector(parent, new Vector3f(message.getrotationX(),message.getrotationY(),message.getrotationZ())); + CreatureUtils.setMovementVector(parent, new Vector3d(message.getrotationX(),message.getrotationY(),message.getrotationZ())); // EntityUtils.getEntityRotation(parent).set(message.getrotationX(), message.getrotationY(), message.getrotationZ(), message.getrotationW()).normalize(); // velocity = message.getvelocity(); break; @@ -161,8 +165,8 @@ public class GroundMovementTree { velocity = velocity + acceleration * Main.deltaTime; CreatureUtils.setVelocity(parent, velocity); if(entityActor != null){ - if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(Animation.ANIMATION_MOVEMENT_STARTUP)){ - entityActor.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP); + if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(animationStartUp)){ + entityActor.playAnimation(animationStartUp); entityActor.incrementAnimationTime(0.01); } } @@ -238,8 +242,8 @@ public class GroundMovementTree { //check if can restart animation //if yes, restart animation if(entityActor != null){ - if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(Animation.ANIMATION_MOVEMENT_MOVE)){ - entityActor.playAnimation(Animation.ANIMATION_MOVEMENT_MOVE); + if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(animationMain)){ + entityActor.playAnimation(animationMain); entityActor.incrementAnimationTime(0.01); } } @@ -310,8 +314,8 @@ public class GroundMovementTree { velocity = velocity - acceleration * Main.deltaTime; CreatureUtils.setVelocity(parent, velocity); if(entityActor != null){ - if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(Animation.ANIMATION_MOVEMENT_STARTUP)){ - entityActor.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP); + if(!entityActor.isPlayingAnimation() || !entityActor.getCurrentAnimation().equals(animationSlowDown)){ + entityActor.playAnimation(animationSlowDown); entityActor.incrementAnimationTime(0.01); } } @@ -321,7 +325,7 @@ public class GroundMovementTree { state = MovementTreeState.IDLE; } // body.applyCentralForce(PhysicsUtils.jomlToVecmathVector3f(new Vector3f(movementVector).mul(-1.0f).normalize().mul(velocity))); - EntityUtils.getRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector); + EntityUtils.getRotation(parent).rotationTo(new Vector3f(0,0,1), new Vector3f((float)movementVector.x,(float)movementVector.y,(float)movementVector.z)); //move the entity // newPosition = new Vector3d(position).add(new Vector3d(movementVector).mul(velocity).mul(Main.deltaTime)); // if(!Globals.collisionEngine.checkCanOccupyPosition(Globals.commonWorldData, parent, newPosition)){ @@ -329,7 +333,7 @@ public class GroundMovementTree { // } collidable.addImpulse(new Impulse(new Vector3d(movementVector), velocity * Main.deltaTime, "movement")); // position.set(newPosition); - rotation.rotationTo(new Vector3f(0,0,1), movementVector); + rotation.rotationTo(new Vector3f(0,0,1), new Vector3f((float)movementVector.x,(float)movementVector.y,(float)movementVector.z)); activateGravityTree(); @@ -409,5 +413,17 @@ public class GroundMovementTree { tree.start(); } } + + public void setAnimationStartUp(String animationStartUp) { + this.animationStartUp = animationStartUp; + } + + public void setAnimationMain(String animationMain) { + this.animationMain = animationMain; + } + + public void setAnimationSlowDown(String animationSlowDown) { + this.animationSlowDown = animationSlowDown; + } } diff --git a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java index 43a45413..c86ec0db 100644 --- a/src/main/java/electrosphere/entity/types/attach/AttachUtils.java +++ b/src/main/java/electrosphere/entity/types/attach/AttachUtils.java @@ -53,8 +53,8 @@ public class AttachUtils { //set rotation // Quaternionf rotation = parentActor.getBoneRotation(targetBone); // EntityUtils.getRotation(currentEntity).set(rotation).normalize(); - Vector3f facingAngle = CreatureUtils.getMovementVector(parent); - EntityUtils.getRotation(currentEntity).rotationTo(new Vector3f(0,0,1), facingAngle).mul(parentActor.getBoneRotation(targetBone)).normalize(); + Vector3d facingAngle = CreatureUtils.getMovementVector(parent); + EntityUtils.getRotation(currentEntity).rotationTo(new Vector3f(0,0,1), new Vector3f((float)facingAngle.x,(float)facingAngle.y,(float)facingAngle.z)).mul(parentActor.getBoneRotation(targetBone)).normalize(); } } } diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index 4a6e2516..6db8b4dc 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -94,7 +94,17 @@ public class CreatureUtils { for(MovementSystem movementSystem : rawType.getMovementSystems()){ switch(movementSystem.getType()){ case "GROUND": - rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_BT, new GroundMovementTree(rVal,CollisionObjUtils.getCollidable(rVal))); + GroundMovementTree moveTree = new GroundMovementTree(rVal,CollisionObjUtils.getCollidable(rVal)); + if(movementSystem.getAnimationStartup() != null){ + moveTree.setAnimationStartUp(movementSystem.getAnimationStartup().getName()); + } + if(movementSystem.getAnimationLoop() != null){ + moveTree.setAnimationMain(movementSystem.getAnimationLoop().getName()); + } + if(movementSystem.getAnimationWindDown()!= null){ + moveTree.setAnimationSlowDown(movementSystem.getAnimationWindDown().getName()); + } + rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_BT, moveTree); rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR, new Vector3f(0,0,0)); rVal.putData(EntityDataStrings.DATA_STRING_MAX_NATURAL_VELOCITY, movementSystem.getMaxVelocity()); rVal.putData(EntityDataStrings.DATA_STRING_ACCELERATION, movementSystem.getAcceleration()); @@ -146,7 +156,7 @@ public class CreatureUtils { Globals.entityManager.registerCreatureEntity(rVal); rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE, true); rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, type); - rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR, new Vector3f(0,0,1)); + rVal.putData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR, new Vector3d(0,0,1)); rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true); return rVal; } @@ -163,12 +173,12 @@ public class CreatureUtils { } } - public static void setMovementVector(Entity e, Vector3f vector){ + public static void setMovementVector(Entity e, Vector3d vector){ e.putData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR, vector); } - public static Vector3f getMovementVector(Entity e){ - return (Vector3f)e.getData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR); + public static Vector3d getMovementVector(Entity e){ + return (Vector3d)e.getData(EntityDataStrings.DATA_STRING_MOVEMENT_VECTOR); } public static float getAcceleration(Entity e){ diff --git a/src/main/java/electrosphere/game/data/creature/type/Animation.java b/src/main/java/electrosphere/game/data/creature/type/Animation.java new file mode 100644 index 00000000..6d341f68 --- /dev/null +++ b/src/main/java/electrosphere/game/data/creature/type/Animation.java @@ -0,0 +1,25 @@ +package electrosphere.game.data.creature.type; + +/** + * + * @author amaterasu + */ +public class Animation { + + String name; + int length; + boolean loops; + + public String getName() { + return name; + } + + public int getLength() { + return length; + } + + public boolean isLoops() { + return loops; + } + +} diff --git a/src/main/java/electrosphere/game/data/creature/type/MovementSystem.java b/src/main/java/electrosphere/game/data/creature/type/MovementSystem.java index ef3cc0b6..baa601c6 100644 --- a/src/main/java/electrosphere/game/data/creature/type/MovementSystem.java +++ b/src/main/java/electrosphere/game/data/creature/type/MovementSystem.java @@ -4,7 +4,10 @@ public class MovementSystem { String type; float acceleration; float maxVelocity; - + Animation animationStartup; + Animation animationLoop; + Animation animationWindDown; + public String getType() { return type; } @@ -16,6 +19,18 @@ public class MovementSystem { public float getMaxVelocity() { return maxVelocity; } + + public Animation getAnimationStartup() { + return animationStartup; + } + + public Animation getAnimationLoop() { + return animationLoop; + } + + public Animation getAnimationWindDown() { + return animationWindDown; + } } diff --git a/src/main/java/electrosphere/game/server/ai/creature/MillAbout.java b/src/main/java/electrosphere/game/server/ai/creature/MillAbout.java new file mode 100644 index 00000000..1e6a9b1e --- /dev/null +++ b/src/main/java/electrosphere/game/server/ai/creature/MillAbout.java @@ -0,0 +1,162 @@ +package electrosphere.game.server.ai.creature; + +import electrosphere.entity.Entity; +import electrosphere.entity.EntityUtils; +import electrosphere.entity.state.movement.GroundMovementTree; +import electrosphere.entity.types.creature.CreatureUtils; +import electrosphere.game.server.ai.AI; +import electrosphere.main.Globals; +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 = 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.setMovementVector(character, new Vector3d((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(); + } + } else { + GroundMovementTree characterMoveTree = CreatureUtils.getEntityMovementTree(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; +// } +// } +// } +// } + +} diff --git a/src/main/java/electrosphere/game/server/ai/creature/MindlessAttacker.java b/src/main/java/electrosphere/game/server/ai/creature/MindlessAttacker.java index 93dfd31b..38c66ef6 100644 --- a/src/main/java/electrosphere/game/server/ai/creature/MindlessAttacker.java +++ b/src/main/java/electrosphere/game/server/ai/creature/MindlessAttacker.java @@ -69,7 +69,7 @@ public class MindlessAttacker extends AI{ 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)); + CreatureUtils.setMovementVector(character, new Vector3d((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(); diff --git a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java index 7af4dcaa..5d768988 100644 --- a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java +++ b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java @@ -29,7 +29,7 @@ public class ServerTerrainChunk { long[][] randomizer = new long[5][5]; float[][] heightmap = new float[width + 1][width + 1]; ServerTerrainChunk rVal = new ServerTerrainChunk(x, y, heightmap, macroValues, randomizer); - rVal.addModification(new TerrainModification(x, y, 3, 3, 5)); +// rVal.addModification(new TerrainModification(x, y, 3, 3, 5)); return rVal; } diff --git a/src/main/java/electrosphere/game/server/unit/UnitUtils.java b/src/main/java/electrosphere/game/server/unit/UnitUtils.java new file mode 100644 index 00000000..712c02c8 --- /dev/null +++ b/src/main/java/electrosphere/game/server/unit/UnitUtils.java @@ -0,0 +1,30 @@ +package electrosphere.game.server.unit; + +import electrosphere.entity.Entity; +import electrosphere.entity.EntityUtils; +import electrosphere.entity.types.attach.AttachUtils; +import electrosphere.entity.types.collision.CollisionObjUtils; +import electrosphere.entity.types.creature.CreatureUtils; +import electrosphere.entity.types.item.ItemUtils; +import electrosphere.game.server.ai.creature.MillAbout; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class UnitUtils { + + public static void spawnTextGoblin(float posX, float posY, float posZ){ + Entity goblin = CreatureUtils.spawnBasicCreature("Goblin"); + CollisionObjUtils.positionCharacter(goblin, new Vector3f(posX, posY, posZ)); + EntityUtils.getScale(goblin).set(0.005f); + //give evil goblin sword + Entity goblinSword = ItemUtils.spawnBasicItem("Katana"); + AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031"); + //attach ai to evil goblin + MillAbout.attachToCreature(goblin); +// MindlessAttacker.attachToCreature(goblin); + } + +} diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 112b24ac..684cfb11 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -173,9 +173,9 @@ public class Main { //uncomment to test loading a model into engine // if(1==1){ -// Globals.assetManager.addModelPathToQueue("/Models/arrow1.fbx"); +// Globals.assetManager.addModelPathToQueue("/Models/goblin1.fbx"); // Globals.assetManager.loadAssetsInQueue(); -// Model bowModel = Globals.assetManager.fetchModel("/Models/arrow1.fbx"); +// Model bowModel = Globals.assetManager.fetchModel("/Models/goblin1.fbx"); // bowModel.describeHighLevel(); // System.exit(0); // } diff --git a/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java b/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java index ae6be29b..a06159fc 100644 --- a/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java @@ -27,10 +27,10 @@ public class EntityMessage extends NetworkMessage { double positionY; double positionZ; float rotationW; - float rotationX; - float rotationY; - float rotationZ; - float velocity; + double rotationX; + double rotationY; + double rotationZ; + double velocity; int treeState; int propertyType; int propertyValue; @@ -105,35 +105,35 @@ public class EntityMessage extends NetworkMessage { this.rotationW = rotationW; } - public float getrotationX() { + public double getrotationX() { return rotationX; } - public void setrotationX(float rotationX) { + public void setrotationX(double rotationX) { this.rotationX = rotationX; } - public float getrotationY() { + public double getrotationY() { return rotationY; } - public void setrotationY(float rotationY) { + public void setrotationY(double rotationY) { this.rotationY = rotationY; } - public float getrotationZ() { + public double getrotationZ() { return rotationZ; } - public void setrotationZ(float rotationZ) { + public void setrotationZ(double rotationZ) { this.rotationZ = rotationZ; } - public float getvelocity() { + public double getvelocity() { return velocity; } - public void setvelocity(float velocity) { + public void setvelocity(double velocity) { this.velocity = velocity; } @@ -349,13 +349,13 @@ public class EntityMessage extends NetworkMessage { stripPacketHeader(byteStream); rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream)); rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream)); - rVal.setrotationX(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationY(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationZ(ByteStreamUtils.popFloatFromByteQueue(byteStream)); + rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); return rVal; } - public static EntityMessage constructsetFacingMessage(int entityID,long time,float rotationX,float rotationY,float rotationZ){ + public static EntityMessage constructsetFacingMessage(int entityID,long time,double rotationX,double rotationY,double rotationZ){ EntityMessage rVal = new EntityMessage(EntityMessageType.SETFACING); rVal.setentityID(entityID); rVal.settime(time); @@ -374,15 +374,15 @@ public class EntityMessage extends NetworkMessage { rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); - rVal.setrotationX(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationY(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationZ(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setvelocity(ByteStreamUtils.popFloatFromByteQueue(byteStream)); + rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setvelocity(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.settreeState(ByteStreamUtils.popIntFromByteQueue(byteStream)); return rVal; } - public static EntityMessage constructmoveUpdateMessage(int entityID,long time,double positionX,double positionY,double positionZ,float rotationX,float rotationY,float rotationZ,float velocity,int treeState){ + public static EntityMessage constructmoveUpdateMessage(int entityID,long time,double positionX,double positionY,double positionZ,double rotationX,double rotationY,double rotationZ,double velocity,int treeState){ EntityMessage rVal = new EntityMessage(EntityMessageType.MOVEUPDATE); rVal.setentityID(entityID); rVal.settime(time); @@ -406,15 +406,15 @@ public class EntityMessage extends NetworkMessage { rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); - rVal.setrotationX(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationY(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setrotationZ(ByteStreamUtils.popFloatFromByteQueue(byteStream)); - rVal.setvelocity(ByteStreamUtils.popFloatFromByteQueue(byteStream)); + rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); + rVal.setvelocity(ByteStreamUtils.popDoubleFromByteQueue(byteStream)); rVal.settreeState(ByteStreamUtils.popIntFromByteQueue(byteStream)); return rVal; } - public static EntityMessage constructattackUpdateMessage(int entityID,long time,double positionX,double positionY,double positionZ,float rotationX,float rotationY,float rotationZ,float velocity,int treeState){ + public static EntityMessage constructattackUpdateMessage(int entityID,long time,double positionX,double positionY,double positionZ,double rotationX,double rotationY,double rotationZ,double velocity,int treeState){ EntityMessage rVal = new EntityMessage(EntityMessageType.ATTACKUPDATE); rVal.setentityID(entityID); rVal.settime(time); @@ -617,7 +617,7 @@ public class EntityMessage extends NetworkMessage { } break; case SETFACING: - rawBytes = new byte[2+4+8+4+4+4]; + rawBytes = new byte[2+4+8+8+8+8]; //message header rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY; //entity messaage header @@ -630,18 +630,21 @@ public class EntityMessage extends NetworkMessage { for(int i = 0; i < 8; i++){ rawBytes[6+i] = intValues[i]; } - intValues = ByteStreamUtils.serializeFloatToBytes(rotationX); - for(int i = 0; i < 4; i++){ + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationX); + for(int i = 0; i < 8; i++){ rawBytes[14+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationY); - for(int i = 0; i < 4; i++){ - rawBytes[18+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationZ); - for(int i = 0; i < 4; i++){ + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationY); + for(int i = 0; i < 8; i++){ rawBytes[22+i] = intValues[i]; - } break; + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationZ); + for(int i = 0; i < 8; i++){ + rawBytes[30+i] = intValues[i]; + } + break; case MOVEUPDATE: - rawBytes = new byte[2+4+8+8+8+8+4+4+4+4+4]; + rawBytes = new byte[2+4+8+8+8+8+8+8+8+8+4]; //message header rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY; //entity messaage header @@ -666,25 +669,29 @@ public class EntityMessage extends NetworkMessage { for(int i = 0; i < 8; i++){ rawBytes[30+i] = intValues[i]; } - intValues = ByteStreamUtils.serializeFloatToBytes(rotationX); - for(int i = 0; i < 4; i++){ + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationX); + for(int i = 0; i < 8; i++){ rawBytes[38+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationY); - for(int i = 0; i < 4; i++){ - rawBytes[42+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationZ); - for(int i = 0; i < 4; i++){ + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationY); + for(int i = 0; i < 8; i++){ rawBytes[46+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(velocity); - for(int i = 0; i < 4; i++){ - rawBytes[50+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeIntToBytes(treeState); - for(int i = 0; i < 4; i++){ + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationZ); + for(int i = 0; i < 8; i++){ rawBytes[54+i] = intValues[i]; } + intValues = ByteStreamUtils.serializeDoubleToBytes(velocity); + for(int i = 0; i < 8; i++){ + rawBytes[62+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(treeState); + for(int i = 0; i < 4; i++){ + rawBytes[70+i] = intValues[i]; + } break; case ATTACKUPDATE: - rawBytes = new byte[2+4+8+8+8+8+4+4+4+4+4]; + rawBytes = new byte[2+4+8+8+8+8+8+8+8+8+4]; //message header rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY; //entity messaage header @@ -709,22 +716,26 @@ public class EntityMessage extends NetworkMessage { for(int i = 0; i < 8; i++){ rawBytes[30+i] = intValues[i]; } - intValues = ByteStreamUtils.serializeFloatToBytes(rotationX); - for(int i = 0; i < 4; i++){ + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationX); + for(int i = 0; i < 8; i++){ rawBytes[38+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationY); - for(int i = 0; i < 4; i++){ - rawBytes[42+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(rotationZ); - for(int i = 0; i < 4; i++){ + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationY); + for(int i = 0; i < 8; i++){ rawBytes[46+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeFloatToBytes(velocity); - for(int i = 0; i < 4; i++){ - rawBytes[50+i] = intValues[i]; - } intValues = ByteStreamUtils.serializeIntToBytes(treeState); - for(int i = 0; i < 4; i++){ + } + intValues = ByteStreamUtils.serializeDoubleToBytes(rotationZ); + for(int i = 0; i < 8; i++){ rawBytes[54+i] = intValues[i]; } + intValues = ByteStreamUtils.serializeDoubleToBytes(velocity); + for(int i = 0; i < 8; i++){ + rawBytes[62+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(treeState); + for(int i = 0; i < 4; i++){ + rawBytes[70+i] = intValues[i]; + } break; case MOVE: rawBytes = new byte[2+4+8+8+8+8]; diff --git a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java index c4957939..b5007a50 100644 --- a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java +++ b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java @@ -64,9 +64,9 @@ Message categories Entity packet sizes */ public static final byte ENTITY_MESSAGE_TYPE_SETPOSITION_SIZE = 38; - public static final byte ENTITY_MESSAGE_TYPE_SETFACING_SIZE = 26; - public static final byte ENTITY_MESSAGE_TYPE_MOVEUPDATE_SIZE = 58; - public static final byte ENTITY_MESSAGE_TYPE_ATTACKUPDATE_SIZE = 58; + public static final byte ENTITY_MESSAGE_TYPE_SETFACING_SIZE = 38; + public static final byte ENTITY_MESSAGE_TYPE_MOVEUPDATE_SIZE = 74; + public static final byte ENTITY_MESSAGE_TYPE_ATTACKUPDATE_SIZE = 74; public static final byte ENTITY_MESSAGE_TYPE_MOVE_SIZE = 38; public static final byte ENTITY_MESSAGE_TYPE_DESTROY_SIZE = 6; public static final byte ENTITY_MESSAGE_TYPE_SETBEHAVIORTREE_SIZE = 22; diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index 4aa56d50..99c654bf 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -97,7 +97,7 @@ public class ServerConnectionHandler implements Runnable { Player newPlayerObject = new Player(this); Globals.playerManager.addPlayer(newPlayerObject); //spawn player in world - Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature("Human"); + Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature("Goblin"); playerCharacterID = newPlayerCharacter.getId(); CollisionObjUtils.positionCharacter(newPlayerCharacter, new Vector3f(Globals.spawnPoint.x,Globals.spawnPoint.y,Globals.spawnPoint.z)); //attach player object to player character diff --git a/src/main/java/electrosphere/renderer/Model.java b/src/main/java/electrosphere/renderer/Model.java index 0dea7646..99ad30cd 100644 --- a/src/main/java/electrosphere/renderer/Model.java +++ b/src/main/java/electrosphere/renderer/Model.java @@ -208,6 +208,11 @@ public class Model { } } if(currentAnimation != null){ +// if(s.contains("Walk")){ +// currentAnimation.describeAnimation(); +//// currentAnimation.fullDescribeAnimation(); +// System.exit(0); +// } currentAnimation.timeCurrent = 0; Iterator channelIterator = currentAnimation.channels.iterator(); while(channelIterator.hasNext()){ diff --git a/template.json b/template.json index e15d18c1..4961e107 100644 --- a/template.json +++ b/template.json @@ -495,19 +495,19 @@ }, { "name" : "rotationX", - "type" : "FIXED_FLOAT" + "type" : "FIXED_DOUBLE" }, { "name" : "rotationY", - "type" : "FIXED_FLOAT" + "type" : "FIXED_DOUBLE" }, { "name" : "rotationZ", - "type" : "FIXED_FLOAT" + "type" : "FIXED_DOUBLE" }, { "name" : "velocity", - "type" : "FIXED_FLOAT" + "type" : "FIXED_DOUBLE" }, { "name" : "treeState",