Working on getting items streaming over net

This commit is contained in:
austin 2021-06-20 19:41:35 -04:00
parent 1c4b2d9846
commit 6bea0cc24f
15 changed files with 195 additions and 17 deletions

View File

@ -78,7 +78,7 @@ public class ControlHandler {
MAIN_GAME,
}
ControlsState state;
ControlsState state = ControlsState.TITLE_MENU;
HashMap<String, Integer> controlsMap;

View File

@ -42,4 +42,8 @@ public class ItemUtils {
actor.playAnimation("Sword|Idle");
}
}
public static boolean isItem(Entity item){
return item.getDataKeys().contains(EntityDataStrings.ITEM_IS_ITEM);
}
}

View File

@ -41,7 +41,7 @@ public class DrawCellManager {
int drawRadius = 1;
int drawRadius = 5;
int drawStepdownInterval = 3;
int drawStepdownValue = 5;

View File

@ -39,4 +39,16 @@ public class AttachUtils {
}
}
}
public static boolean isAttached(Entity e){
return e.getDataKeys().contains(EntityDataStrings.ATTACH_ENTITY_IS_ATTACHED);
}
public static String getTargetBone(Entity e){
return (String)e.getData(EntityDataStrings.ATTACH_TARGET_BONE);
}
public static Entity getParent(Entity e){
return (Entity)e.getData(EntityDataStrings.ATTACH_PARENT);
}
}

View File

@ -4,6 +4,7 @@ import electrosphere.entity.Entity;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.game.client.world.ClientWorldData;
import electrosphere.game.state.AttachUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.parser.net.message.EntityMessage;
@ -80,6 +81,14 @@ public class ClientProtocol {
}
}
break;
case ATTACHENTITYTOENTITY:
Entity child = Globals.entityManager.getEntityFromId(message.getentityID());
Entity parent = Globals.entityManager.getEntityFromId(message.gettargetID());
System.out.println("Attach " + message.getentityID() + " to " + message.gettargetID() + " on bone " + message.getbone());
if(child != null && parent != null){
AttachUtils.attachEntityToEntityAtBone(parent, child, message.getbone());
}
break;
}
}

View File

@ -1,6 +1,7 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class EntityMessage extends NetworkMessage {
@ -12,6 +13,7 @@ public class EntityMessage extends NetworkMessage {
DESTROY,
SETBEHAVIORTREE,
SETPROPERTY,
ATTACHENTITYTOENTITY,
}
EntityMessageType messageType;
@ -25,6 +27,8 @@ public class EntityMessage extends NetworkMessage {
int treeType;
int treeStatus;
long time;
String bone;
int targetID;
EntityMessage(EntityMessageType messageType){
this.type = MessageType.ENTITY_MESSAGE;
@ -115,6 +119,22 @@ public class EntityMessage extends NetworkMessage {
this.time = time;
}
public String getbone() {
return bone;
}
public void setbone(String bone) {
this.bone = bone;
}
public int gettargetID() {
return targetID;
}
public void settargetID(int targetID) {
this.targetID = targetID;
}
static void stripPacketHeader(List<Byte> byteStream){
byteStream.remove(0);
byteStream.remove(0);
@ -158,6 +178,8 @@ public class EntityMessage extends NetworkMessage {
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY:
return EntityMessage.canParseattachEntityToEntityMessage(byteStream);
}
return false;
}
@ -282,12 +304,56 @@ public class EntityMessage extends NetworkMessage {
return rVal;
}
public static boolean canParseattachEntityToEntityMessage(List<Byte> byteStream){
int currentStreamLength = byteStream.size();
List<Byte> temporaryByteQueue = new LinkedList();
if(currentStreamLength < 6){
return false;
}
int boneSize = 0;
if(currentStreamLength < 10){
return false;
} else {
temporaryByteQueue.add(byteStream.get(6 + 0));
temporaryByteQueue.add(byteStream.get(6 + 1));
temporaryByteQueue.add(byteStream.get(6 + 2));
temporaryByteQueue.add(byteStream.get(6 + 3));
boneSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 10 + boneSize){
return false;
}
if(currentStreamLength < 10){
return false;
}
return true;
}
public static EntityMessage parseattachEntityToEntityMessage(List<Byte> byteStream){
EntityMessage rVal = new EntityMessage(EntityMessageType.ATTACHENTITYTOENTITY);
stripPacketHeader(byteStream);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteStream));
rVal.setbone(ByteStreamUtils.popStringFromByteQueue(byteStream));
rVal.settargetID(ByteStreamUtils.popIntFromByteQueue(byteStream));
return rVal;
}
public static EntityMessage constructattachEntityToEntityMessage(int entityID,String bone,int targetID){
EntityMessage rVal = new EntityMessage(EntityMessageType.ATTACHENTITYTOENTITY);
rVal.setentityID(entityID);
rVal.setbone(bone);
rVal.settargetID(targetID);
rVal.serialize();
return rVal;
}
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case CREATE:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_CREATE_SIZE];
rawBytes = new byte[2+4+4+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -311,7 +377,7 @@ public class EntityMessage extends NetworkMessage {
rawBytes[18+i] = intValues[i];
} break;
case SETPOSITION:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_SETPOSITION_SIZE];
rawBytes = new byte[2+4+8+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -335,7 +401,7 @@ public class EntityMessage extends NetworkMessage {
rawBytes[22+i] = intValues[i];
} break;
case MOVE:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_MOVE_SIZE];
rawBytes = new byte[2+4+8+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -359,7 +425,7 @@ public class EntityMessage extends NetworkMessage {
rawBytes[22+i] = intValues[i];
} break;
case DESTROY:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY_SIZE];
rawBytes = new byte[2+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -370,7 +436,7 @@ public class EntityMessage extends NetworkMessage {
}
break;
case SETBEHAVIORTREE:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_SETBEHAVIORTREE_SIZE];
rawBytes = new byte[2+4+8+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -393,7 +459,7 @@ public class EntityMessage extends NetworkMessage {
}
break;
case SETPROPERTY:
rawBytes = new byte[TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY_SIZE];
rawBytes = new byte[2+4+8+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
@ -415,6 +481,29 @@ public class EntityMessage extends NetworkMessage {
rawBytes[18+i] = intValues[i];
}
break;
case ATTACHENTITYTOENTITY:
rawBytes = new byte[2+4+4+bone.length()+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_ENTITY;
//entity messaage header
rawBytes[1] = TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY;
intValues = ByteStreamUtils.serializeIntToBytes(entityID);
for(int i = 0; i < 4; i++){
rawBytes[2+i] = intValues[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(bone.length());
for(int i = 0; i < 4; i++){
rawBytes[6+i] = intValues[i];
}
stringBytes = bone.getBytes();
for(int i = 0; i < bone.length(); i++){
rawBytes[10+i] = stringBytes[i];
}
intValues = ByteStreamUtils.serializeIntToBytes(targetID);
for(int i = 0; i < 4; i++){
rawBytes[10+bone.length()+i] = intValues[i];
}
break;
}
serialized = true;
}

View File

@ -114,6 +114,11 @@ ENTITY_MESSAGE,
rVal = EntityMessage.parsesetPropertyMessage(byteStream);
}
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY:
if(EntityMessage.canParseMessage(byteStream,secondByte)){
rVal = EntityMessage.parseattachEntityToEntityMessage(byteStream);
}
break;
}
break;
}

View File

@ -1,6 +1,7 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class PlayerMessage extends NetworkMessage {
@ -104,9 +105,10 @@ public class PlayerMessage extends NetworkMessage {
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case SET_ID:
rawBytes = new byte[TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID_SIZE];
rawBytes = new byte[2+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_PLAYER;
//entity messaage header
@ -117,7 +119,7 @@ public class PlayerMessage extends NetworkMessage {
}
break;
case SETINITIALDISCRETEPOSITION:
rawBytes = new byte[TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION_SIZE];
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_PLAYER;
//entity messaage header

View File

@ -1,6 +1,7 @@
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 {
@ -63,9 +64,10 @@ public class StatusMessage extends NetworkMessage {
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case READY:
rawBytes = new byte[TypeBytes.STATUS_MESSAGE_TYPE_READY_SIZE];
rawBytes = new byte[2+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_STATUS;
//entity messaage header

View File

@ -50,6 +50,7 @@ Message categories
public static final byte ENTITY_MESSAGE_TYPE_DESTROY = 3;
public static final byte ENTITY_MESSAGE_TYPE_SETBEHAVIORTREE = 4;
public static final byte ENTITY_MESSAGE_TYPE_SETPROPERTY = 5;
public static final byte ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY = 6;
/*
Entity packet sizes
*/

View File

@ -1,6 +1,7 @@
package electrosphere.net.parser.net.message;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
public class WorldMessage extends NetworkMessage {
@ -414,9 +415,10 @@ public class WorldMessage extends NetworkMessage {
@Override
void serialize(){
byte[] intValues = new byte[8];
byte[] stringBytes;
switch(this.messageType){
case METADATA:
rawBytes = new byte[TypeBytes.WORLD_MESSAGE_TYPE_METADATA_SIZE];
rawBytes = new byte[2+4+4+4+4+4+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
//entity messaage header
@ -450,7 +452,7 @@ public class WorldMessage extends NetworkMessage {
}
break;
case REQUESTMACROVALUES:
rawBytes = new byte[TypeBytes.WORLD_MESSAGE_TYPE_REQUESTMACROVALUES_SIZE];
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
//entity messaage header
@ -465,7 +467,7 @@ public class WorldMessage extends NetworkMessage {
}
break;
case UPDATE:
rawBytes = new byte[TypeBytes.WORLD_MESSAGE_TYPE_UPDATE_SIZE];
rawBytes = new byte[2+4+4];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
//entity messaage header
@ -480,7 +482,7 @@ public class WorldMessage extends NetworkMessage {
}
break;
case MACROVALUE:
rawBytes = new byte[TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE_SIZE];
rawBytes = new byte[2+4+4+4+4+4+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8];
//message header
rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD;
//entity messaage header

View File

@ -68,6 +68,16 @@ public class ByteStreamUtils {
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 byte[] serializeIntToBytes(int i){
byte[] rVal = new byte[4];
bufferLock.acquireUninterruptibly();
@ -122,4 +132,20 @@ public class ByteStreamUtils {
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;
}
}

View File

@ -146,6 +146,17 @@ public class ServerConnectionHandler implements Runnable {
}
}
}
// for(Entity currentEntity : Globals.entityManager.getItemEntities()){
// if(AttachUtils.isAttached(currentEntity)){
// networkParser.addOutgoingMessage(
// EntityMessage.constructattachEntityToEntityMessage(
// currentEntity.getId(),
// AttachUtils.getTargetBone(currentEntity),
// AttachUtils.getParent(currentEntity).getId()
// )
// );
// }
// }
}
//let client know it's ready

View File

@ -134,7 +134,6 @@ public class FileLoadingUtils {
public static File unpackBakedFileToFilePath(String bakedFilePath){
String sanitizedFilePath = sanitizeBakedFilePath(bakedFilePath);
System.out.println(bakedFilePath);
if(!Files.exists(new File("./Models").toPath())){
try {
Files.createDirectory(new File("./Models").toPath());

View File

@ -297,6 +297,14 @@
{
"name" : "time",
"type" : "FIXED_LONG"
},
{
"name" : "bone",
"type" : "VAR_STRING"
},
{
"name" : "targetID",
"type" : "FIXED_INT"
}
],
"messageTypes" : [
@ -355,6 +363,14 @@
"propertyType",
"propertyValue"
]
},
{
"messageName" : "attachEntityToEntity",
"data" : [
"entityID",
"bone",
"targetID"
]
}