diff --git a/QSB/Events/DeathMessage.cs b/QSB/Events/DeathMessage.cs index 68a28ef4..b6c5ced6 100644 --- a/QSB/Events/DeathMessage.cs +++ b/QSB/Events/DeathMessage.cs @@ -3,7 +3,7 @@ using UnityEngine.Networking; namespace QSB.Events { - public class DeathMessage : NameMessage + public class DeathMessage : PlayerMessage { public override MessageType MessageType => MessageType.Death; diff --git a/QSB/Events/FullStateMessage.cs b/QSB/Events/FullStateMessage.cs new file mode 100644 index 00000000..632bc3f3 --- /dev/null +++ b/QSB/Events/FullStateMessage.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using QSB.Messaging; +using UnityEngine.Networking; + +namespace QSB.Events +{ + public class FullStateMessage : PlayerMessage + { + public override MessageType MessageType => MessageType.FullState; + + public Dictionary PlayerNames; + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + PlayerNames = new Dictionary(); + + reader.ReadString().Split(',').ToList().ForEach(pair => + { + var splitPair = pair.Split(':'); + var key = Convert.ToUInt16(splitPair[0]); + var value = splitPair[1]; + PlayerNames[key] = value; + }); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + + var playerNamePairs = PlayerNames.ToList().Select(pair => $"{pair.Key}:{pair.Value}").ToArray(); + + writer.Write(string.Join(",", playerNamePairs)); + } + } +} diff --git a/QSB/Events/GameState.cs b/QSB/Events/GameState.cs new file mode 100644 index 00000000..c41ac9e4 --- /dev/null +++ b/QSB/Events/GameState.cs @@ -0,0 +1,35 @@ +using System.Collections; +using System.Collections.Generic; +using QSB.Messaging; +using QSB.TransformSync; +using UnityEngine; +using UnityEngine.Networking; + +namespace QSB.Events +{ + class GameState : NetworkBehaviour + { + private MessageHandler _messageHandler; + + private void Awake() + { + _messageHandler = new MessageHandler(); + _messageHandler.OnClientReceiveMessage += OnClientReceiveMessage; + } + + private void OnClientReceiveMessage(FullStateMessage message) + { + PlayerJoin.PlayerNames = message.PlayerNames; + } + + public void Send() + { + var message = new FullStateMessage() + { + PlayerNames = PlayerJoin.PlayerNames + }; + + _messageHandler.SendToAll(message); + } + } +} diff --git a/QSB/Events/JoinMessage.cs b/QSB/Events/JoinMessage.cs index baa44ebd..0d60c188 100644 --- a/QSB/Events/JoinMessage.cs +++ b/QSB/Events/JoinMessage.cs @@ -1,9 +1,24 @@ using QSB.Messaging; +using UnityEngine.Networking; namespace QSB.Events { - public class JoinMessage : NameMessage + public class JoinMessage : PlayerMessage { public override MessageType MessageType => MessageType.Join; + + public string PlayerName { get; set; } + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + PlayerName = reader.ReadString(); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + writer.Write(PlayerName); + } } } diff --git a/QSB/Events/LeaveMessage.cs b/QSB/Events/LeaveMessage.cs index 1a1eaf3a..8c9423ff 100644 --- a/QSB/Events/LeaveMessage.cs +++ b/QSB/Events/LeaveMessage.cs @@ -5,7 +5,7 @@ using UnityEngine.Networking; namespace QSB.Events { - public class LeaveMessage : NameMessage + public class LeaveMessage : PlayerMessage { public override MessageType MessageType => MessageType.Leave; diff --git a/QSB/Events/PlayerJoin.cs b/QSB/Events/PlayerJoin.cs index 81b970fe..e6792c38 100644 --- a/QSB/Events/PlayerJoin.cs +++ b/QSB/Events/PlayerJoin.cs @@ -9,7 +9,7 @@ namespace QSB.Events { public class PlayerJoin : NetworkBehaviour { - public static readonly Dictionary PlayerNames = new Dictionary(); + public static Dictionary PlayerNames = new Dictionary(); public static string MyName { get; private set; } private MessageHandler _joinHandler; diff --git a/QSB/Events/PlayerLeave.cs b/QSB/Events/PlayerLeave.cs index 7ce39bdd..21b254d3 100644 --- a/QSB/Events/PlayerLeave.cs +++ b/QSB/Events/PlayerLeave.cs @@ -19,7 +19,6 @@ namespace QSB.Events { var message = new LeaveMessage { - PlayerName = PlayerJoin.PlayerNames[playerId], SenderId = playerId, ObjectIds = objectIds }; @@ -28,7 +27,8 @@ namespace QSB.Events private void OnClientReceiveMessage(LeaveMessage message) { - DebugLog.All(message.PlayerName, "left"); + var playerName = PlayerJoin.PlayerNames[message.SenderId]; + DebugLog.All(playerName, "left"); PlayerJoin.PlayerNames.Remove(message.SenderId); foreach (var objectId in message.ObjectIds) { diff --git a/QSB/Events/NameMessage.cs b/QSB/Events/PlayerMessage.cs similarity index 67% rename from QSB/Events/NameMessage.cs rename to QSB/Events/PlayerMessage.cs index a476f614..7b745355 100644 --- a/QSB/Events/NameMessage.cs +++ b/QSB/Events/PlayerMessage.cs @@ -3,20 +3,17 @@ using UnityEngine.Networking; namespace QSB.Events { - public abstract class NameMessage : QSBMessage + public abstract class PlayerMessage : QSBMessage { public uint SenderId { get; set; } - public string PlayerName { get; set; } - + public override void Deserialize(NetworkReader reader) { - PlayerName = reader.ReadString(); SenderId = reader.ReadUInt32(); } public override void Serialize(NetworkWriter writer) { - writer.Write(PlayerName); writer.Write(SenderId); } } diff --git a/QSB/Messaging/MessageType.cs b/QSB/Messaging/MessageType.cs index 3c38a5d9..1a98a075 100644 --- a/QSB/Messaging/MessageType.cs +++ b/QSB/Messaging/MessageType.cs @@ -9,7 +9,8 @@ namespace QSB.Messaging AnimTrigger = MsgType.Highest + 3, Join = MsgType.Highest + 4, Death = MsgType.Highest + 5, - Leave = MsgType.Highest + 6 + Leave = MsgType.Highest + 6, + FullState = MsgType.Highest + 7 // Add other message types here, incrementing the value. } } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index e258ea6f..851efe89 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -107,6 +107,8 @@ + + @@ -114,12 +116,13 @@ - + + diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index c063f420..a4402fd3 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -96,19 +96,26 @@ namespace QSB base.OnServerAddPlayer(conn, playerControllerId); NetworkServer.SpawnWithClientAuthority(Instantiate(_shipPrefab), conn); + + var gameState = gameObject.AddComponent(); + gameState.Send(); } public override void OnClientConnect(NetworkConnection conn) { base.OnClientConnect(conn); - DebugLog.Screen("OnClientConnect"); gameObject.AddComponent(); gameObject.AddComponent().Join(_playerName); gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); + if (!Network.isServer) + { + gameObject.AddComponent(); + } + _canEditName = false; OnNetworkManagerReady.Invoke(); diff --git a/QSB/TimeSync/RespawnOnDeath.cs b/QSB/TimeSync/RespawnOnDeath.cs index 572f53b1..6278a12f 100644 --- a/QSB/TimeSync/RespawnOnDeath.cs +++ b/QSB/TimeSync/RespawnOnDeath.cs @@ -142,7 +142,7 @@ namespace QSB.TimeSync private void OnClientReceiveMessage(DeathMessage message) { - var playerName = PlayerJoin.PlayerNames.TryGetValue(message.SenderId, out var n) ? n : message.PlayerName; + var playerName = PlayerJoin.PlayerNames[message.SenderId]; var deathMessage = Necronomicon.GetPhrase(message.DeathType); DebugLog.All(string.Format(deathMessage, playerName)); } @@ -168,7 +168,6 @@ namespace QSB.TimeSync { var message = new DeathMessage { - PlayerName = PlayerJoin.MyName, SenderId = PlayerTransformSync.LocalInstance.netId.Value, DeathType = deathType }; diff --git a/QSB/TransformSync/PlayerHUDMarker.cs b/QSB/TransformSync/PlayerHUDMarker.cs new file mode 100644 index 00000000..316b9d93 --- /dev/null +++ b/QSB/TransformSync/PlayerHUDMarker.cs @@ -0,0 +1,53 @@ +using QSB.Events; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace QSB.TransformSync +{ + class PlayerHUDMarker : HUDDistanceMarker + { + private uint _netId = uint.MaxValue; + private bool _isReady; + + protected override void InitCanvasMarker() + { + _markerRadius = 0.3f; + + _markerTarget = new GameObject().transform; + _markerTarget.parent = transform; + // I'm not really sure why this has to be 20 instead of 2 (the player height in units). + // But that's the only way it looks right. + _markerTarget.localPosition = Vector3.up * 20; + } + + public void SetId(uint netId) + { + _netId = netId; + _isReady = true; + } + + protected override void RefreshOwnVisibility() + { + if (_canvasMarker != null) + { + _canvasMarker.SetVisibility(true); + } + + + } + + void Update() + { + if (_isReady && PlayerJoin.PlayerNames.ContainsKey(_netId)) + { + _markerLabel = PlayerJoin.PlayerNames[_netId]; + _isReady = false; + + base.InitCanvasMarker(); + } + } + } +} diff --git a/QSB/TransformSync/PlayerTransformSync.cs b/QSB/TransformSync/PlayerTransformSync.cs index 5b73e22a..44e1a328 100644 --- a/QSB/TransformSync/PlayerTransformSync.cs +++ b/QSB/TransformSync/PlayerTransformSync.cs @@ -1,4 +1,6 @@ -using QSB.Animation; +using OWML.ModHelper.Events; +using QSB.Animation; +using QSB.Events; using UnityEngine; namespace QSB.TransformSync @@ -42,6 +44,9 @@ namespace QSB.TransformSync rigidBodySync.Init(body); rigidBodySync.IgnoreCollision(Locator.GetShipTransform().gameObject); + var marker = body.gameObject.AddComponent(); + marker.SetId(netId.Value); + return body; } diff --git a/QSB/manifest.json b/QSB/manifest.json index a7695e58..6946a55a 100644 --- a/QSB/manifest.json +++ b/QSB/manifest.json @@ -1,7 +1,7 @@ { "filename": "QSB.dll", "author": "Raicuparta", - "name": "QuantumSpaceBuddies", + "name": "Quantum Space Buddies", "uniqueName": "Raicuparta.QuantumSpaceBuddies", "version": "0.1", "owmlVersion": "0.3.37"