diff --git a/Minecraft Client/Assets/Content/Player.prefab b/Minecraft Client/Assets/Content/Player.prefab index 588cebe..3391926 100644 --- a/Minecraft Client/Assets/Content/Player.prefab +++ b/Minecraft Client/Assets/Content/Player.prefab @@ -57,7 +57,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6443714940181712877} m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0.024} + m_LocalPosition: {x: 0, y: -0.132, z: 0.024} m_LocalScale: {x: 0.24999988, y: 0.24999988, z: 0.25} m_Children: [] m_Father: {fileID: 4093383343133656141} diff --git a/Minecraft Client/Assets/Scenes/Game.unity b/Minecraft Client/Assets/Scenes/Game.unity index 7ccc690..f67661b 100644 --- a/Minecraft Client/Assets/Scenes/Game.unity +++ b/Minecraft Client/Assets/Scenes/Game.unity @@ -665,7 +665,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1934992308} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1.806, z: 0.036} + m_LocalPosition: {x: 0, y: 1.7, z: 0.036} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1789911868} @@ -779,7 +779,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 7035241573763573916} m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} - m_LocalPosition: {x: 0, y: 0, z: 0.024} + m_LocalPosition: {x: 0, y: -0.08, z: 0.024} m_LocalScale: {x: 0.24999988, y: 0.24999988, z: 0.25} m_Children: [] m_Father: {fileID: 1789911868} diff --git a/Minecraft Client/Assets/Scripts/Game/Client.cs b/Minecraft Client/Assets/Scripts/Game/Client.cs index cef0a47..b16f0b6 100644 --- a/Minecraft Client/Assets/Scripts/Game/Client.cs +++ b/Minecraft Client/Assets/Scripts/Game/Client.cs @@ -133,19 +133,20 @@ public class Client //1.12 == [1] = 1, [2] = 12 public void SendPositionUpdate(Vector3 position) { - string x = position.x.ToString("F"); - string y = position.y.ToString("F"); - string z = position.z.ToString("F"); - byte xV = byte.Parse(x.Split(',')[0]); - byte xN = byte.Parse(x.Split(',')[1]); - - byte yV = byte.Parse(y.Split(',')[0]); - byte yN = byte.Parse(y.Split(',')[1]); - - byte zV = byte.Parse(z.Split(',')[0]); - byte zN = byte.Parse(z.Split(',')[1]); + string x = position.x.ToString("n4"); + string y = position.y.ToString("n4"); + string z = position.z.ToString("n4"); - Send(new byte[] { 7, xV, xN, yV, yN, zV, zN }); + string sendPosition = x + " " + y + " " + z; + byte[] sendPositionASCII = Encoding.ASCII.GetBytes(sendPosition); + byte[] send = new byte[sendPositionASCII.Length + 1]; + send[0] = 7; + for (int i = 1; i < send.Length; i++) + { + send[i] = sendPositionASCII[i - 1]; + } + + Send(send); } private void Receive() @@ -171,16 +172,19 @@ public class Client if (data[0] == 7) { - string xS = data[1] + "," + data[2]; - string yS = data[3] + "," + data[4]; - string zS = data[5] + "," + data[6]; + byte[] positionASCII = new byte[data.Length - 2]; + for (int i = 0; i < data.Length - 2; i++) + { + positionASCII[i] = data[i + 2]; + } - float x = float.Parse(xS); - float y = float.Parse(yS); - float z = float.Parse(zS); - - byte id = data[7]; + byte id = data[1]; + string[] positionString = Encoding.ASCII.GetString(positionASCII).Split(' '); + float x = float.Parse(positionString[0]); + float y = float.Parse(positionString[1]); + float z = float.Parse(positionString[2]); + world.UpdatePlayerPosition(new Vector3(x, y, z), id); } } diff --git a/Minecraft Client/Assets/Scripts/Game/Player.cs b/Minecraft Client/Assets/Scripts/Game/Player.cs index 6393dca..55018ef 100644 --- a/Minecraft Client/Assets/Scripts/Game/Player.cs +++ b/Minecraft Client/Assets/Scripts/Game/Player.cs @@ -232,5 +232,17 @@ public class Player : MonoBehaviour return false; } } + + public class PlayerUpdateData + { + public PlayerUpdateData(byte id, Vector3 position) + { + this.id = id; + this.position = position; + } + + public byte id; + public Vector3 position; + } } diff --git a/Minecraft Client/Assets/Scripts/Game/World.cs b/Minecraft Client/Assets/Scripts/Game/World.cs index d07fa91..33ba158 100644 --- a/Minecraft Client/Assets/Scripts/Game/World.cs +++ b/Minecraft Client/Assets/Scripts/Game/World.cs @@ -12,6 +12,7 @@ public class World : MonoBehaviour private string name; private Dictionary otherPlayers = new Dictionary(); private Queue playersToCreate = new Queue(); + private Queue playersToUpdate = new Queue(); //chunks private Chunk[,] chunks; @@ -50,15 +51,18 @@ public class World : MonoBehaviour player.transform.SetParent(gameObject.transform); otherPlayers.Add(id, player); } + + if (playersToUpdate.Count > 0) + { + Player.PlayerUpdateData data = playersToUpdate.Dequeue(); + otherPlayers.TryGetValue(data.id, out GameObject g); + g.transform.position = data.position; + } } public void UpdatePlayerPosition(Vector3 position, byte id) { - otherPlayers.TryGetValue(id, out GameObject g); - if(g != null) - { - g.transform.position = position; - } + playersToUpdate.Enqueue(new Player.PlayerUpdateData(id, position)); } public void AddPlayer(byte id) diff --git a/Minecraft Server/Assets/Game/Server.cs b/Minecraft Server/Assets/Game/Server.cs index b4a165a..193873a 100644 --- a/Minecraft Server/Assets/Game/Server.cs +++ b/Minecraft Server/Assets/Game/Server.cs @@ -138,23 +138,36 @@ public class Server if (data[0] == 7) { - string xS = data[1] + "," + data[2]; - string yS = data[3] + "," + data[4]; - string zS = data[5] + "," + data[6]; + byte[] positionASCII = new byte[data.Length - 1]; + for (int i = 0; i < data.Length - 1; i++) + { + positionASCII[i] = data[i + 1]; + } - float x = float.Parse(xS); - float y = float.Parse(yS); - float z = float.Parse(zS); + string[] positionString = Encoding.ASCII.GetString(positionASCII).Split(' '); + float x = float.Parse(positionString[0]); + float y = float.Parse(positionString[1]); + float z = float.Parse(positionString[2]); int id = GetPlayerID(endPoint); - + playerPositions[id] = new Vector3(x, y, z); + string sendPosition = x + " " + y + " " + z; + byte[] sendPositionASCII = Encoding.ASCII.GetBytes(sendPosition); + byte[] send = new byte[sendPositionASCII.Length + 2]; + send[0] = 7; + send[1] = (byte)id; + for (int i = 2; i < send.Length; i++) + { + send[i] = sendPositionASCII[i - 2]; + } + foreach (IPEndPoint e in players) { if (id != GetPlayerID(e)) { - Send(new byte[]{7, data[1], data[2], data[3], data[4], data[5], data[6], (byte)id}, e); + Send(send, e); } } }