diff --git a/AssetBundles/debug.manifest b/AssetBundles/debug.manifest index c67ea6f4..906fcb0f 100644 --- a/AssetBundles/debug.manifest +++ b/AssetBundles/debug.manifest @@ -3,7 +3,7 @@ CRC: 2815158869 Hashes: AssetFileHash: serializedVersion: 2 - Hash: b0dab33ce9502b8c920c956269fa585e + Hash: 5677b7876f2afae05c0920067ef29e8a TypeTreeHash: serializedVersion: 2 Hash: 4d6a73cb377370ba69c96eb5da1b5028 diff --git a/AssetBundles/network b/AssetBundles/network index 0cd7c53c..3bd2951e 100644 Binary files a/AssetBundles/network and b/AssetBundles/network differ diff --git a/AssetBundles/network.manifest b/AssetBundles/network.manifest index ff82f9e2..74b4727b 100644 --- a/AssetBundles/network.manifest +++ b/AssetBundles/network.manifest @@ -1,9 +1,9 @@ ManifestFileVersion: 0 -CRC: 561788810 +CRC: 3045401868 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 2ed408e0c9f6147e341c9606eb7228c3 + Hash: fbaaf26c59dbb62b2ffc0c3939c0880a TypeTreeHash: serializedVersion: 2 Hash: 47ee499ae8022a6b96ca6a5fd541f154 diff --git a/QSB/Animation/AnimationSync.cs b/QSB/Animation/AnimationSync.cs index 491d9d99..a028d493 100644 --- a/QSB/Animation/AnimationSync.cs +++ b/QSB/Animation/AnimationSync.cs @@ -9,8 +9,6 @@ namespace QSB.Animation { public class AnimationSync : PlayerSyncObject { - protected override uint PlayerIdOffset => 0; - private Animator _anim; private Animator _bodyAnim; private NetworkAnimator _netAnim; diff --git a/QSB/ElevatorSync/ElevatorEvent.cs b/QSB/ElevatorSync/ElevatorEvent.cs index 16ffa32d..d19779cf 100644 --- a/QSB/ElevatorSync/ElevatorEvent.cs +++ b/QSB/ElevatorSync/ElevatorEvent.cs @@ -1,6 +1,5 @@ using QSB.Events; using QSB.Messaging; -using QSB.Utility; using QSB.WorldSync; namespace QSB.ElevatorSync @@ -29,7 +28,6 @@ namespace QSB.ElevatorSync public override void OnReceiveRemote(ElevatorMessage message) { - DebugLog.DebugWrite($"Get ElevatorMessage {message.Direction} for {message.ObjectId}"); var elevator = WorldRegistry.GetObject(message.ObjectId); elevator?.RemoteCall(message.Direction); } diff --git a/QSB/Events/PlayerJoinEvent.cs b/QSB/Events/PlayerJoinEvent.cs index 53e2da60..0a1a50fb 100644 --- a/QSB/Events/PlayerJoinEvent.cs +++ b/QSB/Events/PlayerJoinEvent.cs @@ -30,8 +30,8 @@ namespace QSB.Events { var player = PlayerRegistry.GetPlayer(message.AboutId); player.Name = message.PlayerName; - var text = $"{player.Name} joined!"; - DebugLog.ToAll(text, MessageType.Info); + DebugLog.ToHud($"{player.Name} joined!"); + DebugLog.DebugWrite($"{player.Name} joined as id {player.PlayerId}", MessageType.Info); } public override void OnReceiveLocal(PlayerJoinMessage message) diff --git a/QSB/Events/PlayerReadyEvent.cs b/QSB/Events/PlayerReadyEvent.cs index 06647dc8..c43a5300 100644 --- a/QSB/Events/PlayerReadyEvent.cs +++ b/QSB/Events/PlayerReadyEvent.cs @@ -45,7 +45,6 @@ namespace QSB.Events foreach (var item in PlayerRegistry.GetSyncObjects() .Where(x => x != null && x.IsReady && x.ReferenceSector != null && x.PlayerId == LocalPlayerId)) { - DebugLog.DebugWrite($"* Sending sector for netid {item.netId.Value}..."); GlobalMessenger.FireEvent(EventNames.QSBSectorChange, item.netId.Value, item.ReferenceSector); } } diff --git a/QSB/Events/PlayerState.cs b/QSB/Events/PlayerState.cs index 2a28a81a..8d0aba0d 100644 --- a/QSB/Events/PlayerState.cs +++ b/QSB/Events/PlayerState.cs @@ -34,7 +34,7 @@ namespace QSB.Events { var message = new PlayerStateMessage { - AboutId = player.NetId, + AboutId = player.PlayerId, PlayerName = player.Name, PlayerReady = player.IsReady, PlayerState = player.State diff --git a/QSB/Events/PlayerStatesRequestEvent.cs b/QSB/Events/PlayerStatesRequestEvent.cs index 419e2048..8f1f2493 100644 --- a/QSB/Events/PlayerStatesRequestEvent.cs +++ b/QSB/Events/PlayerStatesRequestEvent.cs @@ -33,7 +33,6 @@ namespace QSB.Events foreach (var item in PlayerRegistry.GetSyncObjects() .Where(x => x != null && x.IsReady && x.ReferenceSector != null)) { - DebugLog.DebugWrite($"* Sending sector for netid {item.netId.Value}..."); GlobalMessenger.FireEvent(EventNames.QSBSectorChange, item.netId.Value, item.ReferenceSector); } } diff --git a/QSB/GeyserSync/GeyserEvent.cs b/QSB/GeyserSync/GeyserEvent.cs index 17efd0f5..fa42e52a 100644 --- a/QSB/GeyserSync/GeyserEvent.cs +++ b/QSB/GeyserSync/GeyserEvent.cs @@ -4,7 +4,7 @@ using QSB.WorldSync; namespace QSB.GeyserSync { - public class GeyserEvent : QSBEvent + public class GeyserEvent : QSBEvent { public override EventType Type => EventType.Geyser; @@ -20,14 +20,14 @@ namespace QSB.GeyserSync private void Handler(int id, bool state) => SendEvent(CreateMessage(id, state)); - private GeyserMessage CreateMessage(int id, bool state) => new GeyserMessage + private BoolWorldObjectMessage CreateMessage(int id, bool state) => new BoolWorldObjectMessage { AboutId = LocalPlayerId, ObjectId = id, State = state }; - public override void OnReceiveRemote(GeyserMessage message) + public override void OnReceiveRemote(BoolWorldObjectMessage message) { var geyser = WorldRegistry.GetObject(message.ObjectId); geyser?.SetState(message.State); diff --git a/QSB/PlayerInfo.cs b/QSB/PlayerInfo.cs index 0f4d2938..802bde46 100644 --- a/QSB/PlayerInfo.cs +++ b/QSB/PlayerInfo.cs @@ -9,7 +9,7 @@ namespace QSB { public class PlayerInfo { - public uint NetId { get; } + public uint PlayerId { get; } public GameObject Camera { get; set; } public GameObject ProbeBody { get; set; } public QSBProbe Probe { get; set; } @@ -24,7 +24,7 @@ namespace QSB public PlayerInfo(uint id) { - NetId = id; + PlayerId = id; } public void UpdateState(State state, bool value) @@ -53,8 +53,8 @@ namespace QSB Translator?.ChangeEquipState(FlagsHelper.IsSet(State, State.Translator)); ProbeLauncher?.ChangeEquipState(FlagsHelper.IsSet(State, State.ProbeLauncher)); Signalscope?.ChangeEquipState(FlagsHelper.IsSet(State, State.Signalscope)); - QSB.Helper.Events.Unity.RunWhen(() => PlayerRegistry.GetSyncObject(NetId) != null, - () => PlayerRegistry.GetSyncObject(NetId).SetSuitState(FlagsHelper.IsSet(State, State.Suit))); + QSB.Helper.Events.Unity.RunWhen(() => PlayerRegistry.GetSyncObject(PlayerId) != null, + () => PlayerRegistry.GetSyncObject(PlayerId).SetSuitState(FlagsHelper.IsSet(State, State.Suit))); } public bool GetState(State state) diff --git a/QSB/PlayerRegistry.cs b/QSB/PlayerRegistry.cs index 6656da22..e9868679 100644 --- a/QSB/PlayerRegistry.cs +++ b/QSB/PlayerRegistry.cs @@ -10,9 +10,7 @@ namespace QSB { public static class PlayerRegistry { - public const int NetworkObjectCount = 4; - - public static uint LocalPlayerId => PlayerTransformSync.LocalInstance.GetComponent()?.netId.Value ?? 0; + public static uint LocalPlayerId => PlayerTransformSync.LocalInstance.GetComponent()?.netId.Value ?? uint.MaxValue; public static PlayerInfo LocalPlayer => GetPlayer(LocalPlayerId); public static List PlayerList { get; } = new List(); @@ -20,12 +18,16 @@ namespace QSB public static PlayerInfo GetPlayer(uint id) { - var player = PlayerList.FirstOrDefault(x => x.NetId == id); + if (id == uint.MaxValue || id == 0U) + { + return default; + } + var player = PlayerList.FirstOrDefault(x => x.PlayerId == id); if (player != null) { return player; } - DebugLog.DebugWrite($"Creating player with id {id}", MessageType.Info); + DebugLog.DebugWrite($"Creating player id {id}", MessageType.Info); player = new PlayerInfo(id); PlayerList.Add(player); return player; @@ -33,24 +35,21 @@ namespace QSB public static void RemovePlayer(uint id) { - DebugLog.DebugWrite($"Removing player with id {id}", MessageType.Info); + DebugLog.DebugWrite($"Removing player {GetPlayer(id).Name} id {id}", MessageType.Info); PlayerList.Remove(GetPlayer(id)); } public static bool PlayerExists(uint id) { - return PlayerList.Any(x => x.NetId == id); + return id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id); } public static void HandleFullStateMessage(PlayerStateMessage message) { - DebugLog.DebugWrite($"Handle full state message for player {message.AboutId}"); var player = GetPlayer(message.AboutId); player.Name = message.PlayerName; player.IsReady = message.PlayerReady; - DebugLog.DebugWrite($"* Is ready? : {player.IsReady}"); player.State = message.PlayerState; - DebugLog.DebugWrite($"* Suit is on? : {FlagsHelper.IsSet(player.State, State.Suit)}"); //DebugLog.DebugWrite($"Updating state of player {player.NetId} to : {Environment.NewLine}" + // $"{DebugLog.GenerateTable(Enum.GetNames(typeof(State)).ToList(), FlagsHelper.FlagsToListSet(player.State))}"); if (LocalPlayer.IsReady) @@ -66,18 +65,40 @@ namespace QSB public static T GetSyncObject(uint id) where T : PlayerSyncObject { - return GetSyncObjects().FirstOrDefault(x => x != null && x.NetId == id); + return GetSyncObjects().FirstOrDefault(x => x != null && x.AttachedNetId == id); } public static bool IsBelongingToLocalPlayer(uint id) { return id == LocalPlayerId || - PlayerSyncObjects.Any(x => x != null && x.NetId == id && x.PlayerId == LocalPlayerId); + PlayerSyncObjects.Any(x => x != null && x.AttachedNetId == id && x.isLocalPlayer); + } + + public static uint GetPlayerOfObject(this PlayerSyncObject syncObject) + { + var playerIds = PlayerList.Select(x => x.PlayerId).ToList(); + var lowerBound = playerIds.Where(x => x <= syncObject.AttachedNetId).ToList().Max(); + if (PlayerList.Count != PlayerSyncObjects.Count(x => x.GetType() == syncObject.GetType()) && lowerBound == playerIds.Max()) + { + if (syncObject.PreviousPlayerId != uint.MaxValue) + { + return syncObject.PreviousPlayerId; + } + if (syncObject.GetType() == typeof(PlayerTransformSync) && syncObject.AttachedNetId != 0U) + { + return GetPlayer(syncObject.AttachedNetId).PlayerId; + } + syncObject.PreviousPlayerId = uint.MaxValue; + return uint.MaxValue; + } + syncObject.PreviousPlayerId = lowerBound; + return lowerBound; } public static List GetPlayerNetIds(PlayerInfo player) { - return Enumerable.Range((int)player.NetId, NetworkObjectCount).Select(x => (uint)x).ToList(); + var count = PlayerSyncObjects.DistinctBy(x => x.AttachedNetId).Count(x => x.Player.PlayerId == player.PlayerId); + return Enumerable.Range((int)player.PlayerId, count).Select(x => (uint)x).ToList(); } } } diff --git a/QSB/PlayerSyncObject.cs b/QSB/PlayerSyncObject.cs index afc1dbbe..142867a1 100644 --- a/QSB/PlayerSyncObject.cs +++ b/QSB/PlayerSyncObject.cs @@ -4,10 +4,9 @@ namespace QSB { public abstract class PlayerSyncObject : NetworkBehaviour { - protected abstract uint PlayerIdOffset { get; } - public uint NetId => GetComponent()?.netId.Value ?? 0; - public bool IsLocal => hasAuthority; - public uint PlayerId => NetId - PlayerIdOffset; + public uint AttachedNetId => GetComponent()?.netId.Value ?? uint.MaxValue; + public uint PlayerId => this.GetPlayerOfObject(); + public uint PreviousPlayerId { get; set; } public PlayerInfo Player => PlayerRegistry.GetPlayer(PlayerId); } } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 65269ff4..be232fb8 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -151,7 +151,6 @@ - @@ -163,7 +162,10 @@ + + + @@ -192,7 +194,6 @@ - diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 5e9fad4c..22f9f202 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -73,6 +73,7 @@ namespace QSB public override void OnServerAddPlayer(NetworkConnection connection, short playerControllerId) // Called on the server when a client joins { + DebugLog.DebugWrite("[S] Add player"); base.OnServerAddPlayer(connection, playerControllerId); // These have to be in a constant order (for now, until we get a better netId getting system...) @@ -107,6 +108,10 @@ namespace QSB QSB.Helper.Events.Unity.RunWhen(() => EventList.Ready, () => GlobalMessenger.FireEvent(EventNames.QSBPlayerJoin, _lobby.PlayerName)); + + QSB.Helper.Events.Unity.RunWhen(() => EventList.Ready, + () => GlobalMessenger.FireEvent(EventNames.QSBPlayerStatesRequest)); + } public override void OnStopClient() // Called on the client when closing connection @@ -118,11 +123,11 @@ namespace QSB EventList.Reset(); PlayerRegistry.PlayerList.ForEach(player => player.HudMarker?.Remove()); - foreach (var player in PlayerRegistry.PlayerList.Where(x => x.NetId != PlayerRegistry.LocalPlayerId).ToList()) + foreach (var player in PlayerRegistry.PlayerList) { PlayerRegistry.GetPlayerNetIds(player).ForEach(CleanupNetworkBehaviour); - PlayerRegistry.RemovePlayer(player.NetId); } + PlayerRegistry.PlayerList.ForEach(x => PlayerRegistry.PlayerList.Remove(x)); _lobby.CanEditName = true; } @@ -177,7 +182,7 @@ namespace QSB public void CleanupNetworkBehaviour(uint netId) { - DebugLog.DebugWrite($"Cleaning up object {netId}"); + DebugLog.DebugWrite($"Cleaning up netId {netId}"); // Multiple networkbehaviours can use the same networkidentity (same netId), so get all of them var networkBehaviours = FindObjectsOfType() .Where(x => x != null && x.netId.Value == netId); @@ -188,12 +193,16 @@ namespace QSB if (transformSync != null) { PlayerRegistry.PlayerSyncObjects.Remove(transformSync); - if (transformSync.SyncedTransform != null) + if (transformSync.SyncedTransform != null && netId != PlayerRegistry.LocalPlayerId && !networkBehaviour.hasAuthority) { Destroy(transformSync.SyncedTransform.gameObject); } } - Destroy(networkBehaviour.gameObject); + + if (!networkBehaviour.hasAuthority) + { + Destroy(networkBehaviour.gameObject); + } } } diff --git a/QSB/TransformSync/PlayerCameraSync.cs b/QSB/TransformSync/PlayerCameraSync.cs index cb116c51..3dab13d1 100644 --- a/QSB/TransformSync/PlayerCameraSync.cs +++ b/QSB/TransformSync/PlayerCameraSync.cs @@ -9,8 +9,6 @@ namespace QSB.TransformSync { public static PlayerCameraSync LocalInstance { get; private set; } - protected override uint PlayerIdOffset => 2; - public override void OnStartLocalPlayer() { LocalInstance = this; @@ -32,7 +30,7 @@ namespace QSB.TransformSync protected override Transform InitRemoteTransform() { - var body = new GameObject("PlayerCamera"); + var body = new GameObject("RemotePlayerCamera"); PlayerToolsManager.Init(body.transform); @@ -41,6 +39,10 @@ namespace QSB.TransformSync return body.transform; } - public override bool IsReady => Locator.GetPlayerTransform() != null && PlayerRegistry.PlayerExists(PlayerId); + public override bool IsReady => Locator.GetPlayerTransform() != null + && Player != null + && PlayerRegistry.PlayerExists(Player.PlayerId) + && netId.Value != uint.MaxValue + && netId.Value != 0U; } } diff --git a/QSB/TransformSync/PlayerProbeSync.cs b/QSB/TransformSync/PlayerProbeSync.cs index 662aed2b..cb3413b9 100644 --- a/QSB/TransformSync/PlayerProbeSync.cs +++ b/QSB/TransformSync/PlayerProbeSync.cs @@ -1,4 +1,5 @@ -using QSB.Tools; +using OWML.Common; +using QSB.Tools; using QSB.Utility; using UnityEngine; @@ -8,8 +9,6 @@ namespace QSB.TransformSync { public static PlayerProbeSync LocalInstance { get; private set; } - protected override uint PlayerIdOffset => 3; - private Transform _disabledSocket; public override void OnStartLocalPlayer() @@ -36,7 +35,14 @@ namespace QSB.TransformSync { var probe = GetProbe(); + if (probe == null) + { + DebugLog.ToConsole("Error - Probe is null!", MessageType.Error); + return default; + } + var body = probe.InstantiateInactive(); + body.name = "RemoteProbeTransform"; Destroy(body.GetComponentInChildren()); @@ -68,6 +74,11 @@ namespace QSB.TransformSync SyncedTransform.localPosition = ReferenceSector.Transform.InverseTransformPoint(_disabledSocket.position); } - public override bool IsReady => Locator.GetProbe() != null && PlayerRegistry.PlayerExists(PlayerId) && Player.IsReady; + public override bool IsReady => Locator.GetProbe() != null + && Player != null + && PlayerRegistry.PlayerExists(Player.PlayerId) + && Player.IsReady + && netId.Value != uint.MaxValue + && netId.Value != 0U; } } diff --git a/QSB/TransformSync/PlayerTransformSync.cs b/QSB/TransformSync/PlayerTransformSync.cs index 09373a59..9094d406 100644 --- a/QSB/TransformSync/PlayerTransformSync.cs +++ b/QSB/TransformSync/PlayerTransformSync.cs @@ -7,8 +7,6 @@ namespace QSB.TransformSync { public static PlayerTransformSync LocalInstance { get; private set; } - protected override uint PlayerIdOffset => 0; - static PlayerTransformSync() { AnimControllerPatch.Init(); @@ -45,6 +43,11 @@ namespace QSB.TransformSync return body; } - public override bool IsReady => Locator.GetPlayerTransform() != null && PlayerRegistry.PlayerExists(PlayerId) && Player.IsReady; + public override bool IsReady => Locator.GetPlayerTransform() != null + && Player != null + && PlayerRegistry.PlayerExists(Player.PlayerId) + && Player.IsReady + && netId.Value != uint.MaxValue + && netId.Value != 0U; } } diff --git a/QSB/TransformSync/SectorSync.cs b/QSB/TransformSync/SectorSync.cs index 7c81a0e2..c5a9e8c3 100644 --- a/QSB/TransformSync/SectorSync.cs +++ b/QSB/TransformSync/SectorSync.cs @@ -1,5 +1,4 @@ using QSB.Events; -using QSB.Utility; using System.Linq; using UnityEngine; @@ -21,7 +20,7 @@ namespace QSB.TransformSync { return; } - PlayerRegistry.GetSyncObjects().Where(x => x.IsLocal).ToList().ForEach(CheckTransformSyncSector); + PlayerRegistry.GetSyncObjects().Where(x => x.hasAuthority).ToList().ForEach(CheckTransformSyncSector); _checkTimer = 0; } @@ -43,7 +42,6 @@ namespace QSB.TransformSync private void SendSector(uint id, QSBSector sector) { - DebugLog.DebugWrite($"Sending sector {sector.Name} for object {id}"); GlobalMessenger.FireEvent(EventNames.QSBSectorChange, id, sector); } } diff --git a/QSB/TransformSync/ShipTransformSync.cs b/QSB/TransformSync/ShipTransformSync.cs index 34a52a78..9a2350c4 100644 --- a/QSB/TransformSync/ShipTransformSync.cs +++ b/QSB/TransformSync/ShipTransformSync.cs @@ -6,8 +6,6 @@ namespace QSB.TransformSync { public static ShipTransformSync LocalInstance { get; private set; } - protected override uint PlayerIdOffset => 1; - public override void OnStartLocalPlayer() { LocalInstance = this; @@ -27,7 +25,7 @@ namespace QSB.TransformSync { var shipModel = GetShipModel(); - var remoteTransform = new GameObject().transform; + var remoteTransform = new GameObject("RemoteShipTransform").transform; Instantiate(shipModel.Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior"), remoteTransform); Instantiate(shipModel.Find("Module_Cabin/Geo_Cabin/Cabin_Geometry/Cabin_Exterior"), remoteTransform); @@ -51,6 +49,11 @@ namespace QSB.TransformSync return remoteTransform; } - public override bool IsReady => GetShipModel() != null && PlayerRegistry.PlayerExists(PlayerId) && Player.IsReady; + public override bool IsReady => GetShipModel() != null + && Player != null + && PlayerRegistry.PlayerExists(Player.PlayerId) + && Player.IsReady + && netId.Value != uint.MaxValue + && netId.Value != 0U; } } diff --git a/QSB/TransformSync/TransformSync.cs b/QSB/TransformSync/TransformSync.cs index 3490c464..8343c3a8 100644 --- a/QSB/TransformSync/TransformSync.cs +++ b/QSB/TransformSync/TransformSync.cs @@ -21,6 +21,7 @@ namespace QSB.TransformSync protected virtual void Awake() { + DebugLog.DebugWrite($"Awake of {AttachedNetId} ({GetType().Name})"); PlayerRegistry.PlayerSyncObjects.Add(this); DontDestroyOnLoad(gameObject); QSBSceneManager.OnSceneLoaded += OnSceneLoaded; @@ -33,6 +34,7 @@ namespace QSB.TransformSync protected void Init() { + DebugLog.DebugWrite($"Init of {AttachedNetId} ({Player.PlayerId}.{GetType().Name})"); ReferenceSector = QSBSectorManager.Instance.GetStartPlanetSector(); SyncedTransform = hasAuthority ? InitLocalTransform() : InitRemoteTransform(); if (!hasAuthority) @@ -52,18 +54,23 @@ namespace QSB.TransformSync else if (_isInitialized && !IsReady) { _isInitialized = false; + return; } - if (SyncedTransform == null || !_isInitialized) + if (!_isInitialized) { return; } - // Get which sector should be used as a reference point + if (SyncedTransform == null) + { + DebugLog.ToConsole($"SyncedTransform {AttachedNetId} ({Player.PlayerId}.{GetType().Name}) is null!"); + return; + } if (ReferenceSector == null) { - DebugLog.ToConsole($"Error - TransformSync with id {netId.Value} doesn't have a reference sector", MessageType.Error); + DebugLog.ToConsole($"Error - {AttachedNetId} ({Player.PlayerId}.{GetType().Name}) doesn't have a reference sector", MessageType.Error); } UpdateTransform(); @@ -71,18 +78,18 @@ namespace QSB.TransformSync protected virtual void UpdateTransform() { - if (hasAuthority) // If this script is attached to the client's own body on the client's side. + if (hasAuthority) // If this script is attached to the client's own body on the client's side. { if (ReferenceSector.Sector == null) { - DebugLog.ToConsole($"Sector is null for referencesector for {GetType().Name}!", MessageType.Error); + DebugLog.ToConsole($"Sector is null for referencesector for {AttachedNetId} ({Player.PlayerId}.{GetType().Name})!", MessageType.Error); } transform.position = ReferenceSector.Transform.InverseTransformPoint(SyncedTransform.position); transform.rotation = ReferenceSector.Transform.InverseTransformRotation(SyncedTransform.rotation); return; } - // If this script is attached to any other body, eg the representations of other players + // If this script is attached to any other body, eg the representations of other players if (SyncedTransform.position == Vector3.zero) { Hide(); @@ -100,9 +107,12 @@ namespace QSB.TransformSync { _positionSmoothVelocity = Vector3.zero; ReferenceSector = sector; - SyncedTransform.SetParent(sector.Transform, true); - transform.position = sector.Transform.InverseTransformPoint(SyncedTransform.position); - transform.rotation = sector.Transform.InverseTransformRotation(SyncedTransform.rotation); + if (!hasAuthority) + { + SyncedTransform.SetParent(sector.Transform, true); + transform.position = sector.Transform.InverseTransformPoint(SyncedTransform.position); + transform.rotation = sector.Transform.InverseTransformRotation(SyncedTransform.rotation); + } } private void Show() @@ -124,4 +134,4 @@ namespace QSB.TransformSync } } -} +} \ No newline at end of file diff --git a/QSB/Utility/ListExtensions.cs b/QSB/Utility/ListExtensions.cs new file mode 100644 index 00000000..c0ae8fdd --- /dev/null +++ b/QSB/Utility/ListExtensions.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; + +namespace QSB.Utility +{ + public static class ListExtensions + { + public static IEnumerable DistinctBy(this IEnumerable source, Func keySelector) + { + var seenKeys = new HashSet(); + foreach (var element in source) + { + if (seenKeys.Add(keySelector(element))) + { + yield return element; + } + } + } + } +} diff --git a/QSB/GeyserSync/GeyserMessage.cs b/QSB/WorldSync/BoolWorldObjectMessage.cs similarity index 73% rename from QSB/GeyserSync/GeyserMessage.cs rename to QSB/WorldSync/BoolWorldObjectMessage.cs index f6103da3..60055b48 100644 --- a/QSB/GeyserSync/GeyserMessage.cs +++ b/QSB/WorldSync/BoolWorldObjectMessage.cs @@ -1,9 +1,8 @@ -using QSB.WorldSync; -using UnityEngine.Networking; +using UnityEngine.Networking; -namespace QSB.GeyserSync +namespace QSB.WorldSync { - public class GeyserMessage : WorldObjectMessage + public class BoolWorldObjectMessage : WorldObjectMessage { public bool State { get; set; } diff --git a/QSB/WorldSync/WorldRegistry.cs b/QSB/WorldSync/WorldRegistry.cs index f00353e0..6b8e6ab3 100644 --- a/QSB/WorldSync/WorldRegistry.cs +++ b/QSB/WorldSync/WorldRegistry.cs @@ -25,6 +25,5 @@ namespace QSB.WorldSync { return GetObjects().FirstOrDefault(x => x.ObjectId == id); } - } } diff --git a/QSB/default-config.json b/QSB/default-config.json index 74eaa332..1d394b36 100644 --- a/QSB/default-config.json +++ b/QSB/default-config.json @@ -3,6 +3,6 @@ "settings": { "defaultServerIP": "localhost", "port": 7777, - "debugMode": false + "debugMode": true } } diff --git a/QSB/manifest.json b/QSB/manifest.json index 0fb75cba..796836ac 100644 --- a/QSB/manifest.json +++ b/QSB/manifest.json @@ -1,9 +1,9 @@ { "filename": "QSB.dll", - "author": "Rai, Alek & Nebula", + "author": "Raicuparta, AmazingAlek & misternebula", "name": "Quantum Space Buddies", "description": "Adds online multiplayer to the game.", "uniqueName": "Raicuparta.QuantumSpaceBuddies", - "version": "0.5.1", + "version": "0.6.0", "owmlVersion": "0.7.3" } diff --git a/UnityProject/Assets/NetworkManager.prefab b/UnityProject/Assets/NetworkManager.prefab index 4a923ba4..48402e79 100644 --- a/UnityProject/Assets/NetworkManager.prefab +++ b/UnityProject/Assets/NetworkManager.prefab @@ -61,7 +61,7 @@ MonoBehaviour: m_ScriptCRCCheck: 1 m_MaxDelay: 0.01 m_LogLevel: 2 - m_PlayerPrefab: {fileID: 1480237966074134, guid: 163f71f5a4ce8e543bbf5632a3585dc7, + m_PlayerPrefab: {fileID: 1211347487444314, guid: 163f71f5a4ce8e543bbf5632a3585dc7, type: 2} m_AutoCreatePlayer: 1 m_PlayerSpawnMethod: 0 diff --git a/UnityProject/Assets/NetworkPlayer.prefab b/UnityProject/Assets/NetworkPlayer.prefab index 18d128c7..eab28614 100644 --- a/UnityProject/Assets/NetworkPlayer.prefab +++ b/UnityProject/Assets/NetworkPlayer.prefab @@ -20,7 +20,7 @@ GameObject: m_Component: - component: {fileID: 4562567225116386} - component: {fileID: 114951036537616502} - - component: {fileID: 114833759961836714} + - component: {fileID: 114287548021608114} m_Layer: 0 m_Name: NetworkPlayer m_TagString: Untagged @@ -41,7 +41,7 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &114833759961836714 +--- !u!114 &114287548021608114 MonoBehaviour: m_ObjectHideFlags: 1 m_PrefabParentObject: {fileID: 0}