Mid terrain net stream / starting worldgen

This commit is contained in:
austin 2021-06-19 01:59:59 -04:00
parent 444bda5394
commit c13f137f68
13 changed files with 246 additions and 64 deletions

View File

@ -217,8 +217,8 @@ public class ControlHandler {
controlsState.put(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD, true);
Vector3f position = EntityUtils.getEntityPosition(Globals.playerCharacter);
EntityMessage outgoingMessage = EntityMessage.constructMoveMessage(
System.currentTimeMillis(),
Globals.playerCharacter.getId(),
System.currentTimeMillis(),
position.x,
position.y,
position.z

View File

@ -81,8 +81,8 @@ public class MovementTree {
if(Globals.mainConfig.runServer){
Globals.server.broadcastMessage(
EntityMessage.constructMoveMessage(
System.currentTimeMillis(),
parent.getId(),
System.currentTimeMillis(),
message.getpositionX(),
message.getpositionY(),
message.getpositionZ()

View File

@ -0,0 +1,9 @@
package electrosphere.game.server.character;
/**
*
* @author amaterasu
*/
public class Character {
}

View File

@ -88,11 +88,15 @@ public class LoadingThread extends Thread {
loadingBox.setDraw(true);
//initialize the terrain manager (server only)
initServerGameTerrainManager();
if(FLAG_INIT_SERVER){
initServerGameTerrainManager();
}
//init the data of the world
initServerGameWorldData();
if(FLAG_INIT_SERVER){
initServerGameWorldData();
}
//initialize the server thread (server only)
if(FLAG_INIT_SERVER){
@ -111,7 +115,7 @@ public class LoadingThread extends Thread {
initDynamicCellManager();
//collision engine
initCollisionEngine();
initCollisionEngine(FLAG_INIT_SERVER);
//initialize the basic graphical entities of the world (skybox, camera)
initWorldBaseGraphicalEntities();
@ -173,7 +177,7 @@ public class LoadingThread extends Thread {
initDynamicCellManager();
//collision engine
initCollisionEngine();
initCollisionEngine(FLAG_INIT_SERVER);
//initialize the basic graphical entities of the world (skybox, camera)
initWorldBaseGraphicalEntities();
@ -293,8 +297,8 @@ public class LoadingThread extends Thread {
Globals.serverWorldData = ServerWorldData.createGameWorld(Globals.serverTerrainManager);
}
static void initCollisionEngine(){
if(Globals.mainConfig.runServer){
static void initCollisionEngine(boolean FLAG_INIT_SERVER){
if(FLAG_INIT_SERVER){
Globals.commonWorldData = new CommonWorldData(Globals.serverWorldData, Globals.serverTerrainManager);
} else {
Globals.commonWorldData = new CommonWorldData(Globals.clientWorldData, Globals.clientTerrainManager);
@ -429,13 +433,13 @@ public class LoadingThread extends Thread {
// }
// for(int i = 0; i < 10; i++){
// Random rand = new Random();
// String treePath = "Models/tree1.fbx";
// Entity tree = EntityUtils.spawnDrawableEntity(treePath);
// EntityUtils.getEntityPosition(tree).set(rand.nextFloat() * 150 + 10, 0, rand.nextFloat() * 150 + 10);
//// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0));
// }
for(int i = 0; i < 10; i++){
Random rand = new Random();
String treePath = "Models/tree1.fbx";
Entity tree = EntityUtils.spawnDrawableEntity(treePath);
EntityUtils.getEntityPosition(tree).set(rand.nextFloat() * 150 + 10, 0, rand.nextFloat() * 150 + 10);
// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0));
}
Entity sword = ItemUtils.spawnBasicItem(2);
Entity testHomie = CreatureUtils.spawnBasicCreature(0, 0.1f, 0.5f);

View File

@ -28,6 +28,7 @@ import org.joml.Vector3f;
import org.lwjgl.glfw.*;
import static org.lwjgl.glfw.GLFW.*;
import electrosphere.util.ModelLoader;
import electrosphere.util.worldviewer.TerrainViewer;
import electrosphere.util.Utilities;
import java.io.File;
import java.io.IOException;
@ -111,6 +112,9 @@ public class Main {
//init global variables
Globals.initGlobals();
//debug: create terrain/world viewer
TerrainViewer.runViewer();
//create the drawing context
Globals.renderingEngine = new RenderingEngine();
Globals.renderingEngine.createOpenglContext();

View File

@ -15,14 +15,14 @@ public class NetUtils {
static int port = DEFAULT_PORT;
static String address = "127.0.0.1";
public static EntityMessage createSpawnEntityMessage(Entity e){
EntityMessage rVal = EntityMessage.constructCreateMessage(e.getId(), CreatureUtils.getCreatureType(e), 0.0f, 0.0f, 0.0f);
return rVal;
}
// public static EntityMessage createSpawnEntityMessage(Entity e){
// EntityMessage rVal = EntityMessage.constructCreateMessage(e.getId(), CreatureUtils.getCreatureType(e), 0.0f, 0.0f, 0.0f);
// return rVal;
// }
public static EntityMessage createSetCreatureControllerIdEntityMessage(Entity e){
System.out.println("Controller id: " + CreatureUtils.getControllerPlayerId(e));
EntityMessage rVal = EntityMessage.constructsetPropertyMessage(System.currentTimeMillis(), e.getId(), 0, CreatureUtils.getControllerPlayerId(e));
EntityMessage rVal = EntityMessage.constructsetPropertyMessage(e.getId(), System.currentTimeMillis(), 0, CreatureUtils.getControllerPlayerId(e));
return rVal;
}

View File

@ -51,7 +51,7 @@ public class ClientProtocol {
System.out.println("Spawn ID " + message.getentityID());
Entity newlySpawnedEntity = CreatureUtils.spawnBasicCreature(message.getcreatureType(), 0.005f, 0.025f);
EntityUtils.getEntityScale(newlySpawnedEntity).set(0.005f);
EntityUtils.getEntityPosition(newlySpawnedEntity).set(10 - 0.5f,Globals.serverTerrainManager.getHeightAtPosition(10, 10),10 - 0.5f);
EntityUtils.getEntityPosition(newlySpawnedEntity).set(message.getpositionX(),message.getpositionY(),message.getpositionZ());
EntityUtils.setEntityID(newlySpawnedEntity, message.getentityID());
break;
case DESTROY:

View File

@ -165,18 +165,18 @@ public class EntityMessage extends NetworkMessage {
public static EntityMessage parseCreateMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.CREATE);
stripPacketHeader(byteStream);
rVal.setcreatureType(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setcreatureType(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setpositionX(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionY(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionZ(ByteStreamUtils.popFloatFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructCreateMessage(int creatureType,int entityID,float positionX,float positionY,float positionZ){
public static EntityMessage constructCreateMessage(int entityID,int creatureType,float positionX,float positionY,float positionZ){
EntityMessage rVal = new EntityMessage(EntityMessageType.CREATE);
rVal.setcreatureType(creatureType);
rVal.setentityID(entityID);
rVal.setcreatureType(creatureType);
rVal.setpositionX(positionX);
rVal.setpositionY(positionY);
rVal.setpositionZ(positionZ);
@ -187,18 +187,18 @@ public class EntityMessage extends NetworkMessage {
public static EntityMessage parseSetPositionMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETPOSITION);
stripPacketHeader(byteStream);
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setpositionX(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionY(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionZ(ByteStreamUtils.popFloatFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructSetPositionMessage(long time,int entityID,float positionX,float positionY,float positionZ){
public static EntityMessage constructSetPositionMessage(int entityID,long time,float positionX,float positionY,float positionZ){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETPOSITION);
rVal.settime(time);
rVal.setentityID(entityID);
rVal.settime(time);
rVal.setpositionX(positionX);
rVal.setpositionY(positionY);
rVal.setpositionZ(positionZ);
@ -209,18 +209,18 @@ public class EntityMessage extends NetworkMessage {
public static EntityMessage parseMoveMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.MOVE);
stripPacketHeader(byteStream);
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setpositionX(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionY(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setpositionZ(ByteStreamUtils.popFloatFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructMoveMessage(long time,int entityID,float positionX,float positionY,float positionZ){
public static EntityMessage constructMoveMessage(int entityID,long time,float positionX,float positionY,float positionZ){
EntityMessage rVal = new EntityMessage(EntityMessageType.MOVE);
rVal.settime(time);
rVal.setentityID(entityID);
rVal.settime(time);
rVal.setpositionX(positionX);
rVal.setpositionY(positionY);
rVal.setpositionZ(positionZ);
@ -245,17 +245,17 @@ public class EntityMessage extends NetworkMessage {
public static EntityMessage parseSetBehaviorTreeMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETBEHAVIORTREE);
stripPacketHeader(byteStream);
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.settreeType(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.settreeStatus(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructSetBehaviorTreeMessage(long time,int entityID,int treeType,int treeStatus){
public static EntityMessage constructSetBehaviorTreeMessage(int entityID,long time,int treeType,int treeStatus){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETBEHAVIORTREE);
rVal.settime(time);
rVal.setentityID(entityID);
rVal.settime(time);
rVal.settreeType(treeType);
rVal.settreeStatus(treeStatus);
rVal.serialize();
@ -265,17 +265,17 @@ public class EntityMessage extends NetworkMessage {
public static EntityMessage parsesetPropertyMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETPROPERTY);
stripPacketHeader(byteStream);
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteStream));
rVal.setpropertyType(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setpropertyValue(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructsetPropertyMessage(long time,int entityID,int propertyType,int propertyValue){
public static EntityMessage constructsetPropertyMessage(int entityID,long time,int propertyType,int propertyValue){
EntityMessage rVal = new EntityMessage(EntityMessageType.SETPROPERTY);
rVal.settime(time);
rVal.setentityID(entityID);
rVal.settime(time);
rVal.setpropertyType(propertyType);
rVal.setpropertyValue(propertyValue);
rVal.serialize();
@ -292,11 +292,11 @@ public class EntityMessage extends NetworkMessage {
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_CREATE;
intValues = ByteStreamUtils.serializeIntToBytes(creatureType);
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
intValues = ByteStreamUtils.serializeIntToBytes(creatureType);
for(int i = 0; i < 4; i++){
rawBytes[6+i] = intValues[i];
}
@ -316,13 +316,13 @@ public class EntityMessage extends NetworkMessage {
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_SETPOSITION;
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[10+i] = intValues[i];
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[6+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeFloatToBytes(positionX);
for(int i = 0; i < 4; i++){
@ -340,13 +340,13 @@ public class EntityMessage extends NetworkMessage {
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_MOVE;
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[10+i] = intValues[i];
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[6+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeFloatToBytes(positionX);
for(int i = 0; i < 4; i++){
@ -375,13 +375,13 @@ public class EntityMessage extends NetworkMessage {
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_SETBEHAVIORTREE;
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[10+i] = intValues[i];
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[6+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(treeType);
for(int i = 0; i < 4; i++){
@ -398,13 +398,13 @@ public class EntityMessage extends NetworkMessage {
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY;
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[10+i] = intValues[i];
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeLongToBytes(time);
for(int i = 0; i < 8; i++){
rawBytes[6+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(propertyType);
for(int i = 0; i < 4; i++){

View File

@ -123,7 +123,15 @@ public class ServerConnectionHandler implements Runnable {
} else {
for(Entity currentEntity : Globals.entityManager.getMoveable()){
networkParser.addOutgoingMessage(NetUtils.createSpawnEntityMessage(currentEntity));
networkParser.addOutgoingMessage(
EntityMessage.constructCreateMessage(
currentEntity.getId(),
CreatureUtils.getCreatureType(currentEntity),
EntityUtils.getEntityPosition(currentEntity).x,
EntityUtils.getEntityPosition(currentEntity).y,
EntityUtils.getEntityPosition(currentEntity).z
)
);
if(CreatureUtils.isCreature(currentEntity)){
if(CreatureUtils.hasControllerPlayerId(currentEntity)){
System.out.println("Sending controller packets");

View File

@ -0,0 +1,45 @@
package electrosphere.util.worldviewer;
import electrosphere.game.server.terrain.models.TerrainModel;
import electrosphere.main.Globals;
import electrosphere.util.Utilities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JFrame;
/**
*
* @author amaterasu
*/
public class TerrainViewer {
public static void runViewer(){
TerrainModel terrainModel = Utilities.loadObjectFromBakedJsonFile("/Config/terrain.json", TerrainModel.class);
float[][] elevationMacro = terrainModel.getElevation();
JFrame frame = new JFrame();
TerrainViewerJComponent jComponent = new TerrainViewerJComponent(elevationMacro);
frame.add(jComponent);
frame.addKeyListener(new TerrainViewerKeyListener(jComponent));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(0, 0, 600, 600);
frame.setVisible(true);
while(true){
frame.repaint();
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,67 @@
package electrosphere.util.worldviewer;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;
/**
*
* @author amaterasu
*/
public class TerrainViewerJComponent extends JComponent {
float elevationMap[][];
float maxHeight = 0;
int dimX;
int dimY;
int viewerOffsetX = 0;
int viewerOffsetY = 0;
public TerrainViewerJComponent(float[][] elevationMap){
this.elevationMap = elevationMap;
dimX = elevationMap.length;
dimY = elevationMap[0].length;
for(int x = 0; x < dimX; x++){
for(int y = 0; y < dimY; y++){
if(elevationMap[x][y] > maxHeight){
maxHeight = elevationMap[x][y];
}
}
}
}
@Override
public void paint(Graphics g){
g.clearRect(0, 0, 600, 600);
for(int x = 0; x < dimX/4; x++){
for(int y = 0; y < dimY/4; y++){
g.setColor(new Color(
(int)(255 * elevationMap[x*4][y*4] / maxHeight),
(int)(255 * elevationMap[x*4][y*4] / maxHeight),
(int)(255 * elevationMap[x*4][y*4] / maxHeight)
));
g.drawRect(x - viewerOffsetX, y - viewerOffsetY, 1, 1);
}
}
}
public void addViewerOffsetX(){
viewerOffsetX = viewerOffsetX + 10;
}
public void removeViewerOffsetX(){
viewerOffsetX = viewerOffsetX - 10;
}
public void addViewerOffsetY(){
viewerOffsetY = viewerOffsetY + 10;
}
public void removeViewerOffsetY(){
viewerOffsetY = viewerOffsetY - 10;
}
}

View File

@ -0,0 +1,43 @@
package electrosphere.util.worldviewer;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/**
*
* @author amaterasu
*/
public class TerrainViewerKeyListener implements KeyListener {
TerrainViewerJComponent jComponent;
public TerrainViewerKeyListener(TerrainViewerJComponent jComponent){
this.jComponent = jComponent;
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_RIGHT:
jComponent.addViewerOffsetX();
break;
case KeyEvent.VK_LEFT:
jComponent.removeViewerOffsetX();
break;
case KeyEvent.VK_UP:
jComponent.removeViewerOffsetY();
break;
case KeyEvent.VK_DOWN:
jComponent.addViewerOffsetY();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {}
}

View File

@ -289,8 +289,8 @@
{
"messageName" : "Create",
"data" : [
"creatureType",
"entityID",
"creatureType",
"positionX",
"positionY",
"positionZ"
@ -299,8 +299,8 @@
{
"messageName" : "SetPosition",
"data" : [
"time",
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
@ -309,8 +309,9 @@
{
"messageName" : "Move",
"data" : [
"time",
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
@ -325,8 +326,9 @@
{
"messageName" : "SetBehaviorTree",
"data" : [
"time",
"entityID",
"time",
"treeType",
"treeStatus"
]
@ -334,8 +336,8 @@
{
"messageName" : "setProperty",
"data" : [
"time",
"entityID",
"time",
"propertyType",
"propertyValue"
]