First working version of proper networking
This commit is contained in:
parent
631bdea776
commit
c0b0362e71
19
pom.xml
19
pom.xml
@ -108,6 +108,13 @@
|
||||
<artifactId>TerrainGen</artifactId>
|
||||
<version>0.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>electrosphere</groupId>
|
||||
<artifactId>RendererNetworkParser</artifactId>
|
||||
<version>0.1</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
@ -160,13 +167,23 @@
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>main.Main</mainClass>
|
||||
<addClasspath>true</addClasspath>
|
||||
<mainClass>electrosphere.main.Main</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>assemble-all</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
@ -19,7 +19,7 @@ import java.util.logging.Logger;
|
||||
public class MainConfig {
|
||||
|
||||
//localconfig.json version
|
||||
public static final int CONFIG_FILE_VERSION = 2;
|
||||
public static final int CONFIG_FILE_VERSION = 4;
|
||||
//physical file version
|
||||
public int version;
|
||||
|
||||
@ -32,7 +32,8 @@ public class MainConfig {
|
||||
//
|
||||
//should we run a server at all?
|
||||
public boolean runServer;
|
||||
|
||||
public boolean runClient;
|
||||
public String serverAddress;
|
||||
|
||||
//
|
||||
//Rendering related
|
||||
@ -82,6 +83,12 @@ public class MainConfig {
|
||||
} else {
|
||||
Globals.mainConfig.runServer = false;
|
||||
}
|
||||
System.out.println("Would you like to run the client?(1-y/0-n)");
|
||||
if(scan.nextInt() == 1){
|
||||
Globals.mainConfig.runClient = true;
|
||||
} else {
|
||||
Globals.mainConfig.runClient = false;
|
||||
}
|
||||
System.out.println("Would you like to run the renderer?(1-y/0-n)");
|
||||
if(scan.nextInt() == 1){
|
||||
Globals.mainConfig.runRenderer = true;
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
package electrosphere.controls;
|
||||
|
||||
import electrosphere.entity.CameraEntityUtils;
|
||||
import electrosphere.entity.CreatureUtils;
|
||||
import electrosphere.entity.EntityUtil;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.MovementTree;
|
||||
import electrosphere.entity.state.MovementTree.MovementTreeState;
|
||||
import electrosphere.main.Globals;
|
||||
import static electrosphere.main.Main.camera_Current;
|
||||
import electrosphere.net.client.ClientNetworkMessage;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
import electrosphere.util.Utilities;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -68,86 +70,97 @@ public class ControlHandler {
|
||||
|
||||
|
||||
public void pollControls(){
|
||||
MovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
|
||||
/*
|
||||
Move forward
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
if(Globals.playerCharacter != null){
|
||||
MovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
|
||||
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
|
||||
/*
|
||||
Move forward
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, true);
|
||||
Vector3f position = EntityUtils.getEntityPosition(Globals.playerCharacter);
|
||||
EntityMessage outgoingMessage = EntityMessage.constructMoveMessage(
|
||||
Globals.playerCharacter.getId(),
|
||||
position.x,
|
||||
position.y,
|
||||
position.z
|
||||
);
|
||||
Globals.clientConnection.queueOutgoingMessage(outgoingMessage);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, false);
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, false);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Move backward
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(camera_Current.pos_Center.x,0,camera_Current.pos_Center.z).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
/*
|
||||
Move backward
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(cameraEyeVector.x,0,cameraEyeVector.z).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, false);
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD, false);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Move left
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).rotateY((float)(90 * Math.PI / 180)).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
/*
|
||||
Move left
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(90 * Math.PI / 180)).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, false);
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT, false);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Move right
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-camera_Current.pos_Center.x,0,-camera_Current.pos_Center.z).rotateY((float)(-90 * Math.PI / 180)).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
/*
|
||||
Move right
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)){
|
||||
if(glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT)) == GLFW_PRESS){
|
||||
CreatureUtils.setMovementVector(Globals.playerCharacter, new Vector3f(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY((float)(-90 * Math.PI / 180)).normalize());
|
||||
if(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN){
|
||||
movementTree.start();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, false);
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, true);
|
||||
} else {
|
||||
if(controlsState.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT) == true){
|
||||
movementTree.slowdown();
|
||||
}
|
||||
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT, false);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Move up
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP)) == GLFW_PRESS){
|
||||
EntityUtil.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,0.6f,0).mul(1f));
|
||||
}
|
||||
/*
|
||||
Move down
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FALL) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FALL)) == GLFW_PRESS){
|
||||
EntityUtil.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,-0.6f,0).mul(1f));
|
||||
/*
|
||||
Move up
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP)) == GLFW_PRESS){
|
||||
EntityUtils.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,0.6f,0).mul(1f));
|
||||
}
|
||||
/*
|
||||
Move down
|
||||
*/
|
||||
if(controlsMap.containsKey(DATA_STRING_INPUT_CODE_MOVEMENT_FALL) && glfwGetKey(Globals.window, controlsMap.get(DATA_STRING_INPUT_CODE_MOVEMENT_FALL)) == GLFW_PRESS){
|
||||
EntityUtils.getEntityPosition(Globals.playerCharacter).add(new Vector3f(0,-0.6f,0).mul(1f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package electrosphere.entity;
|
||||
|
||||
import electrosphere.main.Globals;
|
||||
import org.joml.Matrix4f;
|
||||
import org.joml.Quaternionf;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
@ -11,19 +12,21 @@ import org.joml.Vector3f;
|
||||
public class CameraEntityUtils {
|
||||
|
||||
|
||||
public static Entity spawnBasicCameraEntity(Vector3f position){
|
||||
public static Entity spawnBasicCameraEntity(Vector3f center, Vector3f eye){
|
||||
Entity rVal = new Entity();
|
||||
Globals.entityManager.registerEntity(rVal);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_BASIC);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
|
||||
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_EYE, eye);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static Entity spawnOrbitalCameraEntity(Entity target, float distance){
|
||||
public static Entity spawnPointTrackingCameraEntity(Vector3f center, Vector3f eye){
|
||||
Entity rVal = new Entity();
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_ORBIT);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_ORBIT_TARGET, target);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_POSITION, new Vector3f(0,0,0));
|
||||
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_ROTATION, new Quaternionf());
|
||||
Globals.entityManager.registerEntity(rVal);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_TYPE, EntityDataStrings.DATA_STRING_CAMERA_TYPE_ORBIT);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
|
||||
rVal.putData(EntityDataStrings .DATA_STRING_CAMERA_EYE, eye);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
@ -35,20 +38,20 @@ public class CameraEntityUtils {
|
||||
return (float)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_ORBIT_DISTANCE);
|
||||
}
|
||||
|
||||
public static void setCameraPosition(Entity camera, Vector3f position){
|
||||
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_POSITION, position);
|
||||
public static void setCameraCenter(Entity camera, Vector3f center){
|
||||
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_CENTER, center);
|
||||
}
|
||||
|
||||
public static Vector3f getCameraPosition(Entity camera){
|
||||
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_POSITION);
|
||||
public static Vector3f getCameraCenter(Entity camera){
|
||||
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_CENTER);
|
||||
}
|
||||
|
||||
public static void setCameraRotation(Entity camera, Quaternionf rotation){
|
||||
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_ROTATION, rotation);
|
||||
public static void setCameraEye(Entity camera, Vector3f eye){
|
||||
camera.putData(EntityDataStrings.DATA_STRING_CAMERA_EYE, eye);
|
||||
}
|
||||
|
||||
public static Quaternionf getCameraRotation(Entity camera){
|
||||
return (Quaternionf)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_ROTATION);
|
||||
public static Vector3f getCameraEye(Entity camera){
|
||||
return (Vector3f)camera.getData(EntityDataStrings.DATA_STRING_CAMERA_EYE);
|
||||
}
|
||||
|
||||
public static void destroyCameraEntity(Entity e){
|
||||
@ -57,4 +60,13 @@ public class CameraEntityUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static Matrix4f getCameraViewMatrix(Vector3f cameraEye){
|
||||
Matrix4f rVal = new Matrix4f().setLookAt(
|
||||
cameraEye, //eye
|
||||
new Vector3f(0,0,0), //center
|
||||
new Vector3f(cameraEye).add(new Vector3f(0,1.0f,0)) // up
|
||||
).scale(1.0f, 1.5f, 1.0f);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -2,7 +2,10 @@ package electrosphere.entity;
|
||||
|
||||
import electrosphere.entity.state.MovementTree;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
import electrosphere.renderer.Model;
|
||||
import electrosphere.util.ModelLoader;
|
||||
import org.joml.Quaternionf;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
@ -11,9 +14,12 @@ import org.joml.Vector3f;
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class CreatureUtils {
|
||||
public static Entity spawnBasicControllableEntity(Model m, float acceleration, float maxVelocity){
|
||||
public static Entity spawnBasicCreature(int creatureId, float acceleration, float maxVelocity){
|
||||
Entity rVal = new Entity();
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_MODEL, m);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE, true);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_MODEL_PATH, Globals.entityTypeMap.get(creatureId).getModelPath());
|
||||
Globals.assetManager.addModelPathToQueue(Globals.entityTypeMap.get(creatureId).getModelPath());
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_CREATURE_TYPE, creatureId);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, new Vector3f(0,0,0));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().rotateAxis((float)0, new Vector3f(1,0,0)));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
||||
@ -63,4 +69,28 @@ public class CreatureUtils {
|
||||
public static MovementTree getEntityMovementTree(Entity e){
|
||||
return (MovementTree)e.getData(EntityDataStrings.DATA_STRING_MOVEMENT_BT);
|
||||
}
|
||||
|
||||
public static void attachEntityMessageToMovementTree(Entity e, EntityMessage em){
|
||||
getEntityMovementTree(e).addNetworkMessage(em);
|
||||
}
|
||||
|
||||
public static int getCreatureType(Entity e){
|
||||
return (int)e.getData(EntityDataStrings.DATA_STRING_CREATURE_TYPE);
|
||||
}
|
||||
|
||||
public static int getControllerPlayerId(Entity e){
|
||||
return (int)e.getData(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID);
|
||||
}
|
||||
|
||||
public static void setControllerPlayerId(Entity e, int id){
|
||||
e.putData(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID, id);
|
||||
}
|
||||
|
||||
public static boolean hasControllerPlayerId(Entity e){
|
||||
return e.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID);
|
||||
}
|
||||
|
||||
public static boolean isCreature(Entity e){
|
||||
return e.getDataKeys().contains(EntityDataStrings.DATA_STRING_CREATURE_IS_CREATURE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,6 +26,10 @@ public class Entity {
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id){
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
// HashMap<String, Object> getData() {
|
||||
// return data;
|
||||
|
||||
@ -12,12 +12,15 @@ public class EntityDataStrings {
|
||||
public static final String DATA_STRING_POSITION = "position";
|
||||
public static final String DATA_STRING_ROTATION = "rotation";
|
||||
public static final String DATA_STRING_SCALE = "scale";
|
||||
public static final String DATA_STRING_MODEL = "model";
|
||||
public static final String DATA_STRING_MODEL_PATH = "modelPath";
|
||||
|
||||
|
||||
/*
|
||||
Moveable Entity
|
||||
Creature Entity
|
||||
*/
|
||||
public static final String DATA_STRING_CREATURE_IS_CREATURE = "isCreature";
|
||||
public static final String DATA_STRING_CREATURE_TYPE = "creatureType";
|
||||
public static final String DATA_STRING_CREATURE_CONTROLLER_PLAYER_ID = "creaturePlayerId";
|
||||
public static final String DATA_STRING_MOVEMENT_BT = "movementBT";
|
||||
public static final String DATA_STRING_MOVEMENT_VECTOR = "movementVector";
|
||||
public static final String DATA_STRING_VELOCITY = "velocity";
|
||||
@ -29,9 +32,10 @@ public class EntityDataStrings {
|
||||
*/
|
||||
|
||||
public static final String DATA_STRING_CAMERA_TYPE = "cameraType";
|
||||
public static final String DATA_STRING_CAMERA_TYPE_BASIC = "cameraTypeBasic";
|
||||
public static final String DATA_STRING_CAMERA_TYPE_ORBIT = "cameraTypeOrbit";
|
||||
public static final String DATA_STRING_CAMERA_POSITION = "cameraPosition";
|
||||
public static final String DATA_STRING_CAMERA_ROTATION = "cameraRotation";
|
||||
public static final String DATA_STRING_CAMERA_EYE = "cameraEye";
|
||||
public static final String DATA_STRING_CAMERA_CENTER = "cameraCenter";
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package electrosphere.entity;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
@ -9,17 +10,18 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
*/
|
||||
public class EntityManager {
|
||||
|
||||
static CopyOnWriteArrayList<Entity> entityList;
|
||||
static CopyOnWriteArrayList<Entity> drawableList;
|
||||
static CopyOnWriteArrayList<Entity> moveableList;
|
||||
|
||||
static ConcurrentHashMap entityIdMap = new ConcurrentHashMap();
|
||||
static CopyOnWriteArrayList<Entity> entityList = new CopyOnWriteArrayList();
|
||||
static CopyOnWriteArrayList<Entity> drawableList = new CopyOnWriteArrayList();
|
||||
static CopyOnWriteArrayList<Entity> moveableList = new CopyOnWriteArrayList();
|
||||
|
||||
public EntityManager(){
|
||||
entityList = new CopyOnWriteArrayList();
|
||||
drawableList = new CopyOnWriteArrayList();
|
||||
moveableList = new CopyOnWriteArrayList();
|
||||
|
||||
}
|
||||
|
||||
public void registerEntity(Entity e){
|
||||
entityIdMap.put(e.getId(), e);
|
||||
entityList.add(e);
|
||||
}
|
||||
|
||||
@ -27,26 +29,38 @@ public class EntityManager {
|
||||
drawableList.add(e);
|
||||
}
|
||||
|
||||
public Iterator<Entity> getDrawableIterator(){
|
||||
return drawableList.iterator();
|
||||
public CopyOnWriteArrayList<Entity> getDrawable(){
|
||||
return drawableList;
|
||||
}
|
||||
|
||||
public void registerMoveableEntity(Entity e){
|
||||
moveableList.add(e);
|
||||
}
|
||||
|
||||
public Iterator<Entity> getMoveableIterator(){
|
||||
return moveableList.iterator();
|
||||
public CopyOnWriteArrayList<Entity> getMoveable(){
|
||||
return moveableList;
|
||||
}
|
||||
|
||||
public void deregisterEntity(Entity e){
|
||||
if(drawableList.contains(e)){
|
||||
drawableList.remove(e);
|
||||
EntityUtil.cleanUpDrawableEntity(e);
|
||||
EntityUtils.cleanUpDrawableEntity(e);
|
||||
}
|
||||
if(entityList.contains(e)){
|
||||
entityList.remove(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void overrideEntityId(Entity e, int id){
|
||||
if(entityIdMap.contains(e.getId())){
|
||||
entityIdMap.remove(e.getId());
|
||||
}
|
||||
e.setId(id);
|
||||
entityIdMap.put(e.getId(), e);
|
||||
}
|
||||
|
||||
public Entity getEntityFromId(int id){
|
||||
return (Entity)entityIdMap.get(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ import org.joml.Vector3f;
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class EntityUtil {
|
||||
public class EntityUtils {
|
||||
|
||||
public static Vector3f getEntityPosition(Entity e){
|
||||
return (Vector3f)e.getData(EntityDataStrings.DATA_STRING_POSITION);
|
||||
@ -29,13 +29,13 @@ public class EntityUtil {
|
||||
return (Vector3f)e.getData(EntityDataStrings.DATA_STRING_SCALE);
|
||||
}
|
||||
|
||||
public static Model getEntityModel(Entity e){
|
||||
return (Model)e.getData(EntityDataStrings.DATA_STRING_MODEL);
|
||||
public static String getEntityModelPath(Entity e){
|
||||
return (String)e.getData(EntityDataStrings.DATA_STRING_MODEL_PATH);
|
||||
}
|
||||
|
||||
public static Entity spawnDrawableEntity(Model m){
|
||||
public static Entity spawnDrawableEntity(String modelPath){
|
||||
Entity rVal = new Entity();
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_MODEL, m);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_MODEL_PATH, modelPath);
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_POSITION, new Vector3f(0,0,0));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, new Quaternionf().rotateAxis((float)0, new Vector3f(1,0,0)));
|
||||
rVal.putData(EntityDataStrings.DATA_STRING_SCALE, new Vector3f(1,1,1));
|
||||
@ -47,7 +47,13 @@ public class EntityUtil {
|
||||
public static void cleanUpDrawableEntity(Entity e){
|
||||
if(e != null){
|
||||
Globals.entityManager.deregisterEntity(e);
|
||||
getEntityModel(e).free();
|
||||
// getEntityModelPath(e).free();
|
||||
}
|
||||
}
|
||||
|
||||
public static void setEntityID(Entity e, int id){
|
||||
Globals.entityManager.overrideEntityId(e, id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -2,10 +2,14 @@ package electrosphere.entity.state;
|
||||
|
||||
import electrosphere.entity.CreatureUtils;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtil;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.net.NetUtils;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
import electrosphere.renderer.Animation;
|
||||
import electrosphere.renderer.Model;
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
/**
|
||||
@ -28,6 +32,8 @@ public class MovementTree {
|
||||
|
||||
Entity parent;
|
||||
|
||||
CopyOnWriteArrayList<EntityMessage> networkMessageQueue = new CopyOnWriteArrayList();
|
||||
|
||||
public MovementTree(Entity e){
|
||||
state = MovementTreeState.IDLE;
|
||||
parent = e;
|
||||
@ -69,18 +75,35 @@ public class MovementTree {
|
||||
float velocity = CreatureUtils.getVelocity(parent);
|
||||
float acceleration = CreatureUtils.getAcceleration(parent);
|
||||
float maxNaturalVelocity = CreatureUtils.getMaxNaturalVelocity(parent);
|
||||
Model entityModel = EntityUtil.getEntityModel(parent);
|
||||
Vector3f position = EntityUtil.getEntityPosition(parent);
|
||||
Model entityModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(parent));
|
||||
Vector3f position = EntityUtils.getEntityPosition(parent);
|
||||
Vector3f movementVector = CreatureUtils.getMovementVector(parent);
|
||||
System.out.println(movementVector);
|
||||
|
||||
//parse attached network messages
|
||||
for(EntityMessage message : networkMessageQueue){
|
||||
networkMessageQueue.remove(message);
|
||||
// System.out.println("MOVE to " + message.getX() + " " + message.getY() + " " + message.getZ());
|
||||
switch(message.getEntityMessageType()){
|
||||
case MOVE:
|
||||
position.set(message.getX(), message.getY(), message.getZ());
|
||||
if(Globals.mainConfig.runServer){
|
||||
Globals.server.broadcastMessage(EntityMessage.constructMoveMessage(parent.getId(), message.getX(), message.getY(), message.getZ()));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//state machine
|
||||
switch(state){
|
||||
case STARTUP:
|
||||
//run startup code
|
||||
velocity = velocity + acceleration;
|
||||
CreatureUtils.setVelocity(parent, velocity);
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
if(entityModel != null){
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
}
|
||||
}
|
||||
//check if can transition state
|
||||
if(velocity >= maxNaturalVelocity){
|
||||
@ -89,29 +112,33 @@ public class MovementTree {
|
||||
}
|
||||
//move the entity
|
||||
position.add(new Vector3f(movementVector).mul(velocity));
|
||||
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
break;
|
||||
case MOVE:
|
||||
//check if can restart animation
|
||||
//if yes, restart animation
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_MOVE)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_MOVE);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
if(entityModel != null){
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_MOVE)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_MOVE);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
}
|
||||
}
|
||||
//check if can move forward (collision engine)
|
||||
//if can, move forward by entity movement stats
|
||||
position.add(new Vector3f(movementVector).mul(velocity));
|
||||
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
break;
|
||||
case SLOWDOWN:
|
||||
//run slowdown code
|
||||
velocity = velocity - acceleration;
|
||||
CreatureUtils.setVelocity(parent, velocity);
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
if(entityModel != null){
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_MOVEMENT_STARTUP)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_MOVEMENT_STARTUP);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
}
|
||||
}
|
||||
//check if can transition state
|
||||
if(velocity <= 0){
|
||||
@ -120,17 +147,25 @@ public class MovementTree {
|
||||
}
|
||||
//move the entity
|
||||
position.add(new Vector3f(movementVector).mul(velocity));
|
||||
position.y = Globals.cellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtil.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
position.y = Globals.drawCellManager.getElevationAtRealPoint(position.x, position.z);
|
||||
EntityUtils.getEntityRotation(parent).rotationTo(new Vector3f(0,0,1), movementVector);
|
||||
break;
|
||||
case IDLE:
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_IDLE_1)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_IDLE_1);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
if(entityModel != null){
|
||||
if(entityModel.currentAnimation == null || !entityModel.currentAnimation.name.equals(Animation.ANIMATION_IDLE_1)){
|
||||
entityModel.playAnimation(Animation.ANIMATION_IDLE_1);
|
||||
entityModel.currentAnimation.incrementTime(0.01);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void addNetworkMessage(EntityMessage networkMessage) {
|
||||
networkMessageQueue.add(networkMessage);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
package electrosphere.entity.types.creature;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class CreatureType {
|
||||
int id;
|
||||
String modelPath;
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getModelPath() {
|
||||
return modelPath;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setModelPath(String modelPath) {
|
||||
this.modelPath = modelPath;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,16 @@
|
||||
package electrosphere.entity.types.creature;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class CreatureTypeList {
|
||||
List<CreatureType> types;
|
||||
|
||||
public List<CreatureType> getTypes() {
|
||||
return types;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,7 +1,7 @@
|
||||
package electrosphere.game.cell;
|
||||
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtil;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.renderer.Model;
|
||||
import electrosphere.renderer.ModelUtils;
|
||||
@ -44,13 +44,14 @@ public class DrawCell {
|
||||
Globals.entityManager.deregisterEntity(modelEntity);
|
||||
}
|
||||
Model terrainModel = ModelUtils.createTerrainModelPrecomputedShader(drawArray, program, stride);
|
||||
modelEntity = EntityUtil.spawnDrawableEntity(terrainModel);
|
||||
String terrainModelPath = Globals.assetManager.registerModel(terrainModel);
|
||||
modelEntity = EntityUtils.spawnDrawableEntity(terrainModelPath);
|
||||
// System.out.println("New cell @ " + cellX * cellWidth + "," + cellY * cellWidth);
|
||||
EntityUtil.getEntityPosition(modelEntity).set(new Vector3f(cellX * cellWidth, 0.01f, cellY * cellWidth));
|
||||
EntityUtils.getEntityPosition(modelEntity).set(new Vector3f(cellX * cellWidth, 0.01f, cellY * cellWidth));
|
||||
}
|
||||
|
||||
public void retireCell(){
|
||||
EntityUtil.cleanUpDrawableEntity(modelEntity);
|
||||
EntityUtils.cleanUpDrawableEntity(modelEntity);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -9,7 +9,7 @@ import org.joml.Vector3f;
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class CellManager {
|
||||
public class DrawCellManager {
|
||||
|
||||
//the terrain manager this cell manager constructs off of
|
||||
TerrainManager terrainManager;
|
||||
@ -36,7 +36,7 @@ public class CellManager {
|
||||
int drawStepdownInterval = 3;
|
||||
int drawStepdownValue = 5;
|
||||
|
||||
public CellManager(TerrainManager terrainManager, float realX, float realY){
|
||||
public DrawCellManager(TerrainManager terrainManager, float realX, float realY){
|
||||
this.terrainManager = terrainManager;
|
||||
this.miniCellWidth = miniCellWidth;
|
||||
cells = new DrawCell[drawRadius * 2 + 1][drawRadius * 2 + 1];
|
||||
@ -0,0 +1,40 @@
|
||||
package electrosphere.game.simcell.entity;
|
||||
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import org.joml.Vector3f;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class EntityCell {
|
||||
int realWorldXStart;
|
||||
int realWorldYStart;
|
||||
int width;
|
||||
|
||||
CopyOnWriteArrayList<Entity> residentEntities = new CopyOnWriteArrayList();
|
||||
|
||||
public boolean containsPoint(Vector3f position){
|
||||
float x = position.x;
|
||||
float z = position.z;
|
||||
return x >=realWorldXStart &&
|
||||
x < realWorldXStart + width &&
|
||||
z >=realWorldYStart &&
|
||||
z < realWorldYStart + width;
|
||||
}
|
||||
|
||||
public CopyOnWriteArrayList<Entity> getResidentEntities(){
|
||||
return residentEntities;
|
||||
}
|
||||
|
||||
public void simulate(){
|
||||
for(Entity entity : residentEntities){
|
||||
if(!containsPoint(EntityUtils.getEntityPosition(entity))){
|
||||
residentEntities.remove(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package electrosphere.game.simcell.physical;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class PhysicalCell {
|
||||
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package electrosphere.game.simcell.virtual;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class VirtualCell {
|
||||
|
||||
}
|
||||
@ -13,8 +13,13 @@ import electrosphere.cfg.MainConfig;
|
||||
import electrosphere.controls.ControlHandler;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityManager;
|
||||
import electrosphere.game.cell.CellManager;
|
||||
import electrosphere.net.client.Connection;
|
||||
import electrosphere.entity.types.creature.CreatureType;
|
||||
import electrosphere.entity.types.creature.CreatureTypeList;
|
||||
import electrosphere.game.cell.DrawCellManager;
|
||||
import electrosphere.game.terrain.TerrainManager;
|
||||
import electrosphere.net.client.ClientNetworking;
|
||||
import electrosphere.net.server.Server;
|
||||
import electrosphere.renderer.assetmanager.AssetManager;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
@ -24,6 +29,8 @@ import java.util.logging.Logger;
|
||||
import org.joml.Matrix4f;
|
||||
import org.joml.Vector3f;
|
||||
import electrosphere.util.ModelLoader;
|
||||
import electrosphere.util.Utilities;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import org.lwjgl.glfw.GLFWErrorCallback;
|
||||
|
||||
@ -43,7 +50,12 @@ public class Globals {
|
||||
//
|
||||
//Client connection to server
|
||||
//
|
||||
public static Connection connection;
|
||||
public static ClientNetworking clientConnection;
|
||||
|
||||
//
|
||||
//Server manager thing
|
||||
//
|
||||
public static Server server;
|
||||
|
||||
|
||||
//
|
||||
@ -52,6 +64,12 @@ public class Globals {
|
||||
public static ControlHandler controlHandler;
|
||||
|
||||
|
||||
//
|
||||
//Entity Types Map
|
||||
//
|
||||
public static HashMap<Integer,CreatureType> entityTypeMap = new HashMap();
|
||||
|
||||
|
||||
|
||||
//
|
||||
//Generic OpenGL Statements
|
||||
@ -83,7 +101,10 @@ public class Globals {
|
||||
|
||||
public static EntityManager entityManager;
|
||||
|
||||
public static Camera cameraVisible;
|
||||
public static TerrainManager terrainManager;
|
||||
|
||||
|
||||
public static AssetManager assetManager;
|
||||
|
||||
//
|
||||
//Game specific models
|
||||
@ -92,7 +113,7 @@ public class Globals {
|
||||
|
||||
//chunk stuff
|
||||
//constant for how far in game units you have to move to load chunks
|
||||
public static CellManager cellManager;
|
||||
public static DrawCellManager drawCellManager;
|
||||
|
||||
|
||||
//famous fuckin last words, but temporary solution
|
||||
@ -100,8 +121,6 @@ public class Globals {
|
||||
public static ArrayList<Vector3f> skyboxColors;
|
||||
|
||||
|
||||
//player's entity
|
||||
|
||||
|
||||
//the player camera entity
|
||||
public static Entity playerCamera;
|
||||
@ -112,6 +131,27 @@ public class Globals {
|
||||
|
||||
|
||||
public static void initGlobals(){
|
||||
|
||||
//load in default texture map
|
||||
Gson gson = new Gson();
|
||||
try {
|
||||
//deserializes the texture map from its default path using gson
|
||||
//also done in one line
|
||||
textureMapDefault = gson.fromJson(Files.newBufferedReader(new File(Thread.currentThread().getContextClassLoader().getResource("Textures/default_texture_map.json").getFile()).toPath()), TextureMap.class); //only the best of coding practices :)
|
||||
} catch (IOException ex) { ex.printStackTrace(); } //TODO: handle better :tm:
|
||||
//entity type map
|
||||
initEntityTypeMap();
|
||||
//create entity manager
|
||||
entityManager = new EntityManager();
|
||||
//init game specific variables
|
||||
initGameSpecifics();
|
||||
//temporary hold for skybox colors
|
||||
skyboxColors = new ArrayList();
|
||||
//load asset manager
|
||||
assetManager = new AssetManager();
|
||||
}
|
||||
|
||||
public static void initDefaultResources(){
|
||||
//create default textures
|
||||
textureDiffuseDefault = new Texture("Textures/default_diffuse.png");
|
||||
textureSpecularDefault = new Texture("Textures/default_specular.png");
|
||||
@ -121,23 +161,15 @@ public class Globals {
|
||||
materialDefault.set_specular(textureSpecularDefault);
|
||||
//create default lights
|
||||
lightDirectionalDefault = new DirectionalLight(new Vector3f(0,-1f,0));
|
||||
//load in default texture map
|
||||
Gson gson = new Gson();
|
||||
try {
|
||||
//deserializes the texture map from its default path using gson
|
||||
//also done in one line
|
||||
textureMapDefault = gson.fromJson(Files.newBufferedReader(new File(Thread.currentThread().getContextClassLoader().getResource("Textures/default_texture_map.json").getFile()).toPath()), TextureMap.class); //only the best of coding practices :)
|
||||
} catch (IOException ex) { ex.printStackTrace(); } //TODO: handle better :tm:
|
||||
//create entity manager
|
||||
entityManager = new EntityManager();
|
||||
//create the camera object that generates view matrix
|
||||
cameraVisible = new Camera();
|
||||
//init game specific variables
|
||||
initGameSpecifics();
|
||||
//temporary hold for skybox colors
|
||||
skyboxColors = new ArrayList();
|
||||
}
|
||||
|
||||
public static void initGameSpecifics(){
|
||||
}
|
||||
|
||||
static void initEntityTypeMap(){
|
||||
CreatureTypeList typeList = Utilities.loadObjectFromJsonFile("/Data/entity_map.json", CreatureTypeList.class);
|
||||
for(CreatureType type : typeList.getTypes()){
|
||||
entityTypeMap.put(type.getId(), type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,11 +12,12 @@ import electrosphere.renderer.RenderUtils;
|
||||
import electrosphere.renderer.ShaderProgram;
|
||||
import electrosphere.renderer.texture.Texture;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtil;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.MovementTree;
|
||||
import electrosphere.game.cell.CellManager;
|
||||
import electrosphere.game.cell.DrawCellManager;
|
||||
import electrosphere.game.terrain.TerrainManager;
|
||||
import electrosphere.net.client.Connection;
|
||||
import electrosphere.net.client.ClientNetworkMessage;
|
||||
import electrosphere.net.client.ClientNetworking;
|
||||
import electrosphere.net.server.Server;
|
||||
import electrosphere.renderer.ModelUtils;
|
||||
import electrosphere.terraingen.TerrainGen;
|
||||
@ -45,6 +46,7 @@ import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.Scanner;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@ -69,7 +71,6 @@ public class Main {
|
||||
public static float lastFrame = 0.0f;
|
||||
//View Controls
|
||||
public static float view_Range = 200000.0f;
|
||||
public static Camera camera_Current = new Camera();
|
||||
/*
|
||||
Mouse Controls
|
||||
*/
|
||||
@ -86,14 +87,6 @@ public class Main {
|
||||
|
||||
|
||||
|
||||
//
|
||||
//Player Object Variables
|
||||
//
|
||||
public static boolean CAMERA_UNDER_USER_CONTROL = false;
|
||||
public static boolean CAMERA_UNDER_FREE_CONTROL = false;
|
||||
public static boolean PLAYER_UNDER_USER_CONTROL = true;
|
||||
public static boolean CAMERA_IS_ORBIT = true;
|
||||
public static float camera_Orbit_Length = 1.0f;
|
||||
|
||||
static int playerStartRealX = 0;
|
||||
static int playerStartRealY = 0;
|
||||
@ -105,8 +98,10 @@ public class Main {
|
||||
|
||||
public static Model model;
|
||||
|
||||
public static int playerId = -1;
|
||||
|
||||
static TerrainManager terrainManager;
|
||||
|
||||
static boolean running = true;
|
||||
|
||||
|
||||
|
||||
@ -120,13 +115,23 @@ public class Main {
|
||||
//
|
||||
//
|
||||
|
||||
//temporary prompt user for stuff
|
||||
Scanner scan = new Scanner(System.in);
|
||||
System.out.println("Run server?");
|
||||
if(scan.nextInt() == 1){
|
||||
Globals.mainConfig.runServer = true;
|
||||
} else {
|
||||
Globals.mainConfig.runServer = false;
|
||||
System.out.println("Address?");
|
||||
Globals.mainConfig.serverAddress = scan.next();
|
||||
}
|
||||
|
||||
//controls
|
||||
initControlHandler();
|
||||
|
||||
//run initialization stuff
|
||||
|
||||
initWorld();
|
||||
|
||||
//init global variables
|
||||
Globals.initGlobals();
|
||||
|
||||
//run initialization stuff
|
||||
initTerrainManager();
|
||||
|
||||
@ -135,13 +140,24 @@ public class Main {
|
||||
RenderUtils.createOpenglContext();
|
||||
}
|
||||
|
||||
//init global variables
|
||||
Globals.initGlobals();
|
||||
|
||||
if(Globals.mainConfig.runRenderer){
|
||||
forkConnection();
|
||||
//start server networking
|
||||
Thread serverThread = null;
|
||||
if(Globals.mainConfig.runServer){
|
||||
Globals.server = new Server(42536);
|
||||
serverThread = new Thread(Globals.server);
|
||||
serverThread.start();
|
||||
}
|
||||
|
||||
//start client networking
|
||||
Thread clientThread = null;
|
||||
if(Globals.mainConfig.runClient){
|
||||
Globals.clientConnection = new ClientNetworking(Globals.mainConfig.serverAddress,42536);
|
||||
clientThread = new Thread(Globals.clientConnection);
|
||||
clientThread.start();
|
||||
}
|
||||
|
||||
//init default resources
|
||||
Globals.initDefaultResources();
|
||||
|
||||
if(Globals.mainConfig.runRenderer){
|
||||
initCellManager();
|
||||
@ -151,21 +167,21 @@ public class Main {
|
||||
|
||||
initPlayer();
|
||||
|
||||
createPlayerCamera();
|
||||
|
||||
|
||||
|
||||
Entity unitCube = EntityUtil.spawnDrawableEntity(ModelUtils.createUnitCube());
|
||||
EntityUtil.getEntityPosition(unitCube).set(playerStartRealX - 0.5f,10,playerStartRealY - 0.5f);
|
||||
// String unitCubeModelPath = Globals.assetManager.registerModel(ModelUtils.createUnitCube());
|
||||
// Entity unitCube = EntityUtils.spawnDrawableEntity(unitCubeModelPath);
|
||||
// EntityUtils.getEntityPosition(unitCube).set(playerStartRealX - 0.5f,10,playerStartRealY - 0.5f);
|
||||
|
||||
RenderUtils.recaptureScreen();
|
||||
|
||||
///
|
||||
/// C A M E R A C R E A T I O N
|
||||
///
|
||||
Camera camera_player_chase = new Camera();
|
||||
Camera cam_Player_Orbit = new Camera();
|
||||
Vector3f cameraRotationVector = new Vector3f();
|
||||
|
||||
|
||||
boolean running = true;
|
||||
|
||||
//main loop
|
||||
while (running) {
|
||||
@ -178,29 +194,24 @@ public class Main {
|
||||
lastFrame = currentFrame;
|
||||
|
||||
|
||||
|
||||
//poll mouse variables and update camera variables
|
||||
updateMouseVariables();
|
||||
|
||||
|
||||
float cam_Player_Orbit_Magnitude = 1f;
|
||||
float cam_Player_Orbit_Offset_Height = 0f;
|
||||
cam_Player_Orbit.pos_Center = new Vector3f(0, 0, 0);
|
||||
cam_Player_Orbit.pos_Center.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cam_Player_Orbit.pos_Center.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cam_Player_Orbit.pos_Center.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cam_Player_Orbit.pos_Center.normalize();
|
||||
// System.out.println(cam_Player_Orbit.pos_Center);
|
||||
///
|
||||
/// A S S E T M A N A G E R S T U F F
|
||||
///
|
||||
Globals.assetManager.loadAssetsInQueue();
|
||||
|
||||
|
||||
|
||||
if(CAMERA_IS_ORBIT){
|
||||
camera_Current = cam_Player_Orbit;
|
||||
|
||||
///
|
||||
/// C L I E N T N E T W O R K I N G S T U F F
|
||||
///
|
||||
//Why is this its own function? Just to get the networking code out of main()
|
||||
if(Globals.mainConfig.runClient){
|
||||
Globals.clientConnection.parseMessages();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///
|
||||
/// I N P U T C O N T R O L S
|
||||
///
|
||||
@ -210,43 +221,59 @@ public class Main {
|
||||
}
|
||||
|
||||
//Poll controls
|
||||
Vector3f oldPlayerCharacterPosition = new Vector3f(EntityUtil.getEntityPosition(Globals.playerCharacter));
|
||||
Vector3f oldPlayerCharacterPosition = new Vector3f();
|
||||
if(Globals.playerCharacter != null){
|
||||
oldPlayerCharacterPosition = new Vector3f(EntityUtils.getEntityPosition(Globals.playerCharacter));
|
||||
}
|
||||
Vector3f newPlayerCharacterPosition = oldPlayerCharacterPosition;
|
||||
Globals.controlHandler.pollControls();
|
||||
|
||||
|
||||
|
||||
///
|
||||
/// C R E A T U R E S I M U L A T I O N T R E E S
|
||||
/// C L I E N T S I M U L A T I O N S T U F F
|
||||
///
|
||||
Iterator<Entity> moveablesIterator = Globals.entityManager.getMoveableIterator();
|
||||
while(moveablesIterator.hasNext()){
|
||||
Entity currentMoveable = moveablesIterator.next();
|
||||
MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable);
|
||||
behaviorTree.simulate();
|
||||
if(Globals.mainConfig.runClient){
|
||||
//simulate creature behavior trees
|
||||
for(Entity currentMoveable : Globals.entityManager.getMoveable()){
|
||||
MovementTree behaviorTree = CreatureUtils.getEntityMovementTree(currentMoveable);
|
||||
behaviorTree.simulate();
|
||||
}
|
||||
}
|
||||
|
||||
Vector3f newPlayerCharacterPosition = EntityUtil.getEntityPosition(Globals.playerCharacter);
|
||||
|
||||
|
||||
///
|
||||
/// C E L L M A N A G E R
|
||||
/// C L I E N T C E L L M A N A G E R
|
||||
///
|
||||
//Cell manager do your things
|
||||
Globals.cellManager.calculateDeltas(oldPlayerCharacterPosition, newPlayerCharacterPosition);
|
||||
Globals.cellManager.update();
|
||||
if(Globals.mainConfig.runRenderer){
|
||||
if(Globals.playerCharacter != null){
|
||||
newPlayerCharacterPosition = EntityUtils.getEntityPosition(Globals.playerCharacter);
|
||||
}
|
||||
//Cell manager do your things
|
||||
Globals.drawCellManager.calculateDeltas(oldPlayerCharacterPosition, newPlayerCharacterPosition);
|
||||
Globals.drawCellManager.update();
|
||||
}
|
||||
|
||||
|
||||
// camera_player_chase.pos_Center = new Vector3f(EntityUtil.getEntityPosition(player)).sub(EntityUtil.getEntityRotation(player).transform(new Vector3f(-1,1,0)));
|
||||
|
||||
///
|
||||
/// C A M E R A S T U F F
|
||||
///
|
||||
Globals.cameraVisible.apply_camera(camera_player_chase);
|
||||
|
||||
Globals.viewMatrix = Globals.cameraVisible.get_view_matrix();
|
||||
Globals.viewMatrix = new Matrix4f().setLookAt(
|
||||
camera_Current.pos_Center, //eye
|
||||
new Vector3f(0,0,0), //center
|
||||
new Vector3f(camera_Current.pos_Center).add(new Vector3f(0,1.0f,0)) // up
|
||||
).scale(1.0f, 1.5f, 1.0f);
|
||||
//poll mouse variables and update camera variables
|
||||
updateMouseVariables();
|
||||
if(Globals.playerCharacter != null){
|
||||
CameraEntityUtils.setCameraCenter(Globals.playerCamera, EntityUtils.getEntityPosition(Globals.playerCharacter));
|
||||
}
|
||||
float cam_Player_Orbit_Magnitude = 1f;
|
||||
// cam_Player_Orbit.pos_Center = new Vector3f(0, 0, 0);
|
||||
cameraRotationVector.x = 0 + (float) Math.cos(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cameraRotationVector.y = 0 + (float) Math.sin(pitch / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cameraRotationVector.z = 0 + (float) Math.sin(yaw / 180.0f * Math.PI) * cam_Player_Orbit_Magnitude;
|
||||
cameraRotationVector.normalize();
|
||||
CameraEntityUtils.setCameraEye(Globals.playerCamera, cameraRotationVector);
|
||||
// System.out.println(cam_Player_Orbit.pos_Center);
|
||||
Globals.viewMatrix = CameraEntityUtils.getCameraViewMatrix(CameraEntityUtils.getCameraEye(Globals.playerCamera));
|
||||
|
||||
|
||||
|
||||
@ -259,20 +286,20 @@ public class Main {
|
||||
|
||||
|
||||
//
|
||||
// Draw all entities
|
||||
// D R A W A L L E N T I T I E S
|
||||
//
|
||||
Iterator<Entity> entity_iterator = Globals.entityManager.getDrawableIterator();
|
||||
while(entity_iterator.hasNext()){
|
||||
Entity currentEntity = entity_iterator.next();
|
||||
Model currentModel = EntityUtil.getEntityModel(currentEntity);
|
||||
if(currentModel.currentAnimation != null){
|
||||
currentModel.incrementTime(deltaTime * 500);
|
||||
for(Entity currentEntity : Globals.entityManager.getDrawable()){
|
||||
Model currentModel = Globals.assetManager.fetchModel(EntityUtils.getEntityModelPath(currentEntity));
|
||||
if(currentModel != null){
|
||||
if(currentModel.currentAnimation != null){
|
||||
currentModel.incrementTime(deltaTime * 500);
|
||||
}
|
||||
currentModel.modelMatrix = new Matrix4f();
|
||||
currentModel.modelMatrix.translate(new Vector3f(EntityUtils.getEntityPosition(currentEntity)).sub(CameraEntityUtils.getCameraCenter(Globals.playerCamera)).sub(new Vector3f(0,1,0)));
|
||||
currentModel.modelMatrix.rotate(EntityUtils.getEntityRotation(currentEntity));
|
||||
currentModel.modelMatrix.scale(EntityUtils.getEntityScale(currentEntity));
|
||||
currentModel.draw();
|
||||
}
|
||||
currentModel.modelMatrix = new Matrix4f();
|
||||
currentModel.modelMatrix.translate(new Vector3f(EntityUtil.getEntityPosition(currentEntity)).sub(EntityUtil.getEntityPosition(Globals.playerCharacter)).sub(new Vector3f(0,1,0)));
|
||||
currentModel.modelMatrix.rotate(EntityUtil.getEntityRotation(currentEntity));
|
||||
currentModel.modelMatrix.scale(EntityUtil.getEntityScale(currentEntity));
|
||||
currentModel.draw();
|
||||
}
|
||||
|
||||
|
||||
@ -287,6 +314,9 @@ public class Main {
|
||||
}
|
||||
//Terminate the program.
|
||||
glfwTerminate();
|
||||
//used to signal threads to stop
|
||||
running = false;
|
||||
Globals.server.close();
|
||||
}
|
||||
|
||||
static void sleep(int i) {
|
||||
@ -298,7 +328,9 @@ public class Main {
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static boolean isRunning(){
|
||||
return running;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -333,8 +365,9 @@ public class Main {
|
||||
|
||||
static void initSkybox(){
|
||||
Model skyboxModel = RenderUtils.createSkyboxModel(null);
|
||||
Entity skyboxEntity = EntityUtil.spawnDrawableEntity(skyboxModel);
|
||||
EntityUtil.getEntityScale(skyboxEntity).mul(100);
|
||||
String skyboxModelPath = Globals.assetManager.registerModel(skyboxModel);
|
||||
Entity skyboxEntity = EntityUtils.spawnDrawableEntity(skyboxModelPath);
|
||||
EntityUtils.getEntityScale(skyboxEntity).mul(100);
|
||||
|
||||
|
||||
Globals.skyboxColors.add(new Vector3f(100,150,200));
|
||||
@ -352,12 +385,14 @@ public class Main {
|
||||
static void initTerrainManager(){
|
||||
|
||||
float[][] elevation;
|
||||
terrainManager = new TerrainManager(2000,200,100,0.25f);
|
||||
if(Globals.mainConfig.loadTerrain){
|
||||
terrainManager.load();
|
||||
} else {
|
||||
terrainManager.generate();
|
||||
terrainManager.save();
|
||||
Globals.terrainManager = new TerrainManager(2000,200,100,0.25f);
|
||||
if(Globals.mainConfig.runServer){
|
||||
if(Globals.mainConfig.loadTerrain){
|
||||
Globals.terrainManager.load();
|
||||
} else {
|
||||
Globals.terrainManager.generate();
|
||||
Globals.terrainManager.save();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -368,27 +403,27 @@ public class Main {
|
||||
}
|
||||
|
||||
static void initCellManager(){
|
||||
Globals.cellManager = new CellManager(terrainManager, playerStartRealX, playerStartRealY);
|
||||
Globals.drawCellManager = new DrawCellManager(Globals.terrainManager, playerStartRealX, playerStartRealY);
|
||||
|
||||
|
||||
while(Globals.cellManager.containsInvalidCell()){
|
||||
Globals.cellManager.updateInvalidCell();
|
||||
while(Globals.drawCellManager.containsInvalidCell()){
|
||||
Globals.drawCellManager.updateInvalidCell();
|
||||
}
|
||||
|
||||
while(Globals.cellManager.containsUndrawableCell()){
|
||||
Globals.cellManager.makeCellDrawable();
|
||||
while(Globals.drawCellManager.containsUndrawableCell()){
|
||||
Globals.drawCellManager.makeCellDrawable();
|
||||
}
|
||||
}
|
||||
|
||||
static void initPlayer(){
|
||||
int playerStartX = 0;
|
||||
int playerStartY = 0;
|
||||
int discreteSize = terrainManager.getWorldDiscreteSize();
|
||||
int chunkSize = terrainManager.getChunkWidth();
|
||||
int discreteSize = Globals.terrainManager.getWorldDiscreteSize();
|
||||
int chunkSize = Globals.terrainManager.getChunkWidth();
|
||||
boolean found = false;
|
||||
for(int x = 0; x < discreteSize; x++){
|
||||
for(int y = 0; y < discreteSize; y++){
|
||||
if(terrainManager.getDiscreteValue(x, y)>0){
|
||||
if(Globals.terrainManager.getDiscreteValue(x, y)>0){
|
||||
playerStartX = x;
|
||||
playerStartY = y;
|
||||
found = true;
|
||||
@ -404,42 +439,25 @@ public class Main {
|
||||
playerStartRealX = playerStartX * chunkSize;
|
||||
playerStartRealY = playerStartY * chunkSize;
|
||||
|
||||
// Globals.player = CameraEntityUtils.spawnOrbitalCameraEntity(target, 3f);
|
||||
// Globals.player.putData("position", new Vector3f(playerStartRealX,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY));
|
||||
|
||||
/*
|
||||
Entity playerCharacter = EntityUtil.spawnDrawableEntity(ModelLoader.load_Model_From_File("Models/person1walkanim.fbx"));
|
||||
EntityUtil.getEntityPosition(playerCharacter).set(playerStartRealX - 0.5f,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
|
||||
Model playerCharacterModel = EntityUtil.getEntityModel(playerCharacter);
|
||||
EntityUtil.getEntityScale(playerCharacter).set(0.005f);
|
||||
// playerCharacterModel.describeAllAnimations();
|
||||
playerCharacterModel.playAnimation("Armature|Walk");
|
||||
playerCharacterModel.incrementTime(0.1);
|
||||
// EntityUtil.getEntityModel(playerCharacter).playAnimation("Armature|Idle1");
|
||||
*/
|
||||
Model homieModel = ModelLoader.load_Model_From_File("Models/person1walkanim.fbx");
|
||||
homieModel.describeAllAnimations();
|
||||
Globals.playerCharacter = CreatureUtils.spawnBasicControllableEntity(homieModel, 0.005f, 0.025f);
|
||||
EntityUtil.getEntityScale(Globals.playerCharacter).set(0.005f);
|
||||
EntityUtil.getEntityPosition(Globals.playerCharacter).set(playerStartRealX - 0.5f,terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
|
||||
// Model homieModel = ModelLoader.load_Model_From_File("Models/person1walkanim.fbx");
|
||||
// homieModel.describeAllAnimations();
|
||||
// Globals.playerCharacter = CreatureUtils.spawnBasicControllableEntity(0, 0.005f, 0.025f);
|
||||
// EntityUtils.getEntityScale(Globals.playerCharacter).set(0.005f);
|
||||
// EntityUtils.getEntityPosition(Globals.playerCharacter).set(playerStartRealX - 0.5f,Globals.terrainManager.getHeightAtPosition(playerStartRealX, playerStartRealY),playerStartRealY - 0.5f);
|
||||
// System.out.println("Player position: " + playerStartRealX + " " + playerStartRealY);
|
||||
|
||||
|
||||
Globals.playerCamera = CameraEntityUtils.spawnOrbitalCameraEntity(Globals.playerCharacter, 3f);
|
||||
// Globals.playerCamera = CameraEntityUtils.spawnEntityTrackingCameraEntity(Globals.playerCharacter, 3f);
|
||||
|
||||
|
||||
Globals.cellManager.setCellX(Globals.cellManager.transformRealSpaceToCellSpace(playerStartRealX));
|
||||
Globals.cellManager.setCellY(Globals.cellManager.transformRealSpaceToCellSpace(playerStartRealY));
|
||||
Globals.drawCellManager.setCellX(Globals.drawCellManager.transformRealSpaceToCellSpace(playerStartRealX));
|
||||
Globals.drawCellManager.setCellY(Globals.drawCellManager.transformRealSpaceToCellSpace(playerStartRealY));
|
||||
|
||||
Globals.cellManager.invalidateAllCells();
|
||||
Globals.drawCellManager.invalidateAllCells();
|
||||
}
|
||||
|
||||
|
||||
public static void forkServer(){
|
||||
Server.startServerThread();
|
||||
}
|
||||
|
||||
public static void forkConnection(){
|
||||
Connection.startConnection();
|
||||
static void createPlayerCamera(){
|
||||
Globals.playerCamera = CameraEntityUtils.spawnBasicCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
23
src/main/java/electrosphere/net/NetUtils.java
Normal file
23
src/main/java/electrosphere/net/NetUtils.java
Normal file
@ -0,0 +1,23 @@
|
||||
package electrosphere.net;
|
||||
|
||||
import electrosphere.entity.CreatureUtils;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class NetUtils {
|
||||
|
||||
public static EntityMessage createSpawnEntityMessage(Entity e){
|
||||
EntityMessage rVal = EntityMessage.constructCreateMessage(e.getId(), CreatureUtils.getCreatureType(e));
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static EntityMessage createSetCreatureControllerIdEntityMessage(Entity e){
|
||||
System.out.println("Controller id: " + CreatureUtils.getControllerPlayerId(e));
|
||||
EntityMessage rVal = EntityMessage.constructSetPropertyMessage(e.getId(), 0, CreatureUtils.getControllerPlayerId(e));
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package electrosphere.net;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class Packet {
|
||||
byte[] rawBytes;
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package electrosphere.net.client;
|
||||
|
||||
import electrosphere.util.BufferUtils;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class ClientNetworkMessage {
|
||||
|
||||
byte[] bytesRaw;
|
||||
|
||||
public ClientNetworkMessage(byte[] bytes){
|
||||
bytesRaw = bytes;
|
||||
}
|
||||
|
||||
|
||||
public byte[] getRawBytes(){
|
||||
return bytesRaw;
|
||||
}
|
||||
|
||||
public static ClientNetworkMessage getMoveForwardMessage(){
|
||||
return new ClientNetworkMessage("test".getBytes());
|
||||
}
|
||||
|
||||
static final byte CATEGORY_ENTITY = 2;
|
||||
|
||||
static final byte ENTITY_CREATE = 0;
|
||||
static final byte ENTITY_DELETE = 1;
|
||||
static final byte ENTITY_MOVE = 2;
|
||||
static final byte ENTITY_SET_BEHAVIOR_TREE_STATE = 3;
|
||||
|
||||
static ByteBuffer integerCompactor;
|
||||
|
||||
static {
|
||||
integerCompactor = ByteBuffer.allocate(4);
|
||||
}
|
||||
|
||||
public static ClientNetworkMessage parseClientNetworkMessageFromByteQueue(CopyOnWriteArrayList<Byte> byteQueue){
|
||||
ClientNetworkMessage rVal = null;
|
||||
if(byteQueue.size() > 0){
|
||||
byte firstByte = byteQueue.get(0);
|
||||
switch(firstByte){
|
||||
case CATEGORY_ENTITY:
|
||||
if(byteQueue.size() >= 18){
|
||||
byte secondByte = byteQueue.get(1);
|
||||
switch(secondByte){
|
||||
case ENTITY_CREATE:
|
||||
byteQueue.remove(0);
|
||||
byteQueue.remove(0);
|
||||
int id = BufferUtils.popIntFromByteQueue(byteQueue);
|
||||
int type = BufferUtils.popIntFromByteQueue(byteQueue);
|
||||
System.out.println("Create entity id:" + id + " type:" + type);
|
||||
break;
|
||||
case ENTITY_DELETE:
|
||||
break;
|
||||
case ENTITY_MOVE:
|
||||
break;
|
||||
case ENTITY_SET_BEHAVIOR_TREE_STATE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
161
src/main/java/electrosphere/net/client/ClientNetworking.java
Normal file
161
src/main/java/electrosphere/net/client/ClientNetworking.java
Normal file
@ -0,0 +1,161 @@
|
||||
package electrosphere.net.client;
|
||||
|
||||
import electrosphere.entity.CreatureUtils;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
import electrosphere.net.message.NetworkMessage;
|
||||
import electrosphere.net.message.PlayerMessage;
|
||||
import electrosphere.net.raw.NetworkParser;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.math.BigInteger;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.security.spec.RSAKeyGenParameterSpec;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import org.apache.commons.crypto.stream.CryptoInputStream;
|
||||
import org.apache.commons.crypto.stream.CryptoOutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class ClientNetworking implements Runnable{
|
||||
|
||||
|
||||
static int port = 42536;
|
||||
Socket socket;
|
||||
// CryptoInputStream inputStream;
|
||||
// CryptoOutputStream outputStream;
|
||||
InputStream inputStream;
|
||||
OutputStream outputStream;
|
||||
boolean initialized;
|
||||
NetworkParser parser;
|
||||
|
||||
public ClientNetworking(String address, int port){
|
||||
try {
|
||||
this.socket = new Socket(address,port);
|
||||
} catch (IOException ex) {
|
||||
System.err.println("Failed to connect!");
|
||||
ex.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void run(){
|
||||
initialized = false;
|
||||
// final SecretKeySpec key = new SecretKeySpec(("1234567890123456").getBytes(),"AES");
|
||||
// final Properties properties = new Properties();
|
||||
// final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(4096, BigInteger.probablePrime(4000, new Random()));
|
||||
// try {
|
||||
// inputStream = new CryptoInputStream("AES/ECB/PKCS5Padding",properties,socket.getInputStream(),key,spec);
|
||||
// } catch (IOException ex) {
|
||||
// ex.printStackTrace();
|
||||
// System.exit(1);
|
||||
// }
|
||||
// try {
|
||||
// outputStream = new CryptoOutputStream("AES/ECB/PKCS5Padding",properties,socket.getOutputStream(),key,spec);
|
||||
// } catch (IOException ex) {
|
||||
// ex.printStackTrace();
|
||||
// System.exit(1);
|
||||
// }
|
||||
try {
|
||||
inputStream = socket.getInputStream();
|
||||
outputStream = socket.getOutputStream();
|
||||
parser = new NetworkParser(inputStream,outputStream);
|
||||
} catch (IOException ex) {
|
||||
Logger.getLogger(ClientNetworking.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
initialized = true;
|
||||
while(Main.isRunning()){
|
||||
//attempt poll incoming messages
|
||||
parser.readMessagesIn();
|
||||
//outgoing messages
|
||||
parser.pushMessagesOut();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void parseMessages(){
|
||||
while(parser.hasIncomingMessaage()){
|
||||
NetworkMessage message = parser.popIncomingMessage();
|
||||
System.out.println("New message " + message.getType());
|
||||
//do something
|
||||
handleMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
void handleMessage(NetworkMessage message){
|
||||
switch(message.getType()){
|
||||
case ENTITY_MESSAGE:
|
||||
handleEntityMessage((EntityMessage)message);
|
||||
break;
|
||||
case PLAYER_MESSAGE:
|
||||
handlePlayerMessage((PlayerMessage)message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void handleEntityMessage(EntityMessage message){
|
||||
System.out.println(message.getEntityMessageType());
|
||||
switch(message.getEntityMessageType()){
|
||||
case CREATE:
|
||||
System.out.println("Spawn ID " + message.getEntityType());
|
||||
Entity newlySpawnedEntity = CreatureUtils.spawnBasicCreature(message.getEntityType(), 0.005f, 0.025f);
|
||||
EntityUtils.getEntityScale(newlySpawnedEntity).set(0.005f);
|
||||
EntityUtils.getEntityPosition(newlySpawnedEntity).set(10 - 0.5f,Globals.terrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
|
||||
EntityUtils.setEntityID(newlySpawnedEntity, message.getId());
|
||||
break;
|
||||
case DESTROY:
|
||||
break;
|
||||
case MOVE:
|
||||
//literally just adding this to scope so I can use `` Entity target; `` again
|
||||
if(message.getId() != -1){
|
||||
Entity target = Globals.entityManager.getEntityFromId(message.getId());
|
||||
EntityUtils.getEntityPosition(target).set(message.getX(),message.getY(),message.getZ());
|
||||
}
|
||||
// CreatureUtils.attachEntityMessageToMovementTree(Globals.entityManager.getEntityFromId(message.getId()),message);
|
||||
break;
|
||||
case SET_BEHAVIOR_TREE:
|
||||
break;
|
||||
case SET_PROPERTY:
|
||||
if(message.getPropertyType() == 0){
|
||||
Entity target = Globals.entityManager.getEntityFromId(message.getId());
|
||||
if(target != null){
|
||||
CreatureUtils.setControllerPlayerId(target, message.getPropertyValue());
|
||||
if(message.getPropertyValue() == Main.playerId){
|
||||
Globals.playerCharacter = target;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void handlePlayerMessage(PlayerMessage message){
|
||||
switch(message.getPlayerMessageType()){
|
||||
case SET_PLAYER_ID:
|
||||
Main.playerId = message.getId();
|
||||
System.out.println("Player ID is " + Main.playerId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void queueOutgoingMessage(NetworkMessage message){
|
||||
parser.addOutgoingMessage(message);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,71 +0,0 @@
|
||||
package electrosphere.net.client;
|
||||
|
||||
import electrosphere.main.Globals;
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.apache.commons.crypto.stream.CryptoInputStream;
|
||||
import org.apache.commons.crypto.stream.CryptoOutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class Connection {
|
||||
|
||||
enum ConnectionState {
|
||||
HANDSHAKE_START,
|
||||
HANDSHAKE_SUCCESS,
|
||||
HANDSHAKE_FAILURE,
|
||||
}
|
||||
|
||||
ConnectionState state;
|
||||
|
||||
static int port = 42536;
|
||||
|
||||
Socket socket;
|
||||
|
||||
CryptoInputStream inputStream;
|
||||
|
||||
CryptoOutputStream outputStream;
|
||||
|
||||
public Connection(String address, int port){
|
||||
try {
|
||||
this.socket = new Socket(address,port);
|
||||
} catch (IOException ex) {
|
||||
System.err.println("Failed to connect!");
|
||||
ex.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void processAllPackets(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void startConnection(){
|
||||
Globals.connection = new Connection("localhost",port);
|
||||
|
||||
|
||||
}
|
||||
|
||||
class ConnectionProtocol implements Runnable {
|
||||
Connection connection;
|
||||
|
||||
public ConnectionProtocol(Connection conn){
|
||||
connection = conn;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
boolean running = true;
|
||||
// while(running){
|
||||
// if(connection.inputStream.read)
|
||||
// }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
package electrosphere.net.server;
|
||||
|
||||
import java.net.Socket;
|
||||
import org.apache.commons.crypto.stream.CryptoInputStream;
|
||||
import org.apache.commons.crypto.stream.CryptoOutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class Client implements Runnable {
|
||||
|
||||
|
||||
Socket socket;
|
||||
|
||||
CryptoInputStream inputStream;
|
||||
|
||||
CryptoOutputStream outputStream;
|
||||
|
||||
|
||||
public Client(Socket socket) {
|
||||
this.socket = socket;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("aaaaaaaaaaaeoiu");
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,9 +1,12 @@
|
||||
package electrosphere.net.server;
|
||||
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.message.NetworkMessage;
|
||||
import java.io.IOException;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.util.HashMap;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
@ -12,13 +15,13 @@ import java.util.logging.Logger;
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class Server {
|
||||
public class Server implements Runnable{
|
||||
|
||||
static int port = 42536;
|
||||
|
||||
ServerSocket serverSocket;
|
||||
|
||||
HashMap<String,Client> clientMap;
|
||||
HashMap<String,ServerConnectionHandler> clientMap;
|
||||
|
||||
|
||||
|
||||
@ -28,38 +31,46 @@ public class Server {
|
||||
}
|
||||
|
||||
|
||||
Server(int port){
|
||||
public Server(int port){
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
initServer();
|
||||
try {
|
||||
serverSocket = new ServerSocket();
|
||||
serverSocket = new ServerSocket(port);
|
||||
} catch (IOException ex) {
|
||||
System.err.println("Failed to start server socket!");
|
||||
ex.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
boolean running = true;
|
||||
while(running){
|
||||
while(Main.isRunning()){
|
||||
Socket newSocket;
|
||||
try {
|
||||
newSocket = serverSocket.accept();
|
||||
Client newClient = new Client(newSocket);
|
||||
ServerConnectionHandler newClient = new ServerConnectionHandler(newSocket);
|
||||
clientMap.put(newSocket.getInetAddress().getHostAddress(), newClient);
|
||||
new Thread(newClient).start();
|
||||
} catch (IOException ex) {
|
||||
System.err.println("Socket error on client socket!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void close(){
|
||||
try {
|
||||
serverSocket.close();
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void startServerThread(){
|
||||
Thread t = new Thread(){
|
||||
@Override
|
||||
public void run(){
|
||||
Server s = new Server(port);
|
||||
public void broadcastMessage(NetworkMessage message){
|
||||
for(ServerConnectionHandler client : clientMap.values()){
|
||||
if(client.playerID != Main.playerId){
|
||||
client.addMessagetoOutgoingQueue(message);
|
||||
}
|
||||
};
|
||||
t.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,162 @@
|
||||
package electrosphere.net.server;
|
||||
|
||||
import electrosphere.entity.CreatureUtils;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.NetUtils;
|
||||
import electrosphere.net.message.EntityMessage;
|
||||
import electrosphere.net.message.NetworkMessage;
|
||||
import electrosphere.net.message.NetworkMessage.MessageType;
|
||||
import electrosphere.net.message.PlayerMessage;
|
||||
import electrosphere.net.raw.NetworkParser;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.math.BigInteger;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.security.spec.RSAKeyGenParameterSpec;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import org.apache.commons.crypto.stream.CryptoInputStream;
|
||||
import org.apache.commons.crypto.stream.CryptoOutputStream;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
public class ServerConnectionHandler implements Runnable {
|
||||
|
||||
static int playerIdIncrementer = 0;
|
||||
|
||||
Socket socket;
|
||||
// CryptoInputStream inputStream;
|
||||
// CryptoOutputStream outputStream;
|
||||
InputStream inputStream;
|
||||
OutputStream outputStream;
|
||||
boolean initialized;
|
||||
NetworkParser networkParser;
|
||||
int playerID;
|
||||
|
||||
public ServerConnectionHandler(Socket socket) {
|
||||
this.socket = socket;
|
||||
playerID = getPlayerID();
|
||||
System.out.println("Player ID: " + playerID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("aaaaaaaaaaaeoiu");
|
||||
initialized = false;
|
||||
try {
|
||||
socket.setSoTimeout(100);
|
||||
} catch (SocketException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
// final SecretKeySpec key = new SecretKeySpec(("1234567890123456").getBytes(),"AES");
|
||||
// final Properties properties = new Properties();
|
||||
// final RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(4096, BigInteger.probablePrime(4000, new Random()));
|
||||
// try {
|
||||
// inputStream = new CryptoInputStream("AES/ECB/PKCS5Padding",properties,socket.getInputStream(),key,spec);
|
||||
// } catch (IOException ex) {
|
||||
// ex.printStackTrace();
|
||||
// System.exit(1);
|
||||
// }
|
||||
// try {
|
||||
// outputStream = new CryptoOutputStream("AES/ECB/PKCS5Padding",properties,socket.getOutputStream(),key,spec);
|
||||
// } catch (IOException ex) {
|
||||
// ex.printStackTrace();
|
||||
// System.exit(1);
|
||||
// }
|
||||
try {
|
||||
inputStream = socket.getInputStream();
|
||||
outputStream = socket.getOutputStream();
|
||||
networkParser = new NetworkParser(inputStream,outputStream);
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
//spawn player in world
|
||||
Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature(0, 0.001f, 0.025f);
|
||||
EntityUtils.getEntityScale(newPlayerCharacter).set(0.005f);
|
||||
EntityUtils.getEntityPosition(newPlayerCharacter).set(10 - 0.5f,Globals.terrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
|
||||
CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID);
|
||||
if(Globals.mainConfig.runServer && Main.playerId == -1){
|
||||
Globals.playerCharacter = newPlayerCharacter;
|
||||
}
|
||||
//tell them what player stats they are
|
||||
networkParser.addOutgoingMessage(PlayerMessage.constructSetPlayerIDMessage(playerID));
|
||||
//figure out what chunk they're in
|
||||
|
||||
//queue messages for that chunk
|
||||
if(Globals.mainConfig.runServer){
|
||||
|
||||
} else {
|
||||
for(Entity currentEntity : Globals.entityManager.getMoveable()){
|
||||
networkParser.addOutgoingMessage(NetUtils.createSpawnEntityMessage(currentEntity));
|
||||
if(CreatureUtils.isCreature(currentEntity)){
|
||||
if(CreatureUtils.hasControllerPlayerId(currentEntity)){
|
||||
System.out.println("Sending controller packets");
|
||||
networkParser.addOutgoingMessage(NetUtils.createSetCreatureControllerIdEntityMessage(currentEntity));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
while(Main.isRunning()){
|
||||
//attempt poll incoming messages
|
||||
networkParser.readMessagesIn();
|
||||
//ponder incoming messages
|
||||
while(networkParser.hasIncomingMessaage()){
|
||||
NetworkMessage message = networkParser.popIncomingMessage();
|
||||
handleMessage(message);
|
||||
}
|
||||
//push outgoing message
|
||||
networkParser.pushMessagesOut();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void handleMessage(NetworkMessage message){
|
||||
switch(message.getType()){
|
||||
case ENTITY_MESSAGE:
|
||||
handleEntityMessage((EntityMessage)message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void handleEntityMessage(EntityMessage message){
|
||||
switch(message.getEntityMessageType()){
|
||||
case CREATE:
|
||||
break;
|
||||
case DESTROY:
|
||||
break;
|
||||
case MOVE:
|
||||
Entity targetEntity = Globals.entityManager.getEntityFromId(message.getId());
|
||||
if(targetEntity != null){
|
||||
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
|
||||
}
|
||||
break;
|
||||
case SET_BEHAVIOR_TREE:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int getPlayerID(){
|
||||
playerIdIncrementer++;
|
||||
return playerIdIncrementer;
|
||||
}
|
||||
|
||||
public void addMessagetoOutgoingQueue(NetworkMessage message){
|
||||
networkParser.addOutgoingMessage(message);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,33 @@
|
||||
package electrosphere.net.server;
|
||||
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class ServerNetworkMessage {
|
||||
|
||||
byte[] rawBytes;
|
||||
|
||||
|
||||
public byte[] getRawBytes(){
|
||||
return rawBytes;
|
||||
}
|
||||
|
||||
public static ServerNetworkMessage parseServerNetworkMessage(CopyOnWriteArrayList<Byte> byteQueue){
|
||||
ServerNetworkMessage rVal = null;
|
||||
if(byteQueue.size() > 0){
|
||||
byte firstByte = byteQueue.get(0);
|
||||
switch(firstByte){
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
@ -8,6 +8,7 @@ import org.joml.Vector3f;
|
||||
*
|
||||
* @author satellite
|
||||
*/
|
||||
@Deprecated
|
||||
public class Camera {
|
||||
public Vector3f pos_Center = new Vector3f(0,0,0);
|
||||
// public Vector3f pos_Front = new Vector3f(0,0,0);
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package electrosphere.renderer;
|
||||
|
||||
import electrosphere.entity.CameraEntityUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.renderer.light.LightBuffer;
|
||||
@ -441,7 +442,7 @@ public class Mesh {
|
||||
|
||||
GL20.glUniformMatrix4fv(glGetUniformLocation(shader.shaderProgram, "model"), false, parent.modelMatrix.get(new float[16]));
|
||||
|
||||
Vector3f cam_Loc = Globals.cameraVisible.pos_Center;
|
||||
Vector3f cam_Loc = CameraEntityUtils.getCameraEye(Globals.playerCamera);//Globals.cameraVisible.pos_Center;
|
||||
temp[0] = cam_Loc.x;
|
||||
temp[1] = cam_Loc.y;
|
||||
temp[2] = cam_Loc.z;
|
||||
@ -495,7 +496,7 @@ public class Mesh {
|
||||
glUniformMatrix4fv(shader.shaderVertexModelLoc, false, parent.modelMatrix.get(new float[16]));
|
||||
glUniformMatrix4fv(shader.shaderVertexViewLoc, false, Globals.viewMatrix.get(new float[16]));
|
||||
glUniformMatrix4fv(shader.shaderVertexProjectionLoc, false, Globals.projectionMatrix.get(new float[16]));
|
||||
glUniform3fv(shader.shaderVertexViewPosLoc, Globals.cameraVisible.pos_Center.get(BufferUtils.createFloatBuffer(3)));
|
||||
glUniform3fv(shader.shaderVertexViewPosLoc, CameraEntityUtils.getCameraEye(Globals.playerCamera).get(BufferUtils.createFloatBuffer(3)));
|
||||
|
||||
//
|
||||
//
|
||||
@ -520,7 +521,7 @@ public class Mesh {
|
||||
test_Light_Data[2] = 0.5f;
|
||||
glUniform3fv(glGetUniformLocation(shader.shaderProgram, "dirLight.diffuse"), test_Light_Data);
|
||||
|
||||
Vector3f cam_Loc = Globals.cameraVisible.pos_Center;
|
||||
Vector3f cam_Loc = CameraEntityUtils.getCameraEye(Globals.playerCamera);
|
||||
test_Light_Data = new float[3];
|
||||
test_Light_Data[0] = cam_Loc.x;
|
||||
test_Light_Data[1] = cam_Loc.y;
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
*/
|
||||
package electrosphere.renderer;
|
||||
|
||||
import electrosphere.entity.CameraEntityUtils;
|
||||
import java.nio.FloatBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.ArrayList;
|
||||
@ -184,7 +185,7 @@ public class RenderUtils {
|
||||
glUniformMatrix4fv(shader.shaderVertexModelLoc, false, parent.modelMatrix.get(new float[16]));
|
||||
glUniformMatrix4fv(shader.shaderVertexViewLoc, false, new Matrix4f(Globals.viewMatrix).scale(100).get(new float[16]));
|
||||
glUniformMatrix4fv(shader.shaderVertexProjectionLoc, false, Globals.projectionMatrix.get(new float[16]));
|
||||
glUniform3fv(shader.shaderVertexViewPosLoc, Globals.cameraVisible.pos_Center.get(BufferUtils.createFloatBuffer(3)));
|
||||
glUniform3fv(shader.shaderVertexViewPosLoc, CameraEntityUtils.getCameraEye(Globals.playerCamera).get(BufferUtils.createFloatBuffer(3)));
|
||||
|
||||
|
||||
GL11.glDrawElements(GL_TRIANGLES, elementCount, GL_UNSIGNED_INT, 0);
|
||||
|
||||
@ -0,0 +1,54 @@
|
||||
package electrosphere.renderer.assetmanager;
|
||||
|
||||
import electrosphere.renderer.Model;
|
||||
import electrosphere.util.ModelLoader;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class AssetManager {
|
||||
|
||||
ConcurrentHashMap<String,Model> modelsLoadedIntoMemory = new ConcurrentHashMap();
|
||||
|
||||
CopyOnWriteArrayList<String> modelsInQueue = new CopyOnWriteArrayList();
|
||||
|
||||
public void loadAssetsInQueue(){
|
||||
for(String currentPath : modelsInQueue){
|
||||
modelsInQueue.remove(currentPath);
|
||||
modelsLoadedIntoMemory.put(currentPath, ModelLoader.load_Model_From_File(currentPath));
|
||||
}
|
||||
}
|
||||
|
||||
public void addModelPathToQueue(String path){
|
||||
if(!modelsInQueue.contains(path) && !modelsLoadedIntoMemory.containsKey(path)){
|
||||
modelsInQueue.add(path);
|
||||
}
|
||||
}
|
||||
|
||||
public Model fetchModel(String path){
|
||||
Model rVal = null;
|
||||
if(modelsLoadedIntoMemory.containsKey(path)){
|
||||
rVal = modelsLoadedIntoMemory.get(path);
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
/**
|
||||
Registers a (presumably generated in code) model with the asset manager
|
||||
@returns a random string that represents the model in the asset manager
|
||||
*/
|
||||
public String registerModel(Model m){
|
||||
String rVal;
|
||||
UUID newUUID = UUID.randomUUID();
|
||||
rVal = newUUID.toString();
|
||||
modelsLoadedIntoMemory.put(rVal,m);
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
30
src/main/java/electrosphere/util/BufferUtils.java
Normal file
30
src/main/java/electrosphere/util/BufferUtils.java
Normal file
@ -0,0 +1,30 @@
|
||||
package electrosphere.util;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class BufferUtils {
|
||||
|
||||
static ByteBuffer integerCompactor;
|
||||
|
||||
static {
|
||||
integerCompactor = ByteBuffer.allocate(4);
|
||||
}
|
||||
|
||||
public static int popIntFromByteQueue(CopyOnWriteArrayList<Byte> queue){
|
||||
int rVal = -1;
|
||||
integerCompactor.clear();
|
||||
integerCompactor.put(queue.remove(0));
|
||||
integerCompactor.put(queue.remove(0));
|
||||
integerCompactor.put(queue.remove(0));
|
||||
integerCompactor.put(queue.remove(0));
|
||||
integerCompactor.flip();
|
||||
rVal = integerCompactor.getInt();
|
||||
return rVal;
|
||||
}
|
||||
}
|
||||
12
src/main/resources/Data/entity_map.json
Normal file
12
src/main/resources/Data/entity_map.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"types": [
|
||||
{
|
||||
"id" : 0,
|
||||
"modelPath" : "Models/person1walkanim.fbx"
|
||||
},
|
||||
{
|
||||
"id" : 1,
|
||||
"modelPath" : ""
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user