networking architecture/documentation overhaul

This commit is contained in:
austin 2022-04-21 22:14:29 -04:00
parent aa6bfe796d
commit 0bc7091bf2
56 changed files with 3261 additions and 1746 deletions

6
.gitignore vendored
View File

@ -11,6 +11,7 @@
/nb-configuration.xml
/Telephone-*.jar
/NetArranger-*.jar
/hs_err_pid*
.classpath
@ -21,4 +22,7 @@
.dbeaver
#windows nonense
/**/Thumbs.db
/**/Thumbs.db
#docs backup files
/docs/~$NetworkFlow.drawio.bkp

View File

@ -5,6 +5,7 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.problem.unusedImport=ignore
org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=disabled
org.eclipse.jdt.core.compiler.source=17

1
docs/NetworkFlow.drawio Normal file

File diff suppressed because one or more lines are too long

195
net/entity.json Normal file
View File

@ -0,0 +1,195 @@
{
"outputPath" : "./src/main/java/electrosphere/net/parser/",
"packageName" : "electrosphere.net.parser",
"categories":[
{
"categoryName" : "Entity",
"data" : [
{
"name" : "entityCategory",
"type" : "FIXED_INT"
},
{
"name" : "entitySubtype",
"type" : "VAR_STRING"
},
{
"name" : "entityID",
"type" : "FIXED_INT"
},
{
"name" : "positionX",
"type" : "FIXED_DOUBLE"
},
{
"name" : "positionY",
"type" : "FIXED_DOUBLE"
},
{
"name" : "positionZ",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationW",
"type" : "FIXED_FLOAT"
},
{
"name" : "rotationX",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationY",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationZ",
"type" : "FIXED_DOUBLE"
},
{
"name" : "velocity",
"type" : "FIXED_DOUBLE"
},
{
"name" : "treeState",
"type" : "FIXED_INT"
},
{
"name" : "propertyType",
"type" : "FIXED_INT"
},
{
"name" : "propertyValue",
"type" : "FIXED_INT"
},
{
"name" : "treeType",
"type" : "FIXED_INT"
},
{
"name" : "treeStatus",
"type" : "FIXED_INT"
},
{
"name" : "time",
"type" : "FIXED_LONG"
},
{
"name" : "bone",
"type" : "VAR_STRING"
},
{
"name" : "targetID",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
{
"messageName" : "Create",
"data" : [
"entityID",
"entityCategory",
"entitySubtype",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "SetPosition",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "setFacing",
"data" : [
"entityID",
"time",
"rotationX",
"rotationY",
"rotationZ"
]
},
{
"messageName" : "moveUpdate",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ",
"rotationX",
"rotationY",
"rotationZ",
"velocity",
"treeState"
]
},
{
"messageName" : "attackUpdate",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ",
"rotationX",
"rotationY",
"rotationZ",
"velocity",
"treeState"
]
},
{
"messageName" : "Move",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "Destroy",
"data" : [
"entityID"
]
},
{
"messageName" : "SetBehaviorTree",
"data" : [
"entityID",
"time",
"treeType",
"treeStatus"
]
},
{
"messageName" : "setProperty",
"data" : [
"entityID",
"time",
"propertyType",
"propertyValue"
]
},
{
"messageName" : "attachEntityToEntity",
"data" : [
"entityID",
"bone",
"targetID"
]
}
]
}
]
}

49
net/lore.json Normal file
View File

@ -0,0 +1,49 @@
{
"outputPath" : "./src/main/java/electrosphere/net/parser/",
"packageName" : "electrosphere.net.parser",
"categories":[
{
"categoryName" : "Lore",
"data" : [
{
"name" : "data",
"type" : "VAR_STRING"
}
],
"messageTypes" : [
{
"messageName" : "RequestRaces",
"data" : []
},
{
"messageName" : "ResponseRaces",
"data" : [
"data"
]
},
{
"messageName" : "RequestRaceData",
"data" : []
},
{
"messageName" : "ResponseRaceData",
"data" : [
"data"
]
},
{
"messageName" : "RequestData",
"data" : [
"data"
]
},
{
"messageName" : "ResponseData",
"data" : [
"data"
]
}
]
}
]
}

79
net/player.json Normal file
View File

@ -0,0 +1,79 @@
{
"outputPath" : "./src/main/java/electrosphere/net/parser/",
"packageName" : "electrosphere.net.parser",
"categories":[
{
"categoryName" : "Character",
"data" : [
{
"name" : "data",
"type" : "VAR_STRING"
}
],
"messageTypes" : [
{
"messageName" : "RequestCharacterList",
"data" : []
},
{
"messageName" : "ResponseCharacterList",
"data" : [
"data"
]
},
{
"messageName" : "RequestCreateCharacter",
"data" : []
},
{
"messageName" : "ResponseCreateCharacter",
"data" : [
"data"
]
},
{
"messageName" : "RequestSpawnCharacter",
"data" : []
},
{
"messageName" : "ResponseSpawnCharacter",
"data" : [
"data"
]
}
]
},
{
"categoryName" : "Player",
"data" : [
{
"name" : "playerID",
"type" : "FIXED_INT"
},
{
"name" : "initialDiscretePositionX",
"type" : "FIXED_INT"
},
{
"name" : "initialDiscretePositionY",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
{
"messageName" : "Set_ID",
"data" : [
"playerID"
]
},
{
"messageName" : "SetInitialDiscretePosition",
"data" : [
"initialDiscretePositionX",
"initialDiscretePositionY"
]
}
]
}
]
}

60
net/server.json Normal file
View File

@ -0,0 +1,60 @@
{
"outputPath" : "./src/main/java/electrosphere/net/parser/",
"packageName" : "electrosphere.net.parser",
"categories":[
{
"categoryName" : "Server",
"data" : [
],
"messageTypes" : [
{
"messageName" : "Ping",
"data" : []
},
{
"messageName" : "Pong",
"data" : []
}
]
},
{
"categoryName" : "Auth",
"data" : [
{
"name" : "user",
"type" : "VAR_STRING"
},
{
"name" : "pass",
"type" : "VAR_STRING"
}
],
"messageTypes" : [
{
"messageName" : "AuthRequest",
"data" : []
},
{
"messageName" : "AuthDetails",
"data" : [
"user",
"pass"
]
},
{
"messageName" : "AuthSuccess",
"data" : []
},
{
"messageName" : "AuthFailure",
"data" : []
}
]
}
]
}

396
net/terrain.json Normal file
View File

@ -0,0 +1,396 @@
{
"outputPath" : "./src/main/java/electrosphere/net/parser/",
"packageName" : "electrosphere.net.parser",
"categories":[
{
"categoryName" : "Terrain",
"data" : [
{
"name" : "worldSizeDiscrete",
"type" : "FIXED_INT"
},
{
"name" : "dynamicInterpolationRatio",
"type" : "FIXED_INT"
},
{
"name" : "randomDampener",
"type" : "FIXED_FLOAT"
},
{
"name" : "worldMinX",
"type" : "FIXED_INT"
},
{
"name" : "worldMinY",
"type" : "FIXED_INT"
},
{
"name" : "worldMaxX",
"type" : "FIXED_INT"
},
{
"name" : "worldMaxY",
"type" : "FIXED_INT"
},
{
"name" : "worldX",
"type" : "FIXED_INT"
},
{
"name" : "worldY",
"type" : "FIXED_INT"
},
{
"name" : "value",
"type" : "FIXED_FLOAT"
},
{
"name" : "locationX",
"type" : "FIXED_INT"
},
{
"name" : "locationY",
"type" : "FIXED_INT"
},
{
"name" : "realLocationX",
"type" : "FIXED_FLOAT"
},
{
"name" : "realLocationY",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue00",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue01",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue02",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue03",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue04",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue10",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue11",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue12",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue13",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue14",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue20",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue21",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue22",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue23",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue24",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue30",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue31",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue32",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue33",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue34",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue40",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue41",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue42",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue43",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue44",
"type" : "FIXED_FLOAT"
},
{
"name" : "randomizerValue00",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue01",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue02",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue03",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue04",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue10",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue11",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue12",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue13",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue14",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue20",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue21",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue22",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue23",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue24",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue30",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue31",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue32",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue33",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue34",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue40",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue41",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue42",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue43",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue44",
"type" : "FIXED_LONG"
}
],
"messageTypes" : [
{
"messageName" : "RequestMetadata",
"data" : []
},
{
"messageName" : "ResponseMetadata",
"data" : [
"worldSizeDiscrete",
"dynamicInterpolationRatio",
"randomDampener",
"worldMinX",
"worldMinY",
"worldMaxX",
"worldMaxY"
]
},
{
"messageName" : "RequestChunk",
"data" : [
"worldX",
"worldY"
]
},
{
"messageName" : "Update",
"data" : [
"locationX",
"locationY"
]
},
{
"messageName" : "chunkLoadStart",
"data" : [
"worldX",
"worldY",
"value"
]
},
{
"messageName" : "MacroValue",
"data" : [
"worldX",
"worldY",
"macroValue00",
"macroValue01",
"macroValue02",
"macroValue03",
"macroValue04",
"macroValue10",
"macroValue11",
"macroValue12",
"macroValue13",
"macroValue14",
"macroValue20",
"macroValue21",
"macroValue22",
"macroValue23",
"macroValue24",
"macroValue30",
"macroValue31",
"macroValue32",
"macroValue33",
"macroValue34",
"macroValue40",
"macroValue41",
"macroValue42",
"macroValue43",
"macroValue44",
"randomizerValue00",
"randomizerValue01",
"randomizerValue02",
"randomizerValue03",
"randomizerValue04",
"randomizerValue10",
"randomizerValue11",
"randomizerValue12",
"randomizerValue13",
"randomizerValue14",
"randomizerValue20",
"randomizerValue21",
"randomizerValue22",
"randomizerValue23",
"randomizerValue24",
"randomizerValue30",
"randomizerValue31",
"randomizerValue32",
"randomizerValue33",
"randomizerValue34",
"randomizerValue40",
"randomizerValue41",
"randomizerValue42",
"randomizerValue43",
"randomizerValue44"
]
},
{
"messageName" : "heightMapModification",
"data" : [
"value",
"worldX",
"worldY",
"locationX",
"locationY"
]
},
{
"messageName" : "SpawnPosition",
"data" : [
"realLocationX",
"realLocationY"
]
}
]
}
]
}

View File

@ -0,0 +1,12 @@
package electrosphere.auth;
public class AuthenticationManager {
public boolean authenticate(String username, String password){
boolean rVal = true;
//TODO: actually authenticate
return rVal;
}
}

View File

@ -50,7 +50,7 @@ public class CameraHandler {
// CameraEntityUtils.setCameraCenter(Globals.playerCamera, new Vector3f((float)charPos.x,(float)charPos.y,(float)charPos.z));
// }
Vector3d characterPos = EntityUtils.getPosition(Globals.playerCharacter);
Vector3d characterPos = EntityUtils.getPosition(Globals.playerEntity);
Vector3d targetPos = Crosshair.getTargetPosition();
Vector3d diffed = new Vector3d(targetPos).sub(characterPos).mul(-1).normalize();
cameraRotationVector.set((float)diffed.x, 0.5f, (float)diffed.z).normalize();

View File

@ -334,46 +334,46 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD));
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).isState()){
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/4.0).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
} else if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).isState()){
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/4.0).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
} else {
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).isState()){
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/4.0).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
} else if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).isState()){
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/4.0).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
} else {
Vector3d newFacingVector = new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize();
CreatureUtils.setFacingVector(Globals.playerCharacter, newFacingVector);
CreatureUtils.setFacingVector(Globals.playerEntity, newFacingVector);
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -382,40 +382,40 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD));
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).isState()){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(3.0/4.0*Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(3.0/4.0*Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
} else if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).isState()){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(5.0/4.0*Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(5.0/4.0*Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
} else {
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).isState()){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(3.0/4.0*Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(3.0/4.0*Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
} else if(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).isState()){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(5.0/4.0*Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(5.0/4.0*Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
} else {
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -424,34 +424,34 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT));
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).getKeyValue()))
){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/2.0).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/2.0).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).getKeyValue()))
){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/2.0).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(Math.PI/2.0).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_LEFT).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -460,34 +460,34 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT));
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).getKeyValue()))
){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/2.0).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/2.0).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
if(
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_BACKWARD).getKeyValue()))
){
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/2.0).normalize());
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).rotateY(-Math.PI/2.0).normalize());
movementTree.start(MovementRelativeFacing.FORWARD);
}
}
}});
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_RIGHT).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -505,10 +505,10 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_STRAFE_LEFT));
controls.get(DATA_STRING_INPUT_CODE_STRAFE_LEFT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
if(
(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
@ -519,10 +519,10 @@ public class ControlHandler {
}
}});
controls.get(DATA_STRING_INPUT_CODE_STRAFE_LEFT).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
if(
(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
@ -533,8 +533,8 @@ public class ControlHandler {
}
}});
controls.get(DATA_STRING_INPUT_CODE_STRAFE_LEFT).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -543,10 +543,10 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_STRAFE_RIGHT));
controls.get(DATA_STRING_INPUT_CODE_STRAFE_RIGHT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
if(
(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
@ -557,10 +557,10 @@ public class ControlHandler {
}
}});
controls.get(DATA_STRING_INPUT_CODE_STRAFE_RIGHT).setOnRepeat(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
CreatureUtils.setFacingVector(Globals.playerEntity, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z));
if(
(movementTree.getState()==MovementTreeState.IDLE || movementTree.getState()==MovementTreeState.SLOWDOWN) &&
(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).isIsKey() && !Globals.controlCallback.getKey(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_FORWARD).getKeyValue())) &&
@ -571,8 +571,8 @@ public class ControlHandler {
}
}});
controls.get(DATA_STRING_INPUT_CODE_STRAFE_RIGHT).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
GroundMovementTree movementTree = CreatureUtils.getEntityMovementTree(Globals.playerEntity);
movementTree.slowdown();
}
}});
@ -582,8 +582,8 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP));
controls.get(DATA_STRING_INPUT_CODE_MOVEMENT_JUMP).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
JumpTree jumpTree = JumpTree.getJumpTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
JumpTree jumpTree = JumpTree.getJumpTree(Globals.playerEntity);
if(jumpTree != null){
jumpTree.start();
}
@ -594,16 +594,16 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(INPUT_CODE_SPRINT));
controls.get(INPUT_CODE_SPRINT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
SprintTree sprintTree = CreatureUtils.getSprintTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
SprintTree sprintTree = CreatureUtils.getSprintTree(Globals.playerEntity);
if(sprintTree != null){
sprintTree.start();
}
}
}});
controls.get(INPUT_CODE_SPRINT).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
SprintTree sprintTree = CreatureUtils.getSprintTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
SprintTree sprintTree = CreatureUtils.getSprintTree(Globals.playerEntity);
if(sprintTree != null){
sprintTree.stop();
}
@ -612,16 +612,16 @@ public class ControlHandler {
mainGameControlList.add(controls.get(INPUT_CODE_IRON_SIGHT));
controls.get(INPUT_CODE_IRON_SIGHT).setOnPress(new ControlMethod() {public void execute() {
if(Globals.playerCharacter != null){
IronSightTree ironSightTree = IronSightTree.getIronSightTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
IronSightTree ironSightTree = IronSightTree.getIronSightTree(Globals.playerEntity);
if(ironSightTree != null){
ironSightTree.start();
}
}
}});
controls.get(INPUT_CODE_IRON_SIGHT).setOnRelease(new ControlMethod() {public void execute() {
if(Globals.playerCharacter != null){
IronSightTree ironSightTree = IronSightTree.getIronSightTree(Globals.playerCharacter);
if(Globals.playerEntity != null){
IronSightTree ironSightTree = IronSightTree.getIronSightTree(Globals.playerEntity);
if(ironSightTree != null){
ironSightTree.release();
}
@ -633,10 +633,10 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(INPUT_CODE_INTERACT));
controls.get(INPUT_CODE_INTERACT).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
if(Globals.playerCharacter.containsKey(EntityDataStrings.EQUIP_STATE) && Crosshair.hasTarget()){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){
InventoryUtils.attemptStoreItem(Globals.playerCharacter, Crosshair.getTarget());
if(Globals.playerEntity != null){
if(Globals.playerEntity.containsKey(EntityDataStrings.EQUIP_STATE) && Crosshair.hasTarget()){
if(InventoryUtils.hasNaturalInventory(Globals.playerEntity)){
InventoryUtils.attemptStoreItem(Globals.playerEntity, Crosshair.getTarget());
// UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
// inventory.addItem(Crosshair.getTarget());
}
@ -651,14 +651,14 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(INPUT_CODE_DROP));
controls.get(INPUT_CODE_DROP).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
if(Globals.playerCharacter.containsKey(EntityDataStrings.EQUIP_STATE)){
if(Globals.playerEntity != null){
if(Globals.playerEntity.containsKey(EntityDataStrings.EQUIP_STATE)){
// EquipState equipState = (EquipState)Globals.playerCharacter.getData(EntityDataStrings.EQUIP_STATE);
// equipState.drop();
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerEntity);
if(inventory.getItems().size() > 0){
Entity itemToDrop = inventory.getItems().get(0);
InventoryUtils.attemptEjectItem(Globals.playerCharacter,itemToDrop);
InventoryUtils.attemptEjectItem(Globals.playerEntity,itemToDrop);
}
}
}
@ -669,9 +669,9 @@ public class ControlHandler {
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY));
controls.get(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY).setOnPress(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
if(Globals.playerEntity != null){
// Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
AttackTree attackTree = CreatureUtils.getAttackTree(Globals.playerCharacter);
AttackTree attackTree = CreatureUtils.getAttackTree(Globals.playerEntity);
if(attackTree != null){
// CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize());
attackTree.start();
@ -679,9 +679,9 @@ public class ControlHandler {
}
}});
controls.get(DATA_STRING_INPUT_CODE_ATTACK_PRIMARY).setOnRelease(new ControlMethod(){public void execute(){
if(Globals.playerCharacter != null){
if(Globals.playerEntity != null){
// Vector3f cameraEyeVector = CameraEntityUtils.getCameraEye(Globals.playerCamera);
AttackTree attackTree = CreatureUtils.getAttackTree(Globals.playerCharacter);
AttackTree attackTree = CreatureUtils.getAttackTree(Globals.playerEntity);
if(attackTree != null){
// CreatureUtils.setFacingVector(Globals.playerCharacter, new Vector3d(-cameraEyeVector.x,0,-cameraEyeVector.z).normalize());
attackTree.release();
@ -735,9 +735,9 @@ public class ControlHandler {
mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerCharacter).getId())) == null){
if(InventoryUtils.hasNaturalInventory(Globals.playerEntity) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerEntity).getId())) == null){
//create window
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerEntity);
Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory);
//register
Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow);
@ -758,9 +758,9 @@ public class ControlHandler {
mainGameControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
inventoryControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
controls.get(INPUT_CODE_CHARACTER_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasEquipInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){
if(InventoryUtils.hasEquipInventory(Globals.playerEntity) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){
//create window
Window mainMenuWindow = MenuGenerators.createCharacterMenu(InventoryUtils.getEquipInventory(Globals.playerCharacter));
Window mainMenuWindow = MenuGenerators.createCharacterMenu(InventoryUtils.getEquipInventory(Globals.playerEntity));
//register
Globals.elementManager.registerWindow(WindowStrings.WINDOW_CHARACTER, mainMenuWindow);
//make visible

View File

@ -1,5 +1,6 @@
package electrosphere.engine;
import electrosphere.auth.AuthenticationManager;
import electrosphere.collision.dispatch.CollisionObject;
import electrosphere.controls.ControlHandler;
import electrosphere.entity.Entity;
@ -158,6 +159,7 @@ public class LoadingThread extends Thread {
//initialize the server thread (server only)
if(Globals.RUN_SERVER){
initServerThread();
initAuthenticationManager();
}
//initialize the "virtual" objects simulation
@ -189,12 +191,12 @@ public class LoadingThread extends Thread {
initGameGraphicalEntities();
while(Globals.clientConnection.getClientProtocol().isLoading()){
try {
TimeUnit.MILLISECONDS.sleep(5);
} catch (InterruptedException ex) {
}
}
// while(Globals.clientConnection.getClientProtocol().isLoading()){
// try {
// TimeUnit.MILLISECONDS.sleep(5);
// } catch (InterruptedException ex) {
// }
// }
setSimulationsToReady();
@ -246,6 +248,7 @@ public class LoadingThread extends Thread {
//initialize the server thread (server only)
if(Globals.RUN_SERVER){
initServerThread();
initAuthenticationManager();
}
//collision engine
@ -277,12 +280,12 @@ public class LoadingThread extends Thread {
creatingRandomEntities();
while(Globals.clientConnection.getClientProtocol().isLoading()){
try {
TimeUnit.MILLISECONDS.sleep(5);
} catch (InterruptedException ex) {
}
}
// while(Globals.clientConnection.getClientProtocol().isLoading()){
// try {
// TimeUnit.MILLISECONDS.sleep(5);
// } catch (InterruptedException ex) {
// }
// }
setSimulationsToReady();
@ -427,6 +430,12 @@ public class LoadingThread extends Thread {
Globals.serverThread.start();
}
}
static void initAuthenticationManager(){
if(Globals.RUN_SERVER){
Globals.authenticationManager = new AuthenticationManager();
}
}
@ -442,13 +451,13 @@ public class LoadingThread extends Thread {
static void stallForClientPlayerData(){
while(!Globals.clientPlayerData.hasLoaded()){
try {
TimeUnit.MILLISECONDS.sleep(5);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
// while(!Globals.clientPlayerData.hasLoaded()){
// try {
// TimeUnit.MILLISECONDS.sleep(5);
// } catch (InterruptedException ex) {
// ex.printStackTrace();
// }
// }
}
@ -563,7 +572,7 @@ public class LoadingThread extends Thread {
Player Camera
*/
Globals.playerCamera = CameraEntityUtils.spawnEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0), Globals.playerCharacter);
Globals.playerCamera = CameraEntityUtils.spawnEntityTrackingCameraEntity(new Vector3f(1,0,1), new Vector3f(0,0,0), Globals.playerEntity);

View File

@ -262,8 +262,8 @@ public class EntityManager {
}
public void clearOutOfBoundsEntities(){
if(Globals.commonWorldData != null && Globals.playerCharacter != null && Globals.clientPlayerData != null){
Vector3d playerCharacterPos = EntityUtils.getPosition(Globals.playerCharacter);
if(Globals.commonWorldData != null && Globals.playerEntity != null && Globals.clientPlayerData != null){
Vector3d playerCharacterPos = EntityUtils.getPosition(Globals.playerEntity);
int playerCharacterWorldX = Globals.commonWorldData.convertRealToWorld(playerCharacterPos.x);
int playerCharacterWorldY = Globals.commonWorldData.convertRealToWorld(playerCharacterPos.z);
if(playerCharacterWorldX != Globals.clientPlayerData.getWorldPositionX() || playerCharacterWorldY != Globals.clientPlayerData.getWorldPositionY()){

View File

@ -79,7 +79,7 @@ public class RotatorTree implements BehaviorTree{
// Vector3f rotationAxis = new Vector3f((float)facingVector.x,(float)facingVector.y,(float)facingVector.z).rotateY((float)Math.PI/2.0f).normalize();
Vector3f rotationAxis = new Vector3f(1,0,0);
float rotationRaw = 0.0f;
if(parent == Globals.playerCharacter){
if(parent == Globals.playerEntity){
rotationRaw = Globals.cameraHandler.getPitch();
} else {
rotationRaw = ViewUtils.getPitch(parent);

View File

@ -45,7 +45,7 @@ import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.Player;
import electrosphere.net.server.player.Player;
import electrosphere.renderer.Model;
import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorBoneRotator;

View File

@ -21,7 +21,7 @@ import electrosphere.game.data.item.type.WeaponData;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.Player;
import electrosphere.net.server.player.Player;
import electrosphere.renderer.Model;
import electrosphere.renderer.actor.Actor;
import electrosphere.renderer.actor.ActorUtils;

View File

@ -10,7 +10,8 @@ import electrosphere.game.data.structure.type.model.StructureType;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.Player;
import electrosphere.net.server.player.Player;
import org.joml.Matrix4f;
import org.joml.Quaternionf;
import org.joml.Vector3d;

View File

@ -19,8 +19,8 @@ public class ClientFunctions {
public static void runBeforeSimulationFunctions(){
//cell tracking values
if(Globals.RUN_CLIENT){
if(Globals.playerCharacter != null){
oldPlayerCharacterPosition = new Vector3d(EntityUtils.getPosition(Globals.playerCharacter));
if(Globals.playerEntity != null){
oldPlayerCharacterPosition = new Vector3d(EntityUtils.getPosition(Globals.playerEntity));
}
}
}
@ -35,14 +35,14 @@ public class ClientFunctions {
}
static void updateSkyboxPos(){
if(Globals.skybox != null && Globals.playerCharacter != null){
if(Globals.skybox != null && Globals.playerEntity != null){
// Vector3f skyboxPos = EntityUtils.getPosition(Globals.skybox);
//
// Vector3f playerCameraPos = EntityUtils.getPosition(Globals.playerCamera);
// if(skyboxPos != null && playerCameraPos != null){
// skyboxPos.set(playerCameraPos);
// }
EntityUtils.getPosition(Globals.skybox).set(EntityUtils.getPosition(Globals.playerCharacter));
EntityUtils.getPosition(Globals.skybox).set(EntityUtils.getPosition(Globals.playerEntity));
}
}
@ -51,8 +51,8 @@ public class ClientFunctions {
/// C L I E N T C E L L M A N A G E R
///
if(Globals.drawCellManager != null){
if(Globals.playerCharacter != null){
newPlayerCharacterPosition = EntityUtils.getPosition(Globals.playerCharacter);
if(Globals.playerEntity != null){
newPlayerCharacterPosition = EntityUtils.getPosition(Globals.playerEntity);
}
//Cell manager do your things
Globals.drawCellManager.calculateDeltas(oldPlayerCharacterPosition, newPlayerCharacterPosition);

View File

@ -4,7 +4,7 @@ import electrosphere.game.client.terrain.manager.ClientTerrainManager;
import electrosphere.game.server.terrain.manager.ServerTerrainManager;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.WorldMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.renderer.ShaderProgram;
import java.util.Arrays;
import java.util.HashMap;
@ -171,7 +171,7 @@ public class DrawCellManager {
} else {
if(hasRequested[targetX][targetY] == false){
//client should request macro values from server
Globals.clientConnection.queueOutgoingMessage(WorldMessage.constructRequestChunkMessage(currentCellX, currentCellY));
Globals.clientConnection.queueOutgoingMessage(TerrainMessage.constructRequestChunkMessage(currentCellX, currentCellY));
hasRequested[targetX][targetY] = true;
}
}

View File

@ -28,8 +28,8 @@ public class Crosshair {
static final float TARGET_MAX_DIST = 1;
public static void checkTargetable(){
if(crossHairEntity != null && Globals.playerCharacter != null){
Vector3d parentPos = EntityUtils.getPosition(Globals.playerCharacter);
if(crossHairEntity != null && Globals.playerEntity != null){
Vector3d parentPos = EntityUtils.getPosition(Globals.playerEntity);
// if(currentTarget == null){
if(!crosshairActive){
Entity target = null;
@ -38,7 +38,7 @@ public class Crosshair {
Vector3d entityPos = EntityUtils.getPosition(entity);
double currentDist = parentPos.distance(entityPos);
double currentAngleDiff = new Vector3d(entityPos).sub(parentPos).normalize().dot(new Vector3d(CameraEntityUtils.getCameraEye(Globals.playerCamera)));
if(currentDist + currentAngleDiff < dist && currentDist <= TARGET_MAX_DIST && entity != Globals.playerCharacter){
if(currentDist + currentAngleDiff < dist && currentDist <= TARGET_MAX_DIST && entity != Globals.playerEntity){
target = entity;
dist = currentDist + currentAngleDiff;
}

View File

@ -5,7 +5,7 @@ import electrosphere.game.client.terrain.cache.LoadingChunk;
import electrosphere.game.client.terrain.cache.LoadingChunkCache;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.logger.LoggerInterface;
import electrosphere.net.parser.net.message.WorldMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@ -13,7 +13,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
public class ClientTerrainManager {
//queues messages from server
List<WorldMessage> messageQueue = new CopyOnWriteArrayList<WorldMessage>();
List<TerrainMessage> messageQueue = new CopyOnWriteArrayList<TerrainMessage>();
//caches chunks from server
@ -37,8 +37,8 @@ public class ClientTerrainManager {
public void handleMessages(){
List<WorldMessage> bouncedMessages = new LinkedList<WorldMessage>();
for(WorldMessage message : messageQueue){
List<TerrainMessage> bouncedMessages = new LinkedList<TerrainMessage>();
for(TerrainMessage message : messageQueue){
messageQueue.remove(message);
switch(message.getMessageSubtype()){
case MACROVALUE:
@ -125,12 +125,12 @@ public class ClientTerrainManager {
break;
}
}
for(WorldMessage message : bouncedMessages){
for(TerrainMessage message : bouncedMessages){
messageQueue.add(message);
}
}
public void attachWorldMessage(WorldMessage message){
public void attachTerrainMessage(TerrainMessage message){
messageQueue.add(message);
}

View File

@ -7,7 +7,8 @@ import electrosphere.game.server.world.ServerWorldData;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.Player;
import electrosphere.net.server.player.Player;
import java.util.LinkedList;
import java.util.List;
import org.joml.Vector3d;

View File

@ -4,12 +4,13 @@ import electrosphere.entity.Entity;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.entity.types.structure.StructureUtils;
import electrosphere.net.server.Player;
import electrosphere.game.server.character.Character;
import electrosphere.game.server.pathfinding.NavMeshUtils;
import electrosphere.game.server.pathfinding.navmesh.NavMesh;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.player.Player;
import java.util.LinkedList;
import java.util.List;

View File

@ -19,7 +19,7 @@ public class LoggerInterface {
public static void initLoggers(){
loggerStartup = new Logger(LogLevel.WARNING);
loggerNetworking = new Logger(LogLevel.WARNING);
loggerNetworking = new Logger(LogLevel.DEBUG);
loggerFileIO = new Logger(LogLevel.WARNING);
loggerGameLogic = new Logger(LogLevel.WARNING);
loggerRenderer = new Logger(LogLevel.WARNING);

View File

@ -8,6 +8,7 @@ import electrosphere.renderer.texture.Texture;
import electrosphere.renderer.texture.TextureMap;
import com.google.gson.Gson;
import electrosphere.audio.AudioEngine;
import electrosphere.auth.AuthenticationManager;
import electrosphere.controls.CameraHandler;
import electrosphere.controls.ControlCallback;
import electrosphere.controls.ControlHandler;
@ -44,9 +45,9 @@ import electrosphere.menu.MenuGenerators;
import electrosphere.menu.WindowStrings;
import electrosphere.menu.WindowUtils;
import electrosphere.net.client.ClientNetworking;
import electrosphere.net.server.Player;
import electrosphere.net.server.PlayerManager;
import electrosphere.net.server.Server;
import electrosphere.net.server.player.Player;
import electrosphere.net.server.player.PlayerManager;
import electrosphere.renderer.ModelUtils;
import electrosphere.renderer.RenderUtils;
import electrosphere.renderer.RenderingEngine;
@ -119,6 +120,11 @@ public class Globals {
public static Thread serverThread;
public static Server server;
public static boolean RUN_SERVER = true;
//
//Authentication manager
//
public static AuthenticationManager authenticationManager;
//
@ -296,7 +302,7 @@ public class Globals {
public static Entity playerCamera;
//the creature the player camera will orbit and will receive controlHandler movementTree updates
public static Entity playerCharacter;
public static Entity playerEntity;
//skybox entity
public static Entity skybox;

View File

@ -408,7 +408,7 @@ public class MenuGenerators {
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
InventoryUtils.attemptEjectItem(Globals.playerEntity,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId());
@ -420,7 +420,7 @@ public class MenuGenerators {
} else if(Globals.dragSourceInventory instanceof RelationalInventoryState){
RelationalInventoryState inventory = (RelationalInventoryState) Globals.dragSourceInventory;
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
InventoryUtils.attemptEjectItem(Globals.playerEntity,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowStrings.WINDOW_CHARACTER;
@ -604,14 +604,14 @@ public class MenuGenerators {
scrollable.addChild(toggleDrawPlayerButton);
toggleDrawPlayerButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
// Main.running = false;
if(Globals.playerCharacter != null){
if(Globals.playerCharacter.containsKey(EntityDataStrings.DATA_STRING_DRAW)){
boolean draw = (boolean)Globals.playerCharacter.getData(EntityDataStrings.DATA_STRING_DRAW);
Globals.playerCharacter.putData(EntityDataStrings.DATA_STRING_DRAW, !draw);
if(Globals.playerEntity != null){
if(Globals.playerEntity.containsKey(EntityDataStrings.DATA_STRING_DRAW)){
boolean draw = (boolean)Globals.playerEntity.getData(EntityDataStrings.DATA_STRING_DRAW);
Globals.playerEntity.putData(EntityDataStrings.DATA_STRING_DRAW, !draw);
}
if(Globals.playerCharacter.containsKey(EntityDataStrings.DRAW_CAST_SHADOW)){
boolean drawShadow = (boolean)Globals.playerCharacter.getData(EntityDataStrings.DRAW_CAST_SHADOW);
Globals.playerCharacter.putData(EntityDataStrings.DRAW_CAST_SHADOW, !drawShadow);
if(Globals.playerEntity.containsKey(EntityDataStrings.DRAW_CAST_SHADOW)){
boolean drawShadow = (boolean)Globals.playerEntity.getData(EntityDataStrings.DRAW_CAST_SHADOW);
Globals.playerEntity.putData(EntityDataStrings.DRAW_CAST_SHADOW, !drawShadow);
}
}
return false;
@ -808,7 +808,7 @@ public class MenuGenerators {
ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item));
}
//eject from equip state
InventoryUtils.attemptDestroyItem(Globals.playerCharacter,item);
InventoryUtils.attemptDestroyItem(Globals.playerEntity,item);
//add to unrelational
sourceInventory.tryRemoveItem(item);
inventory.addItem(item);
@ -973,7 +973,7 @@ public class MenuGenerators {
//bind in world with in inventory
ItemUtils.setRealWorldEntity(item, inWorldItem);
//fire equip event to equip state
EquipState equipState = (EquipState)Globals.playerCharacter.getData(EntityDataStrings.EQUIP_STATE);
EquipState equipState = (EquipState)Globals.playerEntity.getData(EntityDataStrings.EQUIP_STATE);
equipState.attemptEquip(inWorldItem,inventory.getEquipPointFromSlot(slots.get(itemId)));
GravityUtils.attemptDeactivateGravity(inWorldItem);
}

View File

@ -6,6 +6,7 @@ import electrosphere.entity.EntityUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.client.protocol.ClientProtocol;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
@ -96,7 +97,7 @@ public class ClientNetworking implements Runnable{
if(initialized){
while(parser.hasIncomingMessaage()){
NetworkMessage message = parser.popIncomingMessage();
LoggerInterface.loggerNetworking.DEBUG("New message " + message.getType());
LoggerInterface.loggerNetworking.DEBUG("[Client] New message " + message.getType());
//do something
clientProtocol.handleMessage(message);
}

View File

@ -0,0 +1,34 @@
package electrosphere.net.client.protocol;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.AuthMessage;
import electrosphere.net.parser.net.message.CharacterMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
public class AuthProtocol {
protected static void handleAuthenticationMessage(AuthMessage message){
switch(message.getMessageSubtype()){
case AUTHREQUEST:
//Try login
//TODO: actually get user/pass
Globals.clientConnection.queueOutgoingMessage(AuthMessage.constructAuthDetailsMessage("myuser","mypass"));
break;
case AUTHSUCCESS:
//trigger request to spawn character
Globals.clientConnection.queueOutgoingMessage(TerrainMessage.constructRequestMetadataMessage());
Globals.clientConnection.queueOutgoingMessage(CharacterMessage.constructRequestSpawnCharacterMessage());
break;
case AUTHFAILURE:
//TODO: handle better
LoggerInterface.loggerEngine.ERROR("Auth failure",new Exception("Auth failure"));
break;
//ignore stack
case AUTHDETAILS:
//silently ignore
break;
}
}
}

View File

@ -0,0 +1,70 @@
package electrosphere.net.client.protocol;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.parser.net.message.AuthMessage;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.parser.net.message.ServerMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
import org.joml.Vector2f;
import org.joml.Vector3f;
public class ClientProtocol {
boolean isLoading = true;
boolean hasReceivedWorld = false;
public void handleMessage(NetworkMessage message){
switch(message.getType()){
case ENTITY_MESSAGE:
EntityProtocol.handleEntityMessage((EntityMessage)message);
break;
case PLAYER_MESSAGE:
PlayerProtocol.handlePlayerMessage((PlayerMessage)message);
break;
case TERRAIN_MESSAGE:
TerrainProtocol.handleTerrainMessage((TerrainMessage)message);
break;
case AUTH_MESSAGE:
AuthProtocol.handleAuthenticationMessage((AuthMessage)message);
break;
case SERVER_MESSAGE:
ServerProtocol.handleServerMessage((ServerMessage)message);
break;
}
}
// void handleStatusMessage(StatusMessage message){
// switch(message.getMessageSubtype()){
// case READY:
// isLoading = false;
// break;
// }
// }
public void setHasReceivedWorld(boolean hasReceivedWorld){
this.hasReceivedWorld = hasReceivedWorld;
}
public boolean isLoading(){
return isLoading;
}
public boolean hasReceivedWorld(){
return hasReceivedWorld;
}
}

View File

@ -1,54 +1,18 @@
package electrosphere.net.client;
package electrosphere.net.client.protocol;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.parser.net.message.StatusMessage;
import electrosphere.net.parser.net.message.WorldMessage;
import org.joml.Vector2f;
import org.joml.Vector3f;
public class ClientProtocol {
public class EntityProtocol {
boolean isLoading = true;
boolean hasReceivedWorld = false;
public void handleMessage(NetworkMessage message){
switch(message.getType()){
case STATUS_MESSAGE:
handleStatusMessage((StatusMessage)message);
break;
case ENTITY_MESSAGE:
handleEntityMessage((EntityMessage)message);
break;
case PLAYER_MESSAGE:
handlePlayerMessage((PlayerMessage)message);
break;
case WORLD_MESSAGE:
handleWorldMessage((WorldMessage)message);
break;
}
}
void handleStatusMessage(StatusMessage message){
switch(message.getMessageSubtype()){
case READY:
isLoading = false;
break;
}
}
void handleEntityMessage(EntityMessage message){
protected static void handleEntityMessage(EntityMessage message){
LoggerInterface.loggerNetworking.DEBUG("Parse entity message of type " + message.getMessageSubtype());
switch(message.getMessageSubtype()){
case CREATE:
@ -91,7 +55,7 @@ public class ClientProtocol {
CreatureUtils.setControllerPlayerId(target, message.getpropertyValue());
if(message.getpropertyValue() == Main.playerId){
Globals.clientCharacterID = message.getentityID();
Globals.playerCharacter = target;
Globals.playerEntity = target;
}
}
}
@ -112,55 +76,5 @@ public class ClientProtocol {
break;
}
}
void handlePlayerMessage(PlayerMessage message){
switch(message.getMessageSubtype()){
case SET_ID:
Main.playerId = message.getplayerID();
LoggerInterface.loggerNetworking.DEBUG("Player ID is " + Main.playerId);
break;
case SETINITIALDISCRETEPOSITION:
Globals.clientPlayerData.setWorldPosition(message.getinitialDiscretePositionX(), message.getinitialDiscretePositionY());
break;
}
}
void handleWorldMessage(WorldMessage message){
switch(message.getMessageSubtype()){
case METADATA:
Globals.clientWorldData = new ClientWorldData(
//Vector3f worldMinPoint, Vector3f worldMaxPoint, int dynamicInterpolationRatio, float randomDampener, int worldDiscreteSize
new Vector3f(message.getworldMinX(),0,message.getworldMinY()),
new Vector3f(message.getworldMaxX(),0,message.getworldMaxY()),
message.getdynamicInterpolationRatio(),
message.getrandomDampener(),
message.getworldSizeDiscrete()
);
hasReceivedWorld = true;
break;
case MACROVALUE:
Globals.clientTerrainManager.attachWorldMessage(message);
break;
case SPAWNPOSITION:
Globals.spawnPoint.set(new Vector3f(message.getrealLocationX(),0.25f,message.getrealLocationY()));
break;
case CHUNKLOADSTART:
Globals.clientTerrainManager.attachWorldMessage(message);
break;
case HEIGHTMAPMODIFICATION:
Globals.clientTerrainManager.attachWorldMessage(message);
break;
default:
LoggerInterface.loggerNetworking.WARNING("Client networking: Unhandled message of type: " + message.getMessageSubtype());
break;
}
}
public boolean isLoading(){
return isLoading;
}
public boolean hasReceivedWorld(){
return hasReceivedWorld;
}
}

View File

@ -0,0 +1,22 @@
package electrosphere.net.client.protocol;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.parser.net.message.PlayerMessage;
public class PlayerProtocol {
protected static void handlePlayerMessage(PlayerMessage message){
switch(message.getMessageSubtype()){
case SET_ID:
Main.playerId = message.getplayerID();
LoggerInterface.loggerNetworking.DEBUG("Player ID is " + Main.playerId);
break;
case SETINITIALDISCRETEPOSITION:
Globals.clientPlayerData.setWorldPosition(message.getinitialDiscretePositionX(), message.getinitialDiscretePositionY());
break;
}
}
}

View File

@ -0,0 +1,19 @@
package electrosphere.net.client.protocol;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.ServerMessage;
public class ServerProtocol {
protected static void handleServerMessage(ServerMessage message){
switch(message.getMessageSubtype()){
case PING:
Globals.clientConnection.queueOutgoingMessage(ServerMessage.constructPongMessage());
break;
case PONG:
//silently drop
break;
}
}
}

View File

@ -0,0 +1,43 @@
package electrosphere.net.client.protocol;
import org.joml.Vector3f;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.TerrainMessage;
public class TerrainProtocol {
protected static void handleTerrainMessage(TerrainMessage message){
switch(message.getMessageSubtype()){
case RESPONSEMETADATA:
Globals.clientWorldData = new ClientWorldData(
//Vector3f worldMinPoint, Vector3f worldMaxPoint, int dynamicInterpolationRatio, float randomDampener, int worldDiscreteSize
new Vector3f(message.getworldMinX(),0,message.getworldMinY()),
new Vector3f(message.getworldMaxX(),0,message.getworldMaxY()),
message.getdynamicInterpolationRatio(),
message.getrandomDampener(),
message.getworldSizeDiscrete()
);
Globals.clientConnection.getClientProtocol().setHasReceivedWorld(true);
break;
case MACROVALUE:
Globals.clientTerrainManager.attachTerrainMessage(message);
break;
case SPAWNPOSITION:
Globals.spawnPoint.set(new Vector3f(message.getrealLocationX(),0.25f,message.getrealLocationY()));
break;
case CHUNKLOADSTART:
Globals.clientTerrainManager.attachTerrainMessage(message);
break;
case HEIGHTMAPMODIFICATION:
Globals.clientTerrainManager.attachTerrainMessage(message);
break;
default:
LoggerInterface.loggerNetworking.WARNING("Client networking: Unhandled message of type: " + message.getMessageSubtype());
break;
}
}
}

View File

@ -0,0 +1,213 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class AuthMessage extends NetworkMessage {
public enum AuthMessageType {
AUTHREQUEST,
AUTHDETAILS,
AUTHSUCCESS,
AUTHFAILURE,
}
AuthMessageType messageType;
String user;
String pass;
AuthMessage(AuthMessageType messageType){
this.type = MessageType.AUTH_MESSAGE;
this.messageType = messageType;
}
public AuthMessageType getMessageSubtype(){
return this.messageType;
}
public String getuser() {
return user;
}
public void setuser(String user) {
this.user = user;
}
public String getpass() {
return pass;
}
public void setpass(String pass) {
this.pass = pass;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
}
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST:
if(byteStream.size() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST_SIZE){
return true;
} else {
return false;
}
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS:
return AuthMessage.canParseAuthDetailsMessage(byteStream);
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS:
if(byteStream.size() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS_SIZE){
return true;
} else {
return false;
}
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE:
if(byteStream.size() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE_SIZE){
return true;
} else {
return false;
}
}
return false;
}
public static AuthMessage parseAuthRequestMessage(List<Byte> byteStream){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHREQUEST);
stripPacketHeader(byteStream);
return rVal;
}
public static AuthMessage constructAuthRequestMessage(){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHREQUEST);
rVal.serialize();
return rVal;
}
public static boolean canParseAuthDetailsMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int userSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
userSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + userSize){
return false;
}
int passSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
passSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + passSize){
return false;
}
return true;
}
public static AuthMessage parseAuthDetailsMessage(List<Byte> byteStream){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHDETAILS);
stripPacketHeader(byteStream);
rVal.setuser(ByteStreamUtils.popStringFromByteQueue(byteStream));
rVal.setpass(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static AuthMessage constructAuthDetailsMessage(String user,String pass){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHDETAILS);
rVal.setuser(user);
rVal.setpass(pass);
rVal.serialize();
return rVal;
}
public static AuthMessage parseAuthSuccessMessage(List<Byte> byteStream){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHSUCCESS);
stripPacketHeader(byteStream);
return rVal;
}
public static AuthMessage constructAuthSuccessMessage(){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHSUCCESS);
rVal.serialize();
return rVal;
}
public static AuthMessage parseAuthFailureMessage(List<Byte> byteStream){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHFAILURE);
stripPacketHeader(byteStream);
return rVal;
}
public static AuthMessage constructAuthFailureMessage(){
AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHFAILURE);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case AUTHREQUEST:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_AUTH;
//entity messaage header
rawBytes[1] = TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST;
break;
case AUTHDETAILS:
rawBytes = new byte[2+4+user.length()+4+pass.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_AUTH;
//entity messaage header
rawBytes[1] = TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS;
intValues = ByteStreamUtils.serializeIntToBytes(user.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = user.getBytes();
for(int i = 0; i < user.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(pass.length());
for(int i = 0; i < 4; i++){
rawBytes[6+user.length()+i] = intValues[i];
}
stringBytes = pass.getBytes();
for(int i = 0; i < pass.length(); i++){
rawBytes[10+user.length()+i] = stringBytes[i];
}
break;
case AUTHSUCCESS:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_AUTH;
//entity messaage header
rawBytes[1] = TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS;
break;
case AUTHFAILURE:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_AUTH;
//entity messaage header
rawBytes[1] = TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE;
break;
}
serialized = true;
}
}

View File

@ -0,0 +1,283 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class CharacterMessage extends NetworkMessage {
public enum CharacterMessageType {
REQUESTCHARACTERLIST,
RESPONSECHARACTERLIST,
REQUESTCREATECHARACTER,
RESPONSECREATECHARACTER,
REQUESTSPAWNCHARACTER,
RESPONSESPAWNCHARACTER,
}
CharacterMessageType messageType;
String data;
CharacterMessage(CharacterMessageType messageType){
this.type = MessageType.CHARACTER_MESSAGE;
this.messageType = messageType;
}
public CharacterMessageType getMessageSubtype(){
return this.messageType;
}
public String getdata() {
return data;
}
public void setdata(String data) {
this.data = data;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
}
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST:
if(byteStream.size() >= TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST:
return CharacterMessage.canParseResponseCharacterListMessage(byteStream);
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER:
if(byteStream.size() >= TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTER:
return CharacterMessage.canParseResponseCreateCharacterMessage(byteStream);
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER:
if(byteStream.size() >= TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER:
return CharacterMessage.canParseResponseSpawnCharacterMessage(byteStream);
}
return false;
}
public static CharacterMessage parseRequestCharacterListMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCHARACTERLIST);
stripPacketHeader(byteStream);
return rVal;
}
public static CharacterMessage constructRequestCharacterListMessage(){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCHARACTERLIST);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseCharacterListMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static CharacterMessage parseResponseCharacterListMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECHARACTERLIST);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static CharacterMessage constructResponseCharacterListMessage(String data){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECHARACTERLIST);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
public static CharacterMessage parseRequestCreateCharacterMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCREATECHARACTER);
stripPacketHeader(byteStream);
return rVal;
}
public static CharacterMessage constructRequestCreateCharacterMessage(){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCREATECHARACTER);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseCreateCharacterMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static CharacterMessage parseResponseCreateCharacterMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECREATECHARACTER);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static CharacterMessage constructResponseCreateCharacterMessage(String data){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECREATECHARACTER);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
public static CharacterMessage parseRequestSpawnCharacterMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTSPAWNCHARACTER);
stripPacketHeader(byteStream);
return rVal;
}
public static CharacterMessage constructRequestSpawnCharacterMessage(){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTSPAWNCHARACTER);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseSpawnCharacterMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static CharacterMessage parseResponseSpawnCharacterMessage(List<Byte> byteStream){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSESPAWNCHARACTER);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static CharacterMessage constructResponseSpawnCharacterMessage(String data){
CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSESPAWNCHARACTER);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case REQUESTCHARACTERLIST:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST;
break;
case RESPONSECHARACTERLIST:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
case REQUESTCREATECHARACTER:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER;
break;
case RESPONSECREATECHARACTER:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTER;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
case REQUESTSPAWNCHARACTER:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER;
break;
case RESPONSESPAWNCHARACTER:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_CHARACTER;
//entity messaage header
rawBytes[1] = TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
}
serialized = true;
}
}

View File

@ -266,7 +266,7 @@ public class EntityMessage extends NetworkMessage {
public static boolean canParseCreateMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
List<Byte> temporaryByteQueue = new LinkedList();
if(currentStreamLength < 6){
return false;
}
@ -508,7 +508,7 @@ public class EntityMessage extends NetworkMessage {
public static boolean canParseattachEntityToEntityMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
List<Byte> temporaryByteQueue = new LinkedList();
if(currentStreamLength < 6){
return false;
}

View File

@ -0,0 +1,308 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class LoreMessage extends NetworkMessage {
public enum LoreMessageType {
REQUESTRACES,
RESPONSERACES,
REQUESTRACEDATA,
RESPONSERACEDATA,
REQUESTDATA,
RESPONSEDATA,
}
LoreMessageType messageType;
String data;
LoreMessage(LoreMessageType messageType){
this.type = MessageType.LORE_MESSAGE;
this.messageType = messageType;
}
public LoreMessageType getMessageSubtype(){
return this.messageType;
}
public String getdata() {
return data;
}
public void setdata(String data) {
this.data = data;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
}
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES:
if(byteStream.size() >= TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES_SIZE){
return true;
} else {
return false;
}
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES:
return LoreMessage.canParseResponseRacesMessage(byteStream);
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACEDATA:
if(byteStream.size() >= TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACEDATA_SIZE){
return true;
} else {
return false;
}
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACEDATA:
return LoreMessage.canParseResponseRaceDataMessage(byteStream);
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTDATA:
return LoreMessage.canParseRequestDataMessage(byteStream);
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSEDATA:
return LoreMessage.canParseResponseDataMessage(byteStream);
}
return false;
}
public static LoreMessage parseRequestRacesMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTRACES);
stripPacketHeader(byteStream);
return rVal;
}
public static LoreMessage constructRequestRacesMessage(){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTRACES);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseRacesMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static LoreMessage parseResponseRacesMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSERACES);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static LoreMessage constructResponseRacesMessage(String data){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSERACES);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
public static LoreMessage parseRequestRaceDataMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTRACEDATA);
stripPacketHeader(byteStream);
return rVal;
}
public static LoreMessage constructRequestRaceDataMessage(){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTRACEDATA);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseRaceDataMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static LoreMessage parseResponseRaceDataMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSERACEDATA);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static LoreMessage constructResponseRaceDataMessage(String data){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSERACEDATA);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
public static boolean canParseRequestDataMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static LoreMessage parseRequestDataMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTDATA);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static LoreMessage constructRequestDataMessage(String data){
LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTDATA);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
public static boolean canParseResponseDataMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteStream.get(2 + 0));
temporaryByteQueue.add(byteStream.get(2 + 1));
temporaryByteQueue.add(byteStream.get(2 + 2));
temporaryByteQueue.add(byteStream.get(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
public static LoreMessage parseResponseDataMessage(List<Byte> byteStream){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSEDATA);
stripPacketHeader(byteStream);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteStream));
return rVal;
}
public static LoreMessage constructResponseDataMessage(String data){
LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSEDATA);
rVal.setdata(data);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case REQUESTRACES:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES;
break;
case RESPONSERACES:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
case REQUESTRACEDATA:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACEDATA;
break;
case RESPONSERACEDATA:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACEDATA;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
case REQUESTDATA:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_REQUESTDATA;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
case RESPONSEDATA:
rawBytes = new byte[2+4+data.length()];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_LORE;
//entity messaage header
rawBytes[1] = TypeBytes.LORE_MESSAGE_TYPE_RESPONSEDATA;
intValues = ByteStreamUtils.serializeIntToBytes(data.length());
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
stringBytes = data.getBytes();
for(int i = 0; i < data.length(); i++){
rawBytes[6+i] = stringBytes[i];
}
break;
}
serialized = true;
}
}

View File

@ -1,101 +1,39 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.List;
public abstract class NetworkMessage {
public enum MessageType {
STATUS_MESSAGE,
WORLD_MESSAGE,
PLAYER_MESSAGE,
import java.util.List;
public abstract class NetworkMessage {
public enum MessageType {
ENTITY_MESSAGE,
}
MessageType type;
boolean serialized; // has this message been converted to bytes?
byte[] rawBytes;
public MessageType getType() {
return type;
}
public byte[] getRawBytes() {
return rawBytes;
}
public static NetworkMessage parseBytestreamForMessage(List<Byte> byteStream){
NetworkMessage rVal = null;
byte firstByte;
byte secondByte;
if(byteStream.size() > 1){
firstByte = byteStream.get(0);
switch(firstByte){
case TypeBytes.MESSAGE_TYPE_STATUS:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.STATUS_MESSAGE_TYPE_READY:
if(StatusMessage.canParseMessage(byteStream,secondByte)){
rVal = StatusMessage.parseReadyMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_WORLD:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.WORLD_MESSAGE_TYPE_METADATA:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseMetadataMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseRequestChunkMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_UPDATE:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseUpdateMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parsechunkLoadStartMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseMacroValueMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseheightMapModificationMessage(byteStream);
}
break;
case TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION:
if(WorldMessage.canParseMessage(byteStream,secondByte)){
rVal = WorldMessage.parseSpawnPositionMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_PLAYER:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID:
if(PlayerMessage.canParseMessage(byteStream,secondByte)){
rVal = PlayerMessage.parseSet_IDMessage(byteStream);
}
break;
case TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION:
if(PlayerMessage.canParseMessage(byteStream,secondByte)){
rVal = PlayerMessage.parseSetInitialDiscretePositionMessage(byteStream);
}
break;
}
break;
LORE_MESSAGE,
CHARACTER_MESSAGE,
PLAYER_MESSAGE,
TERRAIN_MESSAGE,
SERVER_MESSAGE,
AUTH_MESSAGE,
}
MessageType type;
boolean serialized; // has this message been converted to bytes?
byte[] rawBytes;
public MessageType getType() {
return type;
}
public byte[] getRawBytes() {
return rawBytes;
}
public static NetworkMessage parseBytestreamForMessage(List<Byte> byteStream){
NetworkMessage rVal = null;
byte firstByte;
byte secondByte;
if(byteStream.size() > 1){
firstByte = byteStream.get(0);
switch(firstByte){
case TypeBytes.MESSAGE_TYPE_ENTITY:
secondByte = byteStream.get(1);
switch(secondByte){
@ -151,16 +89,186 @@ ENTITY_MESSAGE,
break;
}
break;
}
}
return rVal;
}
public boolean isSerialized(){
return serialized;
}
abstract void serialize();
}
case TypeBytes.MESSAGE_TYPE_LORE:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseRequestRacesMessage(byteStream);
}
break;
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseResponseRacesMessage(byteStream);
}
break;
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACEDATA:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseRequestRaceDataMessage(byteStream);
}
break;
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACEDATA:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseResponseRaceDataMessage(byteStream);
}
break;
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTDATA:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseRequestDataMessage(byteStream);
}
break;
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSEDATA:
if(LoreMessage.canParseMessage(byteStream,secondByte)){
rVal = LoreMessage.parseResponseDataMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_CHARACTER:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseRequestCharacterListMessage(byteStream);
}
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseResponseCharacterListMessage(byteStream);
}
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseRequestCreateCharacterMessage(byteStream);
}
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTER:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseResponseCreateCharacterMessage(byteStream);
}
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseRequestSpawnCharacterMessage(byteStream);
}
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER:
if(CharacterMessage.canParseMessage(byteStream,secondByte)){
rVal = CharacterMessage.parseResponseSpawnCharacterMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_PLAYER:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID:
if(PlayerMessage.canParseMessage(byteStream,secondByte)){
rVal = PlayerMessage.parseSet_IDMessage(byteStream);
}
break;
case TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION:
if(PlayerMessage.canParseMessage(byteStream,secondByte)){
rVal = PlayerMessage.parseSetInitialDiscretePositionMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_TERRAIN:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseRequestMetadataMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseResponseMetadataMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNK:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseRequestChunkMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATE:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseUpdateMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parsechunkLoadStartMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_MACROVALUE:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseMacroValueMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseheightMapModificationMessage(byteStream);
}
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION:
if(TerrainMessage.canParseMessage(byteStream,secondByte)){
rVal = TerrainMessage.parseSpawnPositionMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_SERVER:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.SERVER_MESSAGE_TYPE_PING:
if(ServerMessage.canParseMessage(byteStream,secondByte)){
rVal = ServerMessage.parsePingMessage(byteStream);
}
break;
case TypeBytes.SERVER_MESSAGE_TYPE_PONG:
if(ServerMessage.canParseMessage(byteStream,secondByte)){
rVal = ServerMessage.parsePongMessage(byteStream);
}
break;
}
break;
case TypeBytes.MESSAGE_TYPE_AUTH:
secondByte = byteStream.get(1);
switch(secondByte){
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST:
if(AuthMessage.canParseMessage(byteStream,secondByte)){
rVal = AuthMessage.parseAuthRequestMessage(byteStream);
}
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS:
if(AuthMessage.canParseMessage(byteStream,secondByte)){
rVal = AuthMessage.parseAuthDetailsMessage(byteStream);
}
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS:
if(AuthMessage.canParseMessage(byteStream,secondByte)){
rVal = AuthMessage.parseAuthSuccessMessage(byteStream);
}
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE:
if(AuthMessage.canParseMessage(byteStream,secondByte)){
rVal = AuthMessage.parseAuthFailureMessage(byteStream);
}
break;
}
break;
}
}
return rVal;
}
public boolean isSerialized(){
return serialized;
}
abstract void serialize();
}

View File

@ -0,0 +1,95 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class ServerMessage extends NetworkMessage {
public enum ServerMessageType {
PING,
PONG,
}
ServerMessageType messageType;
ServerMessage(ServerMessageType messageType){
this.type = MessageType.SERVER_MESSAGE;
this.messageType = messageType;
}
public ServerMessageType getMessageSubtype(){
return this.messageType;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
}
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.SERVER_MESSAGE_TYPE_PING:
if(byteStream.size() >= TypeBytes.SERVER_MESSAGE_TYPE_PING_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SERVER_MESSAGE_TYPE_PONG:
if(byteStream.size() >= TypeBytes.SERVER_MESSAGE_TYPE_PONG_SIZE){
return true;
} else {
return false;
}
}
return false;
}
public static ServerMessage parsePingMessage(List<Byte> byteStream){
ServerMessage rVal = new ServerMessage(ServerMessageType.PING);
stripPacketHeader(byteStream);
return rVal;
}
public static ServerMessage constructPingMessage(){
ServerMessage rVal = new ServerMessage(ServerMessageType.PING);
rVal.serialize();
return rVal;
}
public static ServerMessage parsePongMessage(List<Byte> byteStream){
ServerMessage rVal = new ServerMessage(ServerMessageType.PONG);
stripPacketHeader(byteStream);
return rVal;
}
public static ServerMessage constructPongMessage(){
ServerMessage rVal = new ServerMessage(ServerMessageType.PONG);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case PING:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_SERVER;
//entity messaage header
rawBytes[1] = TypeBytes.SERVER_MESSAGE_TYPE_PING;
break;
case PONG:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_SERVER;
//entity messaage header
rawBytes[1] = TypeBytes.SERVER_MESSAGE_TYPE_PONG;
break;
}
serialized = true;
}
}

View File

@ -1,84 +0,0 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class StatusMessage extends NetworkMessage {
public enum StatusMessageType {
READY,
}
StatusMessageType messageType;
int ready;
StatusMessage(StatusMessageType messageType){
this.type = MessageType.STATUS_MESSAGE;
this.messageType = messageType;
}
public StatusMessageType getMessageSubtype(){
return this.messageType;
}
public int getready() {
return ready;
}
public void setready(int ready) {
this.ready = ready;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
}
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.STATUS_MESSAGE_TYPE_READY:
if(byteStream.size() >= TypeBytes.STATUS_MESSAGE_TYPE_READY_SIZE){
return true;
} else {
return false;
}
}
return false;
}
public static StatusMessage parseReadyMessage(List<Byte> byteStream){
StatusMessage rVal = new StatusMessage(StatusMessageType.READY);
stripPacketHeader(byteStream);
rVal.setready(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static StatusMessage constructReadyMessage(int ready){
StatusMessage rVal = new StatusMessage(StatusMessageType.READY);
rVal.setready(ready);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case READY:
rawBytes = new byte[2+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_STATUS;
//entity messaage header
rawBytes[1] = TypeBytes.STATUS_MESSAGE_TYPE_READY;
intValues = ByteStreamUtils.serializeIntToBytes(ready);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
break;
}
serialized = true;
}
}

View File

@ -4,10 +4,11 @@ import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class WorldMessage extends NetworkMessage {
public class TerrainMessage extends NetworkMessage {
public enum WorldMessageType {
METADATA,
public enum TerrainMessageType {
REQUESTMETADATA,
RESPONSEMETADATA,
REQUESTCHUNK,
UPDATE,
CHUNKLOADSTART,
@ -16,7 +17,7 @@ public class WorldMessage extends NetworkMessage {
SPAWNPOSITION,
}
WorldMessageType messageType;
TerrainMessageType messageType;
int worldSizeDiscrete;
int dynamicInterpolationRatio;
float randomDampener;
@ -82,12 +83,12 @@ public class WorldMessage extends NetworkMessage {
long randomizerValue43;
long randomizerValue44;
WorldMessage(WorldMessageType messageType){
this.type = MessageType.WORLD_MESSAGE;
TerrainMessage(TerrainMessageType messageType){
this.type = MessageType.TERRAIN_MESSAGE;
this.messageType = messageType;
}
public WorldMessageType getMessageSubtype(){
public TerrainMessageType getMessageSubtype(){
return this.messageType;
}
@ -610,44 +611,50 @@ public class WorldMessage extends NetworkMessage {
public static boolean canParseMessage(List<Byte> byteStream, byte secondByte){
switch(secondByte){
case TypeBytes.WORLD_MESSAGE_TYPE_METADATA:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_METADATA_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_UPDATE:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_UPDATE_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNK:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNK_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATE:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_MACROVALUE:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_MACROVALUE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION:
if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION_SIZE){
case TypeBytes.TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE){
return true;
} else {
return false;
}
case TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION:
if(byteStream.size() >= TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION_SIZE){
return true;
} else {
return false;
@ -656,8 +663,20 @@ public class WorldMessage extends NetworkMessage {
return false;
}
public static WorldMessage parseMetadataMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.METADATA);
public static TerrainMessage parseRequestMetadataMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.REQUESTMETADATA);
stripPacketHeader(byteStream);
return rVal;
}
public static TerrainMessage constructRequestMetadataMessage(){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.REQUESTMETADATA);
rVal.serialize();
return rVal;
}
public static TerrainMessage parseResponseMetadataMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.RESPONSEMETADATA);
stripPacketHeader(byteStream);
rVal.setworldSizeDiscrete(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setdynamicInterpolationRatio(ByteStreamUtils.popIntFromByteQueue(byteStream));
@ -669,8 +688,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage constructMetadataMessage(int worldSizeDiscrete,int dynamicInterpolationRatio,float randomDampener,int worldMinX,int worldMinY,int worldMaxX,int worldMaxY){
WorldMessage rVal = new WorldMessage(WorldMessageType.METADATA);
public static TerrainMessage constructResponseMetadataMessage(int worldSizeDiscrete,int dynamicInterpolationRatio,float randomDampener,int worldMinX,int worldMinY,int worldMaxX,int worldMaxY){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.RESPONSEMETADATA);
rVal.setworldSizeDiscrete(worldSizeDiscrete);
rVal.setdynamicInterpolationRatio(dynamicInterpolationRatio);
rVal.setrandomDampener(randomDampener);
@ -682,40 +701,40 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage parseRequestChunkMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTCHUNK);
public static TerrainMessage parseRequestChunkMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.REQUESTCHUNK);
stripPacketHeader(byteStream);
rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static WorldMessage constructRequestChunkMessage(int worldX,int worldY){
WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTCHUNK);
public static TerrainMessage constructRequestChunkMessage(int worldX,int worldY){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.REQUESTCHUNK);
rVal.setworldX(worldX);
rVal.setworldY(worldY);
rVal.serialize();
return rVal;
}
public static WorldMessage parseUpdateMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.UPDATE);
public static TerrainMessage parseUpdateMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.UPDATE);
stripPacketHeader(byteStream);
rVal.setlocationX(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setlocationY(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static WorldMessage constructUpdateMessage(int locationX,int locationY){
WorldMessage rVal = new WorldMessage(WorldMessageType.UPDATE);
public static TerrainMessage constructUpdateMessage(int locationX,int locationY){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.UPDATE);
rVal.setlocationX(locationX);
rVal.setlocationY(locationY);
rVal.serialize();
return rVal;
}
public static WorldMessage parsechunkLoadStartMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.CHUNKLOADSTART);
public static TerrainMessage parsechunkLoadStartMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.CHUNKLOADSTART);
stripPacketHeader(byteStream);
rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream));
@ -723,8 +742,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage constructchunkLoadStartMessage(int worldX,int worldY,float value){
WorldMessage rVal = new WorldMessage(WorldMessageType.CHUNKLOADSTART);
public static TerrainMessage constructchunkLoadStartMessage(int worldX,int worldY,float value){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.CHUNKLOADSTART);
rVal.setworldX(worldX);
rVal.setworldY(worldY);
rVal.setvalue(value);
@ -732,8 +751,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage parseMacroValueMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.MACROVALUE);
public static TerrainMessage parseMacroValueMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.MACROVALUE);
stripPacketHeader(byteStream);
rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream));
@ -790,8 +809,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage constructMacroValueMessage(int worldX,int worldY,float macroValue00,float macroValue01,float macroValue02,float macroValue03,float macroValue04,float macroValue10,float macroValue11,float macroValue12,float macroValue13,float macroValue14,float macroValue20,float macroValue21,float macroValue22,float macroValue23,float macroValue24,float macroValue30,float macroValue31,float macroValue32,float macroValue33,float macroValue34,float macroValue40,float macroValue41,float macroValue42,float macroValue43,float macroValue44,long randomizerValue00,long randomizerValue01,long randomizerValue02,long randomizerValue03,long randomizerValue04,long randomizerValue10,long randomizerValue11,long randomizerValue12,long randomizerValue13,long randomizerValue14,long randomizerValue20,long randomizerValue21,long randomizerValue22,long randomizerValue23,long randomizerValue24,long randomizerValue30,long randomizerValue31,long randomizerValue32,long randomizerValue33,long randomizerValue34,long randomizerValue40,long randomizerValue41,long randomizerValue42,long randomizerValue43,long randomizerValue44){
WorldMessage rVal = new WorldMessage(WorldMessageType.MACROVALUE);
public static TerrainMessage constructMacroValueMessage(int worldX,int worldY,float macroValue00,float macroValue01,float macroValue02,float macroValue03,float macroValue04,float macroValue10,float macroValue11,float macroValue12,float macroValue13,float macroValue14,float macroValue20,float macroValue21,float macroValue22,float macroValue23,float macroValue24,float macroValue30,float macroValue31,float macroValue32,float macroValue33,float macroValue34,float macroValue40,float macroValue41,float macroValue42,float macroValue43,float macroValue44,long randomizerValue00,long randomizerValue01,long randomizerValue02,long randomizerValue03,long randomizerValue04,long randomizerValue10,long randomizerValue11,long randomizerValue12,long randomizerValue13,long randomizerValue14,long randomizerValue20,long randomizerValue21,long randomizerValue22,long randomizerValue23,long randomizerValue24,long randomizerValue30,long randomizerValue31,long randomizerValue32,long randomizerValue33,long randomizerValue34,long randomizerValue40,long randomizerValue41,long randomizerValue42,long randomizerValue43,long randomizerValue44){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.MACROVALUE);
rVal.setworldX(worldX);
rVal.setworldY(worldY);
rVal.setmacroValue00(macroValue00);
@ -848,8 +867,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage parseheightMapModificationMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.HEIGHTMAPMODIFICATION);
public static TerrainMessage parseheightMapModificationMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.HEIGHTMAPMODIFICATION);
stripPacketHeader(byteStream);
rVal.setvalue(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream));
@ -859,8 +878,8 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage constructheightMapModificationMessage(float value,int worldX,int worldY,int locationX,int locationY){
WorldMessage rVal = new WorldMessage(WorldMessageType.HEIGHTMAPMODIFICATION);
public static TerrainMessage constructheightMapModificationMessage(float value,int worldX,int worldY,int locationX,int locationY){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.HEIGHTMAPMODIFICATION);
rVal.setvalue(value);
rVal.setworldX(worldX);
rVal.setworldY(worldY);
@ -870,16 +889,16 @@ public class WorldMessage extends NetworkMessage {
return rVal;
}
public static WorldMessage parseSpawnPositionMessage(List<Byte> byteStream){
WorldMessage rVal = new WorldMessage(WorldMessageType.SPAWNPOSITION);
public static TerrainMessage parseSpawnPositionMessage(List<Byte> byteStream){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.SPAWNPOSITION);
stripPacketHeader(byteStream);
rVal.setrealLocationX(ByteStreamUtils.popFloatFromByteQueue(byteStream));
rVal.setrealLocationY(ByteStreamUtils.popFloatFromByteQueue(byteStream));
return rVal;
}
public static WorldMessage constructSpawnPositionMessage(float realLocationX,float realLocationY){
WorldMessage rVal = new WorldMessage(WorldMessageType.SPAWNPOSITION);
public static TerrainMessage constructSpawnPositionMessage(float realLocationX,float realLocationY){
TerrainMessage rVal = new TerrainMessage(TerrainMessageType.SPAWNPOSITION);
rVal.setrealLocationX(realLocationX);
rVal.setrealLocationY(realLocationY);
rVal.serialize();
@ -891,12 +910,19 @@ public class WorldMessage extends NetworkMessage {
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case METADATA:
case REQUESTMETADATA:
rawBytes = new byte[2];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA;
break;
case RESPONSEMETADATA:
rawBytes = new byte[2+4+4+4+4+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_METADATA;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA;
intValues = ByteStreamUtils.serializeIntToBytes(worldSizeDiscrete);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -928,9 +954,9 @@ public class WorldMessage extends NetworkMessage {
case REQUESTCHUNK:
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNK;
intValues = ByteStreamUtils.serializeIntToBytes(worldX);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -943,9 +969,9 @@ public class WorldMessage extends NetworkMessage {
case UPDATE:
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_UPDATE;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATE;
intValues = ByteStreamUtils.serializeIntToBytes(locationX);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -958,9 +984,9 @@ public class WorldMessage extends NetworkMessage {
case CHUNKLOADSTART:
rawBytes = new byte[2+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART;
intValues = ByteStreamUtils.serializeIntToBytes(worldX);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -976,9 +1002,9 @@ public class WorldMessage extends NetworkMessage {
case MACROVALUE:
rawBytes = new byte[2+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_MACROVALUE;
intValues = ByteStreamUtils.serializeIntToBytes(worldX);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -1166,9 +1192,9 @@ public class WorldMessage extends NetworkMessage {
case HEIGHTMAPMODIFICATION:
rawBytes = new byte[2+4+4+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION;
intValues = ByteStreamUtils.serializeFloatToBytes(value);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
@ -1192,9 +1218,9 @@ public class WorldMessage extends NetworkMessage {
case SPAWNPOSITION:
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
rawBytes[0] = TypeBytes.MESSAGE_TYPE_TERRAIN;
//entity messaage header
rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION;
rawBytes[1] = TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION;
intValues = ByteStreamUtils.serializeFloatToBytes(realLocationX);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];

View File

@ -1,52 +1,17 @@
package electrosphere.net.parser.net.message;
public class TypeBytes {
public class TypeBytes {
/*
Message categories
*/
public static final byte MESSAGE_TYPE_STATUS = 0;
public static final byte MESSAGE_TYPE_WORLD = 1;
public static final byte MESSAGE_TYPE_PLAYER = 2;
public static final byte MESSAGE_TYPE_ENTITY = 3;
/*
Status subcategories
*/
public static final byte STATUS_MESSAGE_TYPE_READY = 0;
/*
Status packet sizes
*/
public static final byte STATUS_MESSAGE_TYPE_READY_SIZE = 6;
/*
World subcategories
*/
public static final byte WORLD_MESSAGE_TYPE_METADATA = 0;
public static final byte WORLD_MESSAGE_TYPE_REQUESTCHUNK = 1;
public static final byte WORLD_MESSAGE_TYPE_UPDATE = 2;
public static final byte WORLD_MESSAGE_TYPE_CHUNKLOADSTART = 3;
public static final byte WORLD_MESSAGE_TYPE_MACROVALUE = 4;
public static final byte WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION = 5;
public static final byte WORLD_MESSAGE_TYPE_SPAWNPOSITION = 6;
/*
World packet sizes
*/
public static final byte WORLD_MESSAGE_TYPE_METADATA_SIZE = 30;
public static final byte WORLD_MESSAGE_TYPE_REQUESTCHUNK_SIZE = 10;
public static final byte WORLD_MESSAGE_TYPE_UPDATE_SIZE = 10;
public static final byte WORLD_MESSAGE_TYPE_CHUNKLOADSTART_SIZE = 14;
public static final short WORLD_MESSAGE_TYPE_MACROVALUE_SIZE = 310;
public static final byte WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE = 22;
public static final byte WORLD_MESSAGE_TYPE_SPAWNPOSITION_SIZE = 10;
/*
Player subcategories
*/
public static final byte PLAYER_MESSAGE_TYPE_SET_ID = 0;
public static final byte PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION = 1;
/*
Player packet sizes
*/
public static final byte PLAYER_MESSAGE_TYPE_SET_ID_SIZE = 6;
public static final byte PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION_SIZE = 10;
public static final byte MESSAGE_TYPE_ENTITY = 0;
public static final byte MESSAGE_TYPE_LORE = 1;
public static final byte MESSAGE_TYPE_CHARACTER = 2;
public static final byte MESSAGE_TYPE_PLAYER = 3;
public static final byte MESSAGE_TYPE_TERRAIN = 4;
public static final byte MESSAGE_TYPE_SERVER = 5;
public static final byte MESSAGE_TYPE_AUTH = 6;
/*
Entity subcategories
*/
@ -71,5 +36,89 @@ Message categories
public static final byte ENTITY_MESSAGE_TYPE_DESTROY_SIZE = 6;
public static final byte ENTITY_MESSAGE_TYPE_SETBEHAVIORTREE_SIZE = 22;
public static final byte ENTITY_MESSAGE_TYPE_SETPROPERTY_SIZE = 22;
}
/*
Lore subcategories
*/
public static final byte LORE_MESSAGE_TYPE_REQUESTRACES = 0;
public static final byte LORE_MESSAGE_TYPE_RESPONSERACES = 1;
public static final byte LORE_MESSAGE_TYPE_REQUESTRACEDATA = 2;
public static final byte LORE_MESSAGE_TYPE_RESPONSERACEDATA = 3;
public static final byte LORE_MESSAGE_TYPE_REQUESTDATA = 4;
public static final byte LORE_MESSAGE_TYPE_RESPONSEDATA = 5;
/*
Lore packet sizes
*/
public static final byte LORE_MESSAGE_TYPE_REQUESTRACES_SIZE = 2;
public static final byte LORE_MESSAGE_TYPE_REQUESTRACEDATA_SIZE = 2;
/*
Character subcategories
*/
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST = 0;
public static final byte CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST = 1;
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER = 2;
public static final byte CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTER = 3;
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER = 4;
public static final byte CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER = 5;
/*
Character packet sizes
*/
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST_SIZE = 2;
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER_SIZE = 2;
public static final byte CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER_SIZE = 2;
/*
Player subcategories
*/
public static final byte PLAYER_MESSAGE_TYPE_SET_ID = 0;
public static final byte PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION = 1;
/*
Player packet sizes
*/
public static final byte PLAYER_MESSAGE_TYPE_SET_ID_SIZE = 6;
public static final byte PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION_SIZE = 10;
/*
Terrain subcategories
*/
public static final byte TERRAIN_MESSAGE_TYPE_REQUESTMETADATA = 0;
public static final byte TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA = 1;
public static final byte TERRAIN_MESSAGE_TYPE_REQUESTCHUNK = 2;
public static final byte TERRAIN_MESSAGE_TYPE_UPDATE = 3;
public static final byte TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART = 4;
public static final byte TERRAIN_MESSAGE_TYPE_MACROVALUE = 5;
public static final byte TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION = 6;
public static final byte TERRAIN_MESSAGE_TYPE_SPAWNPOSITION = 7;
/*
Terrain packet sizes
*/
public static final byte TERRAIN_MESSAGE_TYPE_REQUESTMETADATA_SIZE = 2;
public static final byte TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA_SIZE = 30;
public static final byte TERRAIN_MESSAGE_TYPE_REQUESTCHUNK_SIZE = 10;
public static final byte TERRAIN_MESSAGE_TYPE_UPDATE_SIZE = 10;
public static final byte TERRAIN_MESSAGE_TYPE_CHUNKLOADSTART_SIZE = 14;
public static final short TERRAIN_MESSAGE_TYPE_MACROVALUE_SIZE = 310;
public static final byte TERRAIN_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE = 22;
public static final byte TERRAIN_MESSAGE_TYPE_SPAWNPOSITION_SIZE = 10;
/*
Server subcategories
*/
public static final byte SERVER_MESSAGE_TYPE_PING = 0;
public static final byte SERVER_MESSAGE_TYPE_PONG = 1;
/*
Server packet sizes
*/
public static final byte SERVER_MESSAGE_TYPE_PING_SIZE = 2;
public static final byte SERVER_MESSAGE_TYPE_PONG_SIZE = 2;
/*
Auth subcategories
*/
public static final byte AUTH_MESSAGE_TYPE_AUTHREQUEST = 0;
public static final byte AUTH_MESSAGE_TYPE_AUTHDETAILS = 1;
public static final byte AUTH_MESSAGE_TYPE_AUTHSUCCESS = 2;
public static final byte AUTH_MESSAGE_TYPE_AUTHFAILURE = 3;
/*
Auth packet sizes
*/
public static final byte AUTH_MESSAGE_TYPE_AUTHREQUEST_SIZE = 2;
public static final byte AUTH_MESSAGE_TYPE_AUTHSUCCESS_SIZE = 2;
public static final byte AUTH_MESSAGE_TYPE_AUTHFAILURE_SIZE = 2;
}

View File

@ -1,82 +1,81 @@
package electrosphere.net.parser.net.raw;
import electrosphere.net.parser.net.message.NetworkMessage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class NetworkParser {
InputStream incomingStream;
OutputStream outgoingStream;
List<NetworkMessage> incomingMessageQueue = new CopyOnWriteArrayList<NetworkMessage>();
List<NetworkMessage> outgoingMessageQueue = new CopyOnWriteArrayList<NetworkMessage>();
List<Byte> incomingByteQueue = new CopyOnWriteArrayList<Byte>();
List<Byte> outgoingByteQueue = new CopyOnWriteArrayList<Byte>();
public NetworkParser(InputStream incomingStream, OutputStream outgoingStream){
this.incomingStream = incomingStream;
this.outgoingStream = outgoingStream;
}
public void start(){
}
public void readMessagesIn(){
try {
//read in bytes
int nextValue = 0;
byte currentByte = -1;
while(incomingStream.available() > 0){
nextValue = incomingStream.read();
if(nextValue != -1){
currentByte = (byte)nextValue;
incomingByteQueue.add(currentByte);
// System.out.println(currentByte);
}
//add bytes to some kind of queue
}
//parse byte queue for messages
//for each message, append to clientIncomingMessageQueue
NetworkMessage newMessage;
while((newMessage = NetworkMessage.parseBytestreamForMessage(incomingByteQueue))!=null){
incomingMessageQueue.add(newMessage);
}
} catch (IOException ex) {
ex.printStackTrace();
System.exit(0);
}
}
public void pushMessagesOut(){
for(NetworkMessage message : outgoingMessageQueue){
outgoingMessageQueue.remove(message);
try {
// System.out.println("Write message of type " + message.getType());
outgoingStream.write(message.getRawBytes());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public boolean hasIncomingMessaage(){
return incomingMessageQueue.size() > 0;
}
public NetworkMessage popIncomingMessage(){
return incomingMessageQueue.remove(0);
}
public void addOutgoingMessage(NetworkMessage message){
outgoingMessageQueue.add(message);
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.CopyOnWriteArrayList;
public class NetworkParser {
InputStream incomingStream;
OutputStream outgoingStream;
CopyOnWriteArrayList<NetworkMessage> incomingMessageQueue = new CopyOnWriteArrayList();
CopyOnWriteArrayList<NetworkMessage> outgoingMessageQueue = new CopyOnWriteArrayList();
CopyOnWriteArrayList<Byte> incomingByteQueue = new CopyOnWriteArrayList();
CopyOnWriteArrayList<Byte> outgoingByteQueue = new CopyOnWriteArrayList();
public NetworkParser(InputStream incomingStream, OutputStream outgoingStream){
this.incomingStream = incomingStream;
this.outgoingStream = outgoingStream;
}
public void start(){
}
public void readMessagesIn(){
try {
//read in bytes
int nextValue = 0;
byte currentByte = -1;
while(incomingStream.available() > 0){
nextValue = incomingStream.read();
if(nextValue != -1){
currentByte = (byte)nextValue;
incomingByteQueue.add(currentByte);
// System.out.println(currentByte);
}
//add bytes to some kind of queue
}
//parse byte queue for messages
//for each message, append to clientIncomingMessageQueue
NetworkMessage newMessage;
while((newMessage = NetworkMessage.parseBytestreamForMessage(incomingByteQueue))!=null){
incomingMessageQueue.add(newMessage);
}
} catch (IOException ex) {
ex.printStackTrace();
System.exit(0);
}
}
public void pushMessagesOut(){
for(NetworkMessage message : outgoingMessageQueue){
outgoingMessageQueue.remove(message);
try {
// System.out.println("Write message of type " + message.getType());
outgoingStream.write(message.getRawBytes());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public boolean hasIncomingMessaage(){
return incomingMessageQueue.size() > 0;
}
public NetworkMessage popIncomingMessage(){
return incomingMessageQueue.remove(0);
}
public void addOutgoingMessage(NetworkMessage message){
outgoingMessageQueue.add(message);
}
}

View File

@ -1,193 +1,193 @@
package electrosphere.net.parser.util;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.concurrent.Semaphore;
public class ByteStreamUtils {
static ByteBuffer integerCompactor = ByteBuffer.allocate(8);
static Semaphore bufferLock = new Semaphore(1);
// static {
// integerCompactor = ByteBuffer.allocate(8);
// }
public static int popIntFromByteQueue(List<Byte> queue){
int rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(4);
rVal = integerCompactor.getInt();
bufferLock.release();
return rVal;
}
public static float popFloatFromByteQueue(List<Byte> queue){
float rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(4);
rVal = integerCompactor.getFloat();
bufferLock.release();
return rVal;
}
public static long popLongFromByteQueue(List<Byte> queue){
long rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.put(4,queue.remove(0));
integerCompactor.put(5,queue.remove(0));
integerCompactor.put(6,queue.remove(0));
integerCompactor.put(7,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(8);
rVal = integerCompactor.getLong();
bufferLock.release();
return rVal;
}
public static String popStringFromByteQueue(List<Byte> queue){
int length = popIntFromByteQueue(queue);
byte[] stringBytes = new byte[length];
for(int i = 0; i < length; i++){
stringBytes[i] = queue.remove(0);
}
String rVal = new String(stringBytes);
return rVal;
}
public static double popDoubleFromByteQueue(List<Byte> queue){
double rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.put(4,queue.remove(0));
integerCompactor.put(5,queue.remove(0));
integerCompactor.put(6,queue.remove(0));
integerCompactor.put(7,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(8);
rVal = integerCompactor.getDouble();
bufferLock.release();
return rVal;
}
public static byte[] serializeIntToBytes(int i){
byte[] rVal = new byte[4];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.putInt(i);
integerCompactor.position(0);
integerCompactor.limit(4);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
bufferLock.release();
return rVal;
}
public static byte[] serializeFloatToBytes(float i){
byte[] rVal = new byte[4];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.putFloat(i);
integerCompactor.position(0);
integerCompactor.limit(4);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
bufferLock.release();
return rVal;
}
public static byte[] serializeLongToBytes(long i){
byte[] rVal = new byte[8];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.putLong(i);
integerCompactor.position(0);
integerCompactor.limit(8);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
rVal[4] = integerCompactor.get(4);
rVal[5] = integerCompactor.get(5);
rVal[6] = integerCompactor.get(6);
rVal[7] = integerCompactor.get(7);
bufferLock.release();
return rVal;
}
public static byte[] serializeStringToBytes(String s){
int length = s.length();
byte[] rVal = new byte[length + 4]; //the 4 is the header int for the string size
byte[] serializedInteger = serializeIntToBytes(length);
rVal[0] = serializedInteger[0];
rVal[1] = serializedInteger[1];
rVal[2] = serializedInteger[2];
rVal[3] = serializedInteger[3];
byte[] stringBytes = s.getBytes();
for(int i = 0; i < length; i++){
rVal[4+i] = stringBytes[i];
}
return rVal;
}
public static byte[] serializeDoubleToBytes(double i){
byte[] rVal = new byte[8];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.putDouble(i);
integerCompactor.position(0);
integerCompactor.limit(8);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
rVal[4] = integerCompactor.get(4);
rVal[5] = integerCompactor.get(5);
rVal[6] = integerCompactor.get(6);
rVal[7] = integerCompactor.get(7);
bufferLock.release();
return rVal;
}
import java.nio.ByteBuffer;
import java.util.List;
import java.util.concurrent.Semaphore;
public class ByteStreamUtils {
static ByteBuffer integerCompactor;
static Semaphore bufferLock = new Semaphore(1);
static {
integerCompactor = ByteBuffer.allocate(8);
}
public static int popIntFromByteQueue(List<Byte> queue){
int rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(4);
rVal = integerCompactor.getInt();
bufferLock.release();
return rVal;
}
public static float popFloatFromByteQueue(List<Byte> queue){
float rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(4);
rVal = integerCompactor.getFloat();
bufferLock.release();
return rVal;
}
public static long popLongFromByteQueue(List<Byte> queue){
long rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.put(4,queue.remove(0));
integerCompactor.put(5,queue.remove(0));
integerCompactor.put(6,queue.remove(0));
integerCompactor.put(7,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(8);
rVal = integerCompactor.getLong();
bufferLock.release();
return rVal;
}
public static String popStringFromByteQueue(List<Byte> queue){
int length = popIntFromByteQueue(queue);
byte[] stringBytes = new byte[length];
for(int i = 0; i < length; i++){
stringBytes[i] = queue.remove(0);
}
String rVal = new String(stringBytes);
return rVal;
}
public static double popDoubleFromByteQueue(List<Byte> queue){
double rVal = -1;
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.put(0,queue.remove(0));
integerCompactor.put(1,queue.remove(0));
integerCompactor.put(2,queue.remove(0));
integerCompactor.put(3,queue.remove(0));
integerCompactor.put(4,queue.remove(0));
integerCompactor.put(5,queue.remove(0));
integerCompactor.put(6,queue.remove(0));
integerCompactor.put(7,queue.remove(0));
integerCompactor.position(0);
integerCompactor.limit(8);
rVal = integerCompactor.getDouble();
bufferLock.release();
return rVal;
}
public static byte[] serializeIntToBytes(int i){
byte[] rVal = new byte[4];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.putInt(i);
integerCompactor.position(0);
integerCompactor.limit(4);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
bufferLock.release();
return rVal;
}
public static byte[] serializeFloatToBytes(float i){
byte[] rVal = new byte[4];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(4);
integerCompactor.putFloat(i);
integerCompactor.position(0);
integerCompactor.limit(4);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
bufferLock.release();
return rVal;
}
public static byte[] serializeLongToBytes(long i){
byte[] rVal = new byte[8];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.putLong(i);
integerCompactor.position(0);
integerCompactor.limit(8);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
rVal[4] = integerCompactor.get(4);
rVal[5] = integerCompactor.get(5);
rVal[6] = integerCompactor.get(6);
rVal[7] = integerCompactor.get(7);
bufferLock.release();
return rVal;
}
public static byte[] serializeStringToBytes(String s){
int length = s.length();
byte[] rVal = new byte[length + 4]; //the 4 is the header int for the string size
byte[] serializedInteger = serializeIntToBytes(length);
rVal[0] = serializedInteger[0];
rVal[1] = serializedInteger[1];
rVal[2] = serializedInteger[2];
rVal[3] = serializedInteger[3];
byte[] stringBytes = s.getBytes();
for(int i = 0; i < length; i++){
rVal[4+i] = stringBytes[i];
}
return rVal;
}
public static byte[] serializeDoubleToBytes(double i){
byte[] rVal = new byte[8];
bufferLock.acquireUninterruptibly();
integerCompactor.clear();
integerCompactor.position(0);
integerCompactor.limit(8);
integerCompactor.putDouble(i);
integerCompactor.position(0);
integerCompactor.limit(8);
rVal[0] = integerCompactor.get(0);
rVal[1] = integerCompactor.get(1);
rVal[2] = integerCompactor.get(2);
rVal[3] = integerCompactor.get(3);
rVal[4] = integerCompactor.get(4);
rVal[5] = integerCompactor.get(5);
rVal[6] = integerCompactor.get(6);
rVal[7] = integerCompactor.get(7);
bufferLock.release();
return rVal;
}
}

View File

@ -11,12 +11,14 @@ import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.net.parser.net.message.AuthMessage;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.parser.net.message.StatusMessage;
import electrosphere.net.parser.net.message.WorldMessage;
import electrosphere.net.parser.net.message.ServerMessage;
import electrosphere.net.parser.net.raw.NetworkParser;
import electrosphere.net.server.protocol.ServerProtocol;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -50,6 +52,7 @@ public class ServerConnectionHandler implements Runnable {
InputStream inputStream;
OutputStream outputStream;
boolean initialized;
boolean isAuthenticated = false;
NetworkParser networkParser;
int playerID;
int playerCharacterID;
@ -58,7 +61,7 @@ public class ServerConnectionHandler implements Runnable {
public ServerConnectionHandler(Socket socket) {
this.socket = socket;
playerID = getPlayerID();
playerID = getNewPlayerID();
LoggerInterface.loggerNetworking.INFO("Player ID: " + playerID);
}
@ -95,81 +98,9 @@ public class ServerConnectionHandler implements Runnable {
ex.printStackTrace();
System.exit(1);
}
spawnPlayerCharacter();
//world metadata
networkParser.addOutgoingMessage(
WorldMessage.constructMetadataMessage(
Globals.serverWorldData.getWorldSizeDiscrete(),
Globals.serverWorldData.getDynamicInterpolationRatio(),
Globals.serverWorldData.getRandomDampener(),
(int)Globals.serverWorldData.getWorldBoundMin().x,
(int)Globals.serverWorldData.getWorldBoundMin().z,
(int)Globals.serverWorldData.getWorldBoundMax().x,
(int)Globals.serverWorldData.getWorldBoundMax().z
)
);
//set client initial discrete position
networkParser.addOutgoingMessage(
PlayerMessage.constructSetInitialDiscretePositionMessage(
Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x),
Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z)
)
);
//send spawn point
networkParser.addOutgoingMessage(
WorldMessage.constructSpawnPositionMessage(Globals.spawnPoint.x, Globals.spawnPoint.z)
);
//tell them what player stats they are
networkParser.addOutgoingMessage(PlayerMessage.constructSet_IDMessage(playerID));
//figure out what chunk they're in
//queue messages for that chunk
if(Globals.RUN_SERVER && Main.playerId == -1){
} else {
for(Entity currentEntity : Globals.entityManager.getMoveable()){
networkParser.addOutgoingMessage(
EntityMessage.constructCreateMessage(
currentEntity.getId(),
0, //0 for creatures
CreatureUtils.getType(currentEntity),
EntityUtils.getPosition(currentEntity).x,
EntityUtils.getPosition(currentEntity).y,
EntityUtils.getPosition(currentEntity).z
)
);
if(CreatureUtils.isCreature(currentEntity)){
if(CreatureUtils.hasControllerPlayerId(currentEntity)){
LoggerInterface.loggerNetworking.INFO("Sending controller packets");
networkParser.addOutgoingMessage(NetUtils.createSetCreatureControllerIdEntityMessage(currentEntity));
}
}
}
for(Entity currentEntity : Globals.entityManager.getItemEntities()){
networkParser.addOutgoingMessage(
EntityMessage.constructCreateMessage(
currentEntity.getId(),
1, //1 for items
ItemUtils.getType(currentEntity),
EntityUtils.getPosition(currentEntity).x,
EntityUtils.getPosition(currentEntity).y,
EntityUtils.getPosition(currentEntity).z
)
);
if(AttachUtils.isAttached(currentEntity)){
networkParser.addOutgoingMessage(
EntityMessage.constructattachEntityToEntityMessage(
currentEntity.getId(),
AttachUtils.getTargetBone(currentEntity),
AttachUtils.getParent(currentEntity).getId()
)
);
}
}
}
//let client know it's ready
networkParser.addOutgoingMessage(StatusMessage.constructReadyMessage(1));
networkParser.addOutgoingMessage(ServerMessage.constructPingMessage());
networkParser.addOutgoingMessage(AuthMessage.constructAuthRequestMessage());
initialized = true;
while(Main.isRunning()){
@ -191,38 +122,26 @@ public class ServerConnectionHandler implements Runnable {
}
}
void spawnPlayerCharacter(){
Player newPlayerObject = new Player(this);
Globals.playerManager.registerPlayer(newPlayerObject);
//spawn player in world
Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature("human");
playerCharacterID = newPlayerCharacter.getId();
CollisionObjUtils.positionCharacter(newPlayerCharacter, new Vector3f(Globals.spawnPoint.x,Globals.spawnPoint.y,Globals.spawnPoint.z));
//attach player object to player character
newPlayerObject.setPlayerEntity(newPlayerCharacter);
newPlayerObject.setWorldX(Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x));
newPlayerObject.setWorldY(Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z));
// System.out.println(EntityUtils.getRotation(newPlayerCharacter).set(0,1,0,1).normalize());
Globals.dataCellManager.addPlayerToGroundCells(newPlayerObject);
Globals.dataCellManager.movePlayerGroundCells(newPlayerObject, Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x), Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z));
IronSightTree.attachIronSightTree(newPlayerCharacter);
// //spawn player sword
// Entity sword = ItemUtils.spawnBasicItem("Katana");
// AttachUtils.attachEntityToEntityAtBone(newPlayerCharacter, sword, "Bone.031");
//set controller id
CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerID);
if(Globals.RUN_SERVER && Main.playerId == -1){
Globals.playerCharacter = newPlayerCharacter;
Globals.serverPlayer = newPlayerObject;
}
public void setPlayerId(int id){
playerID = id;
}
public int getPlayerId(){
return playerID;
}
static int getPlayerID(){
static int getNewPlayerID(){
playerIdIncrementer++;
return playerIdIncrementer;
}
public void setPlayerCharacterId(int id){
playerCharacterID = id;
}
public int getPlayerCharacterId(){
return playerCharacterID;
}
public void addMessagetoOutgoingQueue(NetworkMessage message){
switch(message.getType()){

View File

@ -1,177 +0,0 @@
package electrosphere.net.server;
import electrosphere.entity.Entity;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.game.server.terrain.manager.ServerTerrainChunk;
import electrosphere.game.server.terrain.models.TerrainModification;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.WorldMessage;
public class ServerProtocol {
ServerConnectionHandler connectionHandler;
public ServerProtocol(ServerConnectionHandler connectionHandler){
this.connectionHandler = connectionHandler;
}
void handleMessage(NetworkMessage message){
switch(message.getType()){
case ENTITY_MESSAGE:
handleEntityMessage((EntityMessage)message);
break;
case WORLD_MESSAGE:
handleWorldMessage((WorldMessage)message);
break;
}
}
void handleEntityMessage(EntityMessage message){
Entity targetEntity;
switch(message.getMessageSubtype()){
case CREATE:
break;
case DESTROY:
break;
case MOVE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
}
break;
case SETBEHAVIORTREE:
break;
case MOVEUPDATE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
}
break;
case ATTACKUPDATE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToAttackTree(targetEntity,message);
}
break;
}
}
void handleWorldMessage(WorldMessage message){
switch(message.getMessageSubtype()){
case REQUESTCHUNK:
/*
int locationX,
int locationY,
float macroValue00,
float macroValue01,
float macroValue02,
float macroValue10,
float macroValue11,
float macroValue12,
float macroValue20,
float macroValue21,
float macroValue22,
long randomizerValue00,
long randomizerValue01,
long randomizerValue02,
long randomizerValue10,
long randomizerValue11,
long randomizerValue12,
long randomizerValue20,
long randomizerValue21,
long randomizerValue22
*/
// System.out.println("Received request for chunk " + message.getworldX() + " " + message.getworldY());
ServerTerrainChunk chunk = Globals.serverTerrainManager.getChunk(message.getworldX(), message.getworldY());
float[][] macroValues = chunk.getMacroValues();//Globals.serverTerrainManager.getRad5MacroValues(message.getworldX(), message.getworldY());
long[][] randomizer = chunk.getRandomizer();//Globals.serverTerrainManager.getRandomizer(message.getworldX(), message.getworldY());
int numMessages = 2 + chunk.getModifications().size();
connectionHandler.addMessagetoOutgoingQueue(
WorldMessage.constructchunkLoadStartMessage(message.getworldX(), message.getworldY(), numMessages)
);
connectionHandler.addMessagetoOutgoingQueue(
WorldMessage.constructMacroValueMessage(
message.getworldX(),
message.getworldY(),
macroValues[0][0],
macroValues[0][1],
macroValues[0][2],
macroValues[0][3],
macroValues[0][4],
macroValues[1][0],
macroValues[1][1],
macroValues[1][2],
macroValues[1][3],
macroValues[1][4],
macroValues[2][0],
macroValues[2][1],
macroValues[2][2],
macroValues[2][3],
macroValues[2][4],
macroValues[3][0],
macroValues[3][1],
macroValues[3][2],
macroValues[3][3],
macroValues[3][4],
macroValues[4][0],
macroValues[4][1],
macroValues[4][2],
macroValues[4][3],
macroValues[4][4],
randomizer[0][0],
randomizer[0][1],
randomizer[0][2],
randomizer[0][3],
randomizer[0][4],
randomizer[1][0],
randomizer[1][1],
randomizer[1][2],
randomizer[1][3],
randomizer[1][4],
randomizer[2][0],
randomizer[2][1],
randomizer[2][2],
randomizer[2][3],
randomizer[2][4],
randomizer[3][0],
randomizer[3][1],
randomizer[3][2],
randomizer[3][3],
randomizer[3][4],
randomizer[4][0],
randomizer[4][1],
randomizer[4][2],
randomizer[4][3],
randomizer[4][4]
)
);
for(TerrainModification modification : chunk.getModifications()){
connectionHandler.addMessagetoOutgoingQueue(
WorldMessage.constructheightMapModificationMessage(
modification.getValue(),
modification.getWorldX(),
modification.getWorldY(),
modification.getLocationX(),
modification.getLocationY()
)
);
}
break;
}
}
}

View File

@ -1,8 +1,10 @@
package electrosphere.net.server;
package electrosphere.net.server.player;
import electrosphere.entity.Entity;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.server.ServerConnectionHandler;
import java.util.concurrent.Semaphore;
/**

View File

@ -1,4 +1,4 @@
package electrosphere.net.server;
package electrosphere.net.server.player;
import java.util.Collection;
import java.util.HashMap;

View File

@ -0,0 +1,33 @@
package electrosphere.net.server.protocol;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.AuthMessage;
import electrosphere.net.server.ServerConnectionHandler;
public class AuthProtocol {
protected static void handleAuthenticationMessage(ServerConnectionHandler connectionHandler, AuthMessage message){
switch(message.getMessageSubtype()){
case AUTHDETAILS:
//auth check
boolean successfulLogin = Globals.authenticationManager.authenticate(message.getuser(), message.getpass());
if(successfulLogin){
//TODO: actually set connection/protocol to authenticated
connectionHandler.addMessagetoOutgoingQueue(AuthMessage.constructAuthSuccessMessage());
} else {
connectionHandler.addMessagetoOutgoingQueue(AuthMessage.constructAuthFailureMessage());
}
break;
case AUTHREQUEST:
//silently drop
break;
case AUTHSUCCESS:
//silently drop
break;
case AUTHFAILURE:
//silently drop
break;
}
}
}

View File

@ -0,0 +1,86 @@
package electrosphere.net.server.protocol;
import org.joml.Vector3f;
import electrosphere.entity.Entity;
import electrosphere.entity.state.ironsight.IronSightTree;
import electrosphere.entity.types.collision.CollisionObjUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.parser.net.message.CharacterMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.net.server.ServerConnectionHandler;
import electrosphere.net.server.player.Player;
public class CharacterProtocol {
protected static void handleCharacterMessage(ServerConnectionHandler connectionHandler, CharacterMessage message){
switch(message.getMessageSubtype()){
case REQUESTCHARACTERLIST:
//TODO
break;
case REQUESTCREATECHARACTER:
//TODO
break;
case REQUESTSPAWNCHARACTER:
spawnPlayerCharacter(connectionHandler);
break;
case RESPONSECHARACTERLIST:
//silently ignore
break;
case RESPONSECREATECHARACTER:
//silently ignore
break;
case RESPONSESPAWNCHARACTER:
//silently ignore
break;
}
}
static void spawnPlayerCharacter(ServerConnectionHandler connectionHandler){
Player newPlayerObject = new Player(connectionHandler);
Globals.playerManager.registerPlayer(newPlayerObject);
//spawn player in world
Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature("human");
int playerCharacterId = newPlayerCharacter.getId();
connectionHandler.setPlayerCharacterId(playerCharacterId);
CollisionObjUtils.positionCharacter(newPlayerCharacter, new Vector3f(Globals.spawnPoint.x,Globals.spawnPoint.y,Globals.spawnPoint.z));
//attach player object to player character
newPlayerObject.setPlayerEntity(newPlayerCharacter);
newPlayerObject.setWorldX(Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x));
newPlayerObject.setWorldY(Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z));
// System.out.println(EntityUtils.getRotation(newPlayerCharacter).set(0,1,0,1).normalize());
Globals.dataCellManager.addPlayerToGroundCells(newPlayerObject);
Globals.dataCellManager.movePlayerGroundCells(newPlayerObject, Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x), Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z));
IronSightTree.attachIronSightTree(newPlayerCharacter);
// //spawn player sword
// Entity sword = ItemUtils.spawnBasicItem("Katana");
// AttachUtils.attachEntityToEntityAtBone(newPlayerCharacter, sword, "Bone.031");
//set controller id
CreatureUtils.setControllerPlayerId(newPlayerCharacter, playerCharacterId);
if(Globals.RUN_SERVER && Main.playerId == -1){
Globals.playerEntity = newPlayerCharacter;
Globals.serverPlayer = newPlayerObject;
}
}
static void spawnClientEntity(ServerConnectionHandler connectionHandler){
spawnPlayerCharacter(connectionHandler);
//set client initial discrete position
connectionHandler.addMessagetoOutgoingQueue(
PlayerMessage.constructSetInitialDiscretePositionMessage(
Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x),
Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.z)
)
);
//send spawn point
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructSpawnPositionMessage(Globals.spawnPoint.x, Globals.spawnPoint.z)
);
//tell them what player stats they are
connectionHandler.addMessagetoOutgoingQueue(PlayerMessage.constructSet_IDMessage(connectionHandler.getPlayerCharacterId()));
}
}

View File

@ -0,0 +1,101 @@
package electrosphere.net.server.protocol;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.server.ServerConnectionHandler;
public class EntityProtocol {
protected static void handleEntityMessage(ServerConnectionHandler connectionHandler, EntityMessage message){
Entity targetEntity;
switch(message.getMessageSubtype()){
case CREATE:
break;
case DESTROY:
break;
case MOVE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
}
break;
case SETBEHAVIORTREE:
break;
case MOVEUPDATE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToMovementTree(targetEntity,message);
}
break;
case ATTACKUPDATE:
targetEntity = Globals.entityManager.getEntityFromId(message.getentityID());
if(targetEntity != null){
CreatureUtils.attachEntityMessageToAttackTree(targetEntity,message);
}
break;
//ignore stack
case ATTACHENTITYTOENTITY:
case SETFACING:
case SETPOSITION:
case SETPROPERTY:
//silently ignore
break;
}
}
void queueChunkState(ServerConnectionHandler connectionHandler){
//queue messages for that chunk
if(Globals.RUN_SERVER && Main.playerId == -1){
} else {
for(Entity currentEntity : Globals.entityManager.getMoveable()){
connectionHandler.addMessagetoOutgoingQueue(
EntityMessage.constructCreateMessage(
currentEntity.getId(),
0, //0 for creatures
CreatureUtils.getType(currentEntity),
EntityUtils.getPosition(currentEntity).x,
EntityUtils.getPosition(currentEntity).y,
EntityUtils.getPosition(currentEntity).z
)
);
if(CreatureUtils.isCreature(currentEntity)){
if(CreatureUtils.hasControllerPlayerId(currentEntity)){
LoggerInterface.loggerNetworking.INFO("Sending controller packets");
connectionHandler.addMessagetoOutgoingQueue(NetUtils.createSetCreatureControllerIdEntityMessage(currentEntity));
}
}
}
for(Entity currentEntity : Globals.entityManager.getItemEntities()){
connectionHandler.addMessagetoOutgoingQueue(
EntityMessage.constructCreateMessage(
currentEntity.getId(),
1, //1 for items
ItemUtils.getType(currentEntity),
EntityUtils.getPosition(currentEntity).x,
EntityUtils.getPosition(currentEntity).y,
EntityUtils.getPosition(currentEntity).z
)
);
if(AttachUtils.isAttached(currentEntity)){
connectionHandler.addMessagetoOutgoingQueue(
EntityMessage.constructattachEntityToEntityMessage(
currentEntity.getId(),
AttachUtils.getTargetBone(currentEntity),
AttachUtils.getParent(currentEntity).getId()
)
);
}
}
}
}
}

View File

@ -0,0 +1,28 @@
package electrosphere.net.server.protocol;
import electrosphere.net.parser.net.message.LoreMessage;
import electrosphere.net.server.ServerConnectionHandler;
public class LoreProtocol {
protected static void handleLoreMessage(ServerConnectionHandler connectionHandler, LoreMessage message){
switch(message.getMessageSubtype()){
case REQUESTDATA:
//TODO
break;
case REQUESTRACEDATA:
//TODO
break;
case REQUESTRACES:
//TODO
break;
case RESPONSEDATA:
case RESPONSERACES:
case RESPONSERACEDATA:
//silently ignore
break;
}
}
}

View File

@ -0,0 +1,14 @@
package electrosphere.net.server.protocol;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.server.ServerConnectionHandler;
public class PlayerProtocol {
protected static void handlePlayerMessage(ServerConnectionHandler connectionHandler, PlayerMessage message){
switch(message.getMessageSubtype()){
}
}
}

View File

@ -0,0 +1,78 @@
package electrosphere.net.server.protocol;
import org.joml.Vector3f;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.ironsight.IronSightTree;
import electrosphere.entity.types.attach.AttachUtils;
import electrosphere.entity.types.collision.CollisionObjUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.server.terrain.manager.ServerTerrainChunk;
import electrosphere.game.server.terrain.models.TerrainModification;
import electrosphere.logger.LoggerInterface;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.net.parser.net.message.AuthMessage;
import electrosphere.net.parser.net.message.CharacterMessage;
import electrosphere.net.parser.net.message.EntityMessage;
import electrosphere.net.parser.net.message.LoreMessage;
import electrosphere.net.parser.net.message.NetworkMessage;
import electrosphere.net.parser.net.message.PlayerMessage;
import electrosphere.net.parser.net.message.ServerMessage;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.net.server.ServerConnectionHandler;
import electrosphere.net.server.player.Player;
public class ServerProtocol {
ServerConnectionHandler connectionHandler;
int playerCharacterID;
public ServerProtocol(ServerConnectionHandler connectionHandler){
this.connectionHandler = connectionHandler;
}
public void handleMessage(NetworkMessage message){
LoggerInterface.loggerNetworking.DEBUG("[Server] New message " + message.getType());
switch(message.getType()){
case ENTITY_MESSAGE:
EntityProtocol.handleEntityMessage(connectionHandler, (EntityMessage)message);
break;
case TERRAIN_MESSAGE:
TerrainProtocol.handleTerrainMessage(connectionHandler, (TerrainMessage)message);
break;
case PLAYER_MESSAGE:
PlayerProtocol.handlePlayerMessage(connectionHandler, (PlayerMessage)message);
break;
case AUTH_MESSAGE:
AuthProtocol.handleAuthenticationMessage(connectionHandler, (AuthMessage)message);
break;
case SERVER_MESSAGE:
handleServerMessage((ServerMessage)message);
break;
case CHARACTER_MESSAGE:
CharacterProtocol.handleCharacterMessage(connectionHandler, (CharacterMessage)message);
break;
case LORE_MESSAGE:
LoreProtocol.handleLoreMessage(connectionHandler, (LoreMessage)message);
break;
}
}
void handleServerMessage(ServerMessage message){
switch(message.getMessageSubtype()){
case PING:
connectionHandler.addMessagetoOutgoingQueue(ServerMessage.constructPongMessage());
break;
case PONG:
//silently drop
break;
}
}
}

View File

@ -0,0 +1,160 @@
package electrosphere.net.server.protocol;
import electrosphere.game.server.terrain.manager.ServerTerrainChunk;
import electrosphere.game.server.terrain.models.TerrainModification;
import electrosphere.main.Globals;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.net.server.Server;
import electrosphere.net.server.ServerConnectionHandler;
public class TerrainProtocol {
protected static void handleTerrainMessage(ServerConnectionHandler connectionHandler, TerrainMessage message){
switch(message.getMessageSubtype()){
case REQUESTCHUNK:
sendWorldChunk(connectionHandler, message.getworldX(), message.getworldY());
break;
case REQUESTMETADATA:
sendWorldMetadata(connectionHandler);
break;
//all ignored message types
case CHUNKLOADSTART:
case HEIGHTMAPMODIFICATION:
case MACROVALUE:
case RESPONSEMETADATA:
case SPAWNPOSITION:
case UPDATE:
//silently ignore
break;
}
}
static void sendWorldChunk(ServerConnectionHandler connectionHandler, int worldX, int worldY){
/*
int locationX,
int locationY,
float macroValue00,
float macroValue01,
float macroValue02,
float macroValue10,
float macroValue11,
float macroValue12,
float macroValue20,
float macroValue21,
float macroValue22,
long randomizerValue00,
long randomizerValue01,
long randomizerValue02,
long randomizerValue10,
long randomizerValue11,
long randomizerValue12,
long randomizerValue20,
long randomizerValue21,
long randomizerValue22
*/
// System.out.println("Received request for chunk " + message.getworldX() + " " + message.getworldY());
ServerTerrainChunk chunk = Globals.serverTerrainManager.getChunk(worldX, worldY);
float[][] macroValues = chunk.getMacroValues();//Globals.serverTerrainManager.getRad5MacroValues(message.getworldX(), message.getworldY());
long[][] randomizer = chunk.getRandomizer();//Globals.serverTerrainManager.getRandomizer(message.getworldX(), message.getworldY());
int numMessages = 2 + chunk.getModifications().size();
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructchunkLoadStartMessage(worldX, worldY, numMessages)
);
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructMacroValueMessage(
worldX,
worldY,
macroValues[0][0],
macroValues[0][1],
macroValues[0][2],
macroValues[0][3],
macroValues[0][4],
macroValues[1][0],
macroValues[1][1],
macroValues[1][2],
macroValues[1][3],
macroValues[1][4],
macroValues[2][0],
macroValues[2][1],
macroValues[2][2],
macroValues[2][3],
macroValues[2][4],
macroValues[3][0],
macroValues[3][1],
macroValues[3][2],
macroValues[3][3],
macroValues[3][4],
macroValues[4][0],
macroValues[4][1],
macroValues[4][2],
macroValues[4][3],
macroValues[4][4],
randomizer[0][0],
randomizer[0][1],
randomizer[0][2],
randomizer[0][3],
randomizer[0][4],
randomizer[1][0],
randomizer[1][1],
randomizer[1][2],
randomizer[1][3],
randomizer[1][4],
randomizer[2][0],
randomizer[2][1],
randomizer[2][2],
randomizer[2][3],
randomizer[2][4],
randomizer[3][0],
randomizer[3][1],
randomizer[3][2],
randomizer[3][3],
randomizer[3][4],
randomizer[4][0],
randomizer[4][1],
randomizer[4][2],
randomizer[4][3],
randomizer[4][4]
)
);
for(TerrainModification modification : chunk.getModifications()){
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructheightMapModificationMessage(
modification.getValue(),
modification.getWorldX(),
modification.getWorldY(),
modification.getLocationX(),
modification.getLocationY()
)
);
}
}
static void sendWorldMetadata(ServerConnectionHandler connectionHandler){
//world metadata
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructResponseMetadataMessage(
Globals.serverWorldData.getWorldSizeDiscrete(),
Globals.serverWorldData.getDynamicInterpolationRatio(),
Globals.serverWorldData.getRandomDampener(),
(int)Globals.serverWorldData.getWorldBoundMin().x,
(int)Globals.serverWorldData.getWorldBoundMin().z,
(int)Globals.serverWorldData.getWorldBoundMax().x,
(int)Globals.serverWorldData.getWorldBoundMax().z
)
);
}
}

View File

@ -3,659 +3,15 @@
"packageName" : "electrosphere.net.parser",
"categories":[
],
{
"categoryName" : "Status",
"data" : [
{
"name" : "ready",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
{
"messageName" : "Ready",
"data" : [
"ready"
]
}
]
},
{
"categoryName" : "World",
"data" : [
{
"name" : "worldSizeDiscrete",
"type" : "FIXED_INT"
},
{
"name" : "dynamicInterpolationRatio",
"type" : "FIXED_INT"
},
{
"name" : "randomDampener",
"type" : "FIXED_FLOAT"
},
{
"name" : "worldMinX",
"type" : "FIXED_INT"
},
{
"name" : "worldMinY",
"type" : "FIXED_INT"
},
{
"name" : "worldMaxX",
"type" : "FIXED_INT"
},
{
"name" : "worldMaxY",
"type" : "FIXED_INT"
},
{
"name" : "worldX",
"type" : "FIXED_INT"
},
{
"name" : "worldY",
"type" : "FIXED_INT"
},
{
"name" : "value",
"type" : "FIXED_FLOAT"
},
{
"name" : "locationX",
"type" : "FIXED_INT"
},
{
"name" : "locationY",
"type" : "FIXED_INT"
},
{
"name" : "realLocationX",
"type" : "FIXED_FLOAT"
},
{
"name" : "realLocationY",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue00",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue01",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue02",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue03",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue04",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue10",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue11",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue12",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue13",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue14",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue20",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue21",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue22",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue23",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue24",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue30",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue31",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue32",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue33",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue34",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue40",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue41",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue42",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue43",
"type" : "FIXED_FLOAT"
},
{
"name" : "macroValue44",
"type" : "FIXED_FLOAT"
},
{
"name" : "randomizerValue00",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue01",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue02",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue03",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue04",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue10",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue11",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue12",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue13",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue14",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue20",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue21",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue22",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue23",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue24",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue30",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue31",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue32",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue33",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue34",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue40",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue41",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue42",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue43",
"type" : "FIXED_LONG"
},
{
"name" : "randomizerValue44",
"type" : "FIXED_LONG"
}
],
"messageTypes" : [
{
"messageName" : "Metadata",
"data" : [
"worldSizeDiscrete",
"dynamicInterpolationRatio",
"randomDampener",
"worldMinX",
"worldMinY",
"worldMaxX",
"worldMaxY"
]
},
{
"messageName" : "RequestChunk",
"data" : [
"worldX",
"worldY"
]
},
{
"messageName" : "Update",
"data" : [
"locationX",
"locationY"
]
},
{
"messageName" : "chunkLoadStart",
"data" : [
"worldX",
"worldY",
"value"
]
},
{
"messageName" : "MacroValue",
"data" : [
"worldX",
"worldY",
"macroValue00",
"macroValue01",
"macroValue02",
"macroValue03",
"macroValue04",
"macroValue10",
"macroValue11",
"macroValue12",
"macroValue13",
"macroValue14",
"macroValue20",
"macroValue21",
"macroValue22",
"macroValue23",
"macroValue24",
"macroValue30",
"macroValue31",
"macroValue32",
"macroValue33",
"macroValue34",
"macroValue40",
"macroValue41",
"macroValue42",
"macroValue43",
"macroValue44",
"randomizerValue00",
"randomizerValue01",
"randomizerValue02",
"randomizerValue03",
"randomizerValue04",
"randomizerValue10",
"randomizerValue11",
"randomizerValue12",
"randomizerValue13",
"randomizerValue14",
"randomizerValue20",
"randomizerValue21",
"randomizerValue22",
"randomizerValue23",
"randomizerValue24",
"randomizerValue30",
"randomizerValue31",
"randomizerValue32",
"randomizerValue33",
"randomizerValue34",
"randomizerValue40",
"randomizerValue41",
"randomizerValue42",
"randomizerValue43",
"randomizerValue44"
]
},
{
"messageName" : "heightMapModification",
"data" : [
"value",
"worldX",
"worldY",
"locationX",
"locationY"
]
},
{
"messageName" : "SpawnPosition",
"data" : [
"realLocationX",
"realLocationY"
]
}
]
},
{
"categoryName" : "Player",
"data" : [
{
"name" : "playerID",
"type" : "FIXED_INT"
},
{
"name" : "initialDiscretePositionX",
"type" : "FIXED_INT"
},
{
"name" : "initialDiscretePositionY",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
{
"messageName" : "Set_ID",
"data" : [
"playerID"
]
},
{
"messageName" : "SetInitialDiscretePosition",
"data" : [
"initialDiscretePositionX",
"initialDiscretePositionY"
]
}
]
},
{
"categoryName" : "Entity",
"data" : [
{
"name" : "entityCategory",
"type" : "FIXED_INT"
},
{
"name" : "entitySubtype",
"type" : "VAR_STRING"
},
{
"name" : "entityID",
"type" : "FIXED_INT"
},
{
"name" : "positionX",
"type" : "FIXED_DOUBLE"
},
{
"name" : "positionY",
"type" : "FIXED_DOUBLE"
},
{
"name" : "positionZ",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationW",
"type" : "FIXED_FLOAT"
},
{
"name" : "rotationX",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationY",
"type" : "FIXED_DOUBLE"
},
{
"name" : "rotationZ",
"type" : "FIXED_DOUBLE"
},
{
"name" : "velocity",
"type" : "FIXED_DOUBLE"
},
{
"name" : "treeState",
"type" : "FIXED_INT"
},
{
"name" : "propertyType",
"type" : "FIXED_INT"
},
{
"name" : "propertyValue",
"type" : "FIXED_INT"
},
{
"name" : "treeType",
"type" : "FIXED_INT"
},
{
"name" : "treeStatus",
"type" : "FIXED_INT"
},
{
"name" : "time",
"type" : "FIXED_LONG"
},
{
"name" : "bone",
"type" : "VAR_STRING"
},
{
"name" : "targetID",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
{
"messageName" : "Create",
"data" : [
"entityID",
"entityCategory",
"entitySubtype",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "SetPosition",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "setFacing",
"data" : [
"entityID",
"time",
"rotationX",
"rotationY",
"rotationZ"
]
},
{
"messageName" : "moveUpdate",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ",
"rotationX",
"rotationY",
"rotationZ",
"velocity",
"treeState"
]
},
{
"messageName" : "attackUpdate",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ",
"rotationX",
"rotationY",
"rotationZ",
"velocity",
"treeState"
]
},
{
"messageName" : "Move",
"data" : [
"entityID",
"time",
"positionX",
"positionY",
"positionZ"
]
},
{
"messageName" : "Destroy",
"data" : [
"entityID"
]
},
{
"messageName" : "SetBehaviorTree",
"data" : [
"entityID",
"time",
"treeType",
"treeStatus"
]
},
{
"messageName" : "setProperty",
"data" : [
"entityID",
"time",
"propertyType",
"propertyValue"
]
},
{
"messageName" : "attachEntityToEntity",
"data" : [
"entityID",
"bone",
"targetID"
]
}
]
}
"subfiles" : [
"./net/entity.json",
"./net/lore.json",
"./net/player.json",
"./net/terrain.json",
"./net/world.json",
"./net/server.json"
]
}