Merge pull request #224 from misternebula/condition-syncing

Condition syncing + rc/dc rewrite + playerid assignment rewrite
This commit is contained in:
Mister_Nebula 2020-12-14 21:40:47 +00:00 committed by GitHub
commit eb9a6ced96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
107 changed files with 942 additions and 1424 deletions

View File

@ -9,8 +9,8 @@ namespace QSB.Animation
public static void Init() public static void Init()
{ {
QSB.Helper.Events.Subscribe<PlayerAnimController>(OWML.Common.Events.BeforeStart); QSBCore.Helper.Events.Subscribe<PlayerAnimController>(OWML.Common.Events.BeforeStart);
QSB.Helper.Events.Event += OnEvent; QSBCore.Helper.Events.Event += OnEvent;
} }
private static void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) private static void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)

View File

@ -1,6 +1,6 @@
using OWML.Common; using OWML.Common;
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using QuantumUNET.Components; using QuantumUNET.Components;
@ -29,26 +29,21 @@ namespace QSB.Animation
private RuntimeAnimatorController _riebeckController; private RuntimeAnimatorController _riebeckController;
public AnimatorMirror Mirror { get; private set; } public AnimatorMirror Mirror { get; private set; }
public AnimationType CurrentType; public AnimationType CurrentType { get; set; }
public Animator Animator protected void Awake()
{
get { return _bodyAnim; }
}
private void Awake()
{ {
_anim = gameObject.AddComponent<Animator>(); _anim = gameObject.AddComponent<Animator>();
_netAnim = gameObject.AddComponent<QSBNetworkAnimator>(); _netAnim = gameObject.AddComponent<QSBNetworkAnimator>();
_netAnim.enabled = false; _netAnim.enabled = false;
_netAnim.animator = _anim; _netAnim.animator = _anim;
QSBSceneManager.OnUniverseSceneLoaded += (OWScene scene) => LoadControllers(); QSBSceneManager.OnUniverseSceneLoaded += OnUniverseSceneLoaded;
} }
private void OnDestroy() protected override void OnDestroy()
{ {
_netAnim.enabled = false; base.OnDestroy();
if (_playerController == null) if (_playerController == null)
{ {
return; return;
@ -57,12 +52,14 @@ namespace QSB.Animation
_playerController.OnBecomeGrounded -= OnBecomeGrounded; _playerController.OnBecomeGrounded -= OnBecomeGrounded;
_playerController.OnBecomeUngrounded -= OnBecomeUngrounded; _playerController.OnBecomeUngrounded -= OnBecomeUngrounded;
QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => LoadControllers(); QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoaded;
} }
private void OnUniverseSceneLoaded(OWScene obj) => LoadControllers();
private void LoadControllers() private void LoadControllers()
{ {
var bundle = QSB.InstrumentAssetBundle; var bundle = QSBCore.InstrumentAssetBundle;
_chertController = bundle.LoadAsset("assets/Chert/Traveller_Chert.controller") as RuntimeAnimatorController; _chertController = bundle.LoadAsset("assets/Chert/Traveller_Chert.controller") as RuntimeAnimatorController;
_riebeckController = bundle.LoadAsset("assets/Riebeck/Traveller_Riebeck.controller") as RuntimeAnimatorController; _riebeckController = bundle.LoadAsset("assets/Riebeck/Traveller_Riebeck.controller") as RuntimeAnimatorController;
} }
@ -85,8 +82,6 @@ namespace QSB.Animation
Mirror.Init(_anim, _bodyAnim); Mirror.Init(_anim, _bodyAnim);
} }
QSBPlayerManager.PlayerSyncObjects.Add(this);
for (var i = 0; i < _anim.parameterCount; i++) for (var i = 0; i < _anim.parameterCount; i++)
{ {
_netAnim.SetParameterAutoSend(i, true); _netAnim.SetParameterAutoSend(i, true);
@ -135,7 +130,7 @@ namespace QSB.Animation
InitCrouchSync(); InitCrouchSync();
var ikSync = body.gameObject.AddComponent<PlayerHeadRotationSync>(); var ikSync = body.gameObject.AddComponent<PlayerHeadRotationSync>();
QSB.Helper.Events.Unity.RunWhen(() => Player.Camera != null, () => ikSync.Init(Player.Camera.transform)); QSBCore.Helper.Events.Unity.RunWhen(() => Player.Camera != null, () => ikSync.Init(Player.Camera.transform));
} }
private void InitCrouchSync() private void InitCrouchSync()

View File

@ -2,12 +2,12 @@
{ {
public enum AnimationType public enum AnimationType
{ {
Chert, Chert = 0,
Esker, Esker = 1,
Feldspar, Feldspar = 2,
Gabbro, Gabbro = 3,
PlayerSuited, PlayerSuited = 4,
PlayerUnsuited, PlayerUnsuited = 5,
Riebeck Riebeck = 6
} }
} }

View File

@ -1,5 +1,4 @@
using OWML.Common; using OWML.Common;
using QSB.Player;
using QSB.Utility; using QSB.Utility;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -36,12 +35,7 @@ namespace QSB.Animation
} }
} }
private PlayerInfo GetPlayer() public void Update()
{
return QSBPlayerManager.GetSyncObjects<AnimationSync>().First(x => x.Mirror == this).Player;
}
private void Update()
{ {
if (_to == null || _from == null) if (_to == null || _from == null)
{ {

View File

@ -27,7 +27,7 @@ namespace QSB.Animation
_bodyAnim = bodyAnim; _bodyAnim = bodyAnim;
} }
private void Update() public void Update()
{ {
if (IsLocalPlayer) if (IsLocalPlayer)
{ {

View File

@ -1,6 +1,6 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Instruments; using QSB.Instruments;
using QSB.MessagesCore; using QSB.Messaging;
using QSB.Player; using QSB.Player;
namespace QSB.Animation.Events namespace QSB.Animation.Events
@ -10,7 +10,6 @@ namespace QSB.Animation.Events
public override EventType Type => EventType.PlayInstrument; public override EventType Type => EventType.PlayInstrument;
public override void SetupListener() => GlobalMessenger<uint, AnimationType>.AddListener(EventNames.QSBChangeAnimType, Handler); public override void SetupListener() => GlobalMessenger<uint, AnimationType>.AddListener(EventNames.QSBChangeAnimType, Handler);
public override void CloseListener() => GlobalMessenger<uint, AnimationType>.RemoveListener(EventNames.QSBChangeAnimType, Handler); public override void CloseListener() => GlobalMessenger<uint, AnimationType>.RemoveListener(EventNames.QSBChangeAnimType, Handler);
private void Handler(uint player, AnimationType type) => SendEvent(CreateMessage(player, type)); private void Handler(uint player, AnimationType type) => SendEvent(CreateMessage(player, type));
@ -21,7 +20,7 @@ namespace QSB.Animation.Events
Value = type Value = type
}; };
public override void OnReceiveRemote(EnumMessage<AnimationType> message) public override void OnReceiveRemote(bool server, EnumMessage<AnimationType> message)
{ {
QSBPlayerManager.GetPlayer(message.AboutId).AnimationSync.SetAnimationType(message.Value); QSBPlayerManager.GetPlayer(message.AboutId).AnimationSync.SetAnimationType(message.Value);
QSBPlayerManager.GetSyncObject<InstrumentsManager>(message.AboutId).CheckInstrumentProps(message.Value); QSBPlayerManager.GetSyncObject<InstrumentsManager>(message.AboutId).CheckInstrumentProps(message.Value);

View File

@ -1,5 +1,5 @@
using QSB.EventsCore; using QSB.Events;
using QSB.MessagesCore; using QSB.Messaging;
using QSB.Player; using QSB.Player;
namespace QSB.Animation.Events namespace QSB.Animation.Events
@ -9,7 +9,6 @@ namespace QSB.Animation.Events
public override EventType Type => EventType.AnimTrigger; public override EventType Type => EventType.AnimTrigger;
public override void SetupListener() => GlobalMessenger<float>.AddListener(EventNames.QSBCrouch, Handler); public override void SetupListener() => GlobalMessenger<float>.AddListener(EventNames.QSBCrouch, Handler);
public override void CloseListener() => GlobalMessenger<float>.RemoveListener(EventNames.QSBCrouch, Handler); public override void CloseListener() => GlobalMessenger<float>.RemoveListener(EventNames.QSBCrouch, Handler);
private void Handler(float value) => SendEvent(CreateMessage(value)); private void Handler(float value) => SendEvent(CreateMessage(value));
@ -20,14 +19,10 @@ namespace QSB.Animation.Events
Value = value Value = value
}; };
public override void OnReceiveRemote(FloatMessage message) public override void OnReceiveRemote(bool server, FloatMessage message)
{ {
var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AboutId); var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AboutId);
if (animationSync == null) animationSync?.HandleCrouch(message.Value);
{
return;
}
animationSync.HandleCrouch(message.Value);
} }
} }
} }

View File

@ -1,8 +1,8 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
namespace QSB.Animation namespace QSB.Animation.Events
{ {
public class PlayerSuitEvent : QSBEvent<ToggleMessage> public class PlayerSuitEvent : QSBEvent<ToggleMessage>
{ {
@ -21,7 +21,6 @@ namespace QSB.Animation
} }
private void HandleSuitUp() => SendEvent(CreateMessage(true)); private void HandleSuitUp() => SendEvent(CreateMessage(true));
private void HandleSuitDown() => SendEvent(CreateMessage(false)); private void HandleSuitDown() => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,12 +29,12 @@ namespace QSB.Animation
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player?.UpdateState(State.Suit, message.ToggleValue); player?.UpdateState(State.Suit, message.ToggleValue);
if (!QSB.HasWokenUp) if (!QSBCore.HasWokenUp)
{ {
return; return;
} }
@ -45,7 +44,7 @@ namespace QSB.Animation
animator.SetAnimationType(type); animator.SetAnimationType(type);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message)
{ {
QSBPlayerManager.LocalPlayer.UpdateState(State.Suit, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.Suit, message.ToggleValue);
var animator = QSBPlayerManager.LocalPlayer.AnimationSync; var animator = QSBPlayerManager.LocalPlayer.AnimationSync;

View File

@ -1,6 +1,6 @@
using OWML.Common; using OWML.Common;
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -15,43 +15,38 @@ namespace QSB.ConversationSync
{ {
public static ConversationManager Instance { get; private set; } public static ConversationManager Instance { get; private set; }
public AssetBundle ConversationAssetBundle { get; private set; } public AssetBundle ConversationAssetBundle { get; private set; }
private GameObject BoxPrefab; public Dictionary<CharacterDialogueTree, GameObject> BoxMappings { get; } = new Dictionary<CharacterDialogueTree, GameObject>();
public Dictionary<CharacterDialogueTree, GameObject> BoxMappings = new Dictionary<CharacterDialogueTree, GameObject>();
private void Start() private GameObject _boxPrefab;
public void Start()
{ {
Instance = this; Instance = this;
ConversationAssetBundle = QSB.Helper.Assets.LoadBundle("assets/conversation"); ConversationAssetBundle = QSBCore.Helper.Assets.LoadBundle("assets/conversation");
BoxPrefab = ConversationAssetBundle.LoadAsset<GameObject>("assets/dialoguebubble.prefab"); _boxPrefab = ConversationAssetBundle.LoadAsset<GameObject>("assets/dialoguebubble.prefab");
// TODO : make dynamic so it can be different sizes! // TODO : make dynamic so it can be different sizes!
var font = (Font)Resources.Load(@"fonts\english - latin\spacemono-bold"); var font = (Font)Resources.Load(@"fonts\english - latin\spacemono-bold");
if (font == null) if (font == null)
{ {
DebugLog.ToConsole("Error - Font is null!", MessageType.Error); DebugLog.ToConsole("Error - Font is null!", MessageType.Error);
} }
BoxPrefab.GetComponent<Text>().font = font; _boxPrefab.GetComponent<Text>().font = font;
BoxPrefab.GetComponent<Text>().color = Color.white; _boxPrefab.GetComponent<Text>().color = Color.white;
} }
public uint GetPlayerTalkingToTree(CharacterDialogueTree tree) public uint GetPlayerTalkingToTree(CharacterDialogueTree tree)
{ {
var treeIndex = WorldRegistry.OldDialogueTrees.IndexOf(tree); var treeIndex = QSBWorldSync.OldDialogueTrees.IndexOf(tree);
if (!QSBPlayerManager.PlayerList.Any(x => x.CurrentDialogueID == treeIndex)) return QSBPlayerManager.PlayerList.All(x => x.CurrentDialogueID != treeIndex)
{ ? uint.MaxValue
// No player talking to tree : QSBPlayerManager.PlayerList.First(x => x.CurrentDialogueID == treeIndex).PlayerId;
return uint.MaxValue;
}
// .First() should be fine here as only one player should be talking to a character.
return QSBPlayerManager.PlayerList.First(x => x.CurrentDialogueID == treeIndex).PlayerId;
} }
public void SendPlayerOption(string text) public void SendPlayerOption(string text) =>
{
GlobalMessenger<uint, string, ConversationType> GlobalMessenger<uint, string, ConversationType>
.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, text, ConversationType.Player); .FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, text, ConversationType.Player);
}
public void SendCharacterDialogue(int id, string text) public void SendCharacterDialogue(int id, string text)
{ {
@ -64,17 +59,13 @@ namespace QSB.ConversationSync
.FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character); .FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character);
} }
public void CloseBoxPlayer() public void CloseBoxPlayer() =>
{
GlobalMessenger<uint, string, ConversationType> GlobalMessenger<uint, string, ConversationType>
.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, "", ConversationType.ClosePlayer); .FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, "", ConversationType.ClosePlayer);
}
public void CloseBoxCharacter(int id) public void CloseBoxCharacter(int id) =>
{
GlobalMessenger<uint, string, ConversationType> GlobalMessenger<uint, string, ConversationType>
.FireEvent(EventNames.QSBConversation, (uint)id, "", ConversationType.CloseCharacter); .FireEvent(EventNames.QSBConversation, (uint)id, "", ConversationType.CloseCharacter);
}
public void SendConvState(int charId, bool state) public void SendConvState(int charId, bool state)
{ {
@ -109,14 +100,14 @@ namespace QSB.ConversationSync
public void DisplayCharacterConversationBox(int index, string text) public void DisplayCharacterConversationBox(int index, string text)
{ {
if (WorldRegistry.OldDialogueTrees.ElementAtOrDefault(index) == null) if (QSBWorldSync.OldDialogueTrees.ElementAtOrDefault(index) == null)
{ {
DebugLog.ToConsole($"Error - Tried to display character conversation box for id {index}! (Doesn't exist!)", MessageType.Error); DebugLog.ToConsole($"Error - Tried to display character conversation box for id {index}! (Doesn't exist!)", MessageType.Error);
return; return;
} }
// Remove old box if it exists // Remove old box if it exists
var oldDialogueTree = WorldRegistry.OldDialogueTrees[index]; var oldDialogueTree = QSBWorldSync.OldDialogueTrees[index];
if (BoxMappings.ContainsKey(oldDialogueTree)) if (BoxMappings.ContainsKey(oldDialogueTree))
{ {
Destroy(BoxMappings[oldDialogueTree]); Destroy(BoxMappings[oldDialogueTree]);
@ -128,7 +119,7 @@ namespace QSB.ConversationSync
private GameObject CreateBox(Transform parent, float vertOffset, string text) private GameObject CreateBox(Transform parent, float vertOffset, string text)
{ {
var newBox = Instantiate(BoxPrefab); var newBox = Instantiate(_boxPrefab);
newBox.SetActive(false); newBox.SetActive(false);
newBox.transform.parent = parent; newBox.transform.parent = parent;
newBox.transform.localPosition = new Vector3(0, vertOffset, 0); newBox.transform.localPosition = new Vector3(0, vertOffset, 0);

View File

@ -1,4 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.Patches;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -13,7 +14,7 @@ namespace QSB.ConversationSync
public static void StartConversation(CharacterDialogueTree __instance) public static void StartConversation(CharacterDialogueTree __instance)
{ {
var index = WorldRegistry.OldDialogueTrees.FindIndex(x => x == __instance); var index = QSBWorldSync.OldDialogueTrees.FindIndex(x => x == __instance);
if (index == -1) if (index == -1)
{ {
DebugLog.ToConsole($"Warning - Index for tree {__instance.name} was -1.", MessageType.Warning); DebugLog.ToConsole($"Warning - Index for tree {__instance.name} was -1.", MessageType.Warning);
@ -58,7 +59,7 @@ namespace QSB.ConversationSync
{ {
var key = ____name + ____listPagesToDisplay[____currentPage]; var key = ____name + ____listPagesToDisplay[____currentPage];
// Sending key so translation can be done on client side - should make different language-d clients compatible // Sending key so translation can be done on client side - should make different language-d clients compatible
QSB.Helper.Events.Unity.RunWhen(() => QSBPlayerManager.LocalPlayer.CurrentDialogueID != -1, QSBCore.Helper.Events.Unity.RunWhen(() => QSBPlayerManager.LocalPlayer.CurrentDialogueID != -1,
() => ConversationManager.Instance.SendCharacterDialogue(QSBPlayerManager.LocalPlayer.CurrentDialogueID, key)); () => ConversationManager.Instance.SendCharacterDialogue(QSBPlayerManager.LocalPlayer.CurrentDialogueID, key));
} }
@ -73,17 +74,12 @@ namespace QSB.ConversationSync
CharacterDialogueTree ____dialogueTree) CharacterDialogueTree ____dialogueTree)
{ {
var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree); var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree);
Vector3 position; var position = playerId == uint.MaxValue
if (playerId == uint.MaxValue) ? Locator.GetActiveCamera().transform.position
{ : QSBPlayerManager.GetPlayer(playerId).Camera.transform.position;
// TODO : Find closest player and track to that camera. var b = ___headTrackingWeight * Mathf.Min(1, !___lookOnlyWhenTalking
position = Locator.GetActiveCamera().transform.position; ? !____playerInHeadZone ? 0 : 1
} : !____inConversation || !____playerInHeadZone ? 0 : 1);
else
{
position = QSBPlayerManager.GetPlayer(playerId).Camera.transform.position;
}
float b = ___headTrackingWeight * Mathf.Min(1, (!___lookOnlyWhenTalking) ? ((!____playerInHeadZone) ? 0 : 1) : ((!____inConversation || !____playerInHeadZone) ? 0 : 1));
____currentLookWeight = Mathf.Lerp(____currentLookWeight, b, Time.deltaTime * 2f); ____currentLookWeight = Mathf.Lerp(____currentLookWeight, b, Time.deltaTime * 2f);
____currentLookTarget = ___lookSpring.Update(____currentLookTarget, position, Time.deltaTime); ____currentLookTarget = ___lookSpring.Update(____currentLookTarget, position, Time.deltaTime);
____animator.SetLookAtPosition(____currentLookTarget); ____animator.SetLookAtPosition(____currentLookTarget);
@ -94,21 +90,17 @@ namespace QSB.ConversationSync
public static bool OnZoneExit(CharacterDialogueTree ____dialogueTree) public static bool OnZoneExit(CharacterDialogueTree ____dialogueTree)
{ {
var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree); var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree);
if (playerId == uint.MaxValue) return playerId == uint.MaxValue;
{
return true;
}
return false;
} }
public override void DoPatches() public override void DoPatches()
{ {
QSB.Helper.HarmonyHelper.AddPostfix<DialogueNode>("GetNextPage", typeof(ConversationPatches), nameof(GetNextPage)); QSBCore.Helper.HarmonyHelper.AddPostfix<DialogueNode>("GetNextPage", typeof(ConversationPatches), nameof(GetNextPage));
QSB.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("InputDialogueOption", typeof(ConversationPatches), nameof(InputDialogueOption)); QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("InputDialogueOption", typeof(ConversationPatches), nameof(InputDialogueOption));
QSB.Helper.HarmonyHelper.AddPostfix<CharacterDialogueTree>("StartConversation", typeof(ConversationPatches), nameof(StartConversation)); QSBCore.Helper.HarmonyHelper.AddPostfix<CharacterDialogueTree>("StartConversation", typeof(ConversationPatches), nameof(StartConversation));
QSB.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(ConversationPatches), nameof(EndConversation)); QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(ConversationPatches), nameof(EndConversation));
QSB.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnAnimatorIK", typeof(ConversationPatches), nameof(OnAnimatorIK)); QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnAnimatorIK", typeof(ConversationPatches), nameof(OnAnimatorIK));
QSB.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneExit", typeof(ConversationPatches), nameof(OnZoneExit)); QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneExit", typeof(ConversationPatches), nameof(OnZoneExit));
} }
} }
} }

View File

@ -2,9 +2,9 @@
{ {
public enum ConversationType public enum ConversationType
{ {
Character, Character = 0,
Player, Player = 1,
CloseCharacter, CloseCharacter = 2,
ClosePlayer ClosePlayer = 3
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.WorldSync; using QSB.WorldSync;
@ -9,7 +9,6 @@ namespace QSB.ConversationSync.Events
public override EventType Type => EventType.Conversation; public override EventType Type => EventType.Conversation;
public override void SetupListener() => GlobalMessenger<uint, string, ConversationType>.AddListener(EventNames.QSBConversation, Handler); public override void SetupListener() => GlobalMessenger<uint, string, ConversationType>.AddListener(EventNames.QSBConversation, Handler);
public override void CloseListener() => GlobalMessenger<uint, string, ConversationType>.RemoveListener(EventNames.QSBConversation, Handler); public override void CloseListener() => GlobalMessenger<uint, string, ConversationType>.RemoveListener(EventNames.QSBConversation, Handler);
private void Handler(uint id, string message, ConversationType type) => SendEvent(CreateMessage(id, message, type)); private void Handler(uint id, string message, ConversationType type) => SendEvent(CreateMessage(id, message, type));
@ -22,7 +21,7 @@ namespace QSB.ConversationSync.Events
Message = message Message = message
}; };
public override void OnReceiveRemote(ConversationMessage message) public override void OnReceiveRemote(bool server, ConversationMessage message)
{ {
switch (message.Type) switch (message.Type)
{ {
@ -40,7 +39,7 @@ namespace QSB.ConversationSync.Events
{ {
break; break;
} }
var tree = WorldRegistry.OldDialogueTrees[message.ObjectId]; var tree = QSBWorldSync.OldDialogueTrees[message.ObjectId];
UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]); UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]);
break; break;

View File

@ -1,6 +1,6 @@
using OWML.Common; using OWML.Common;
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -11,10 +11,9 @@ namespace QSB.ConversationSync.Events
{ {
public class ConversationStartEndEvent : QSBEvent<ConversationStartEndMessage> public class ConversationStartEndEvent : QSBEvent<ConversationStartEndMessage>
{ {
public override EventsCore.EventType Type => EventsCore.EventType.ConversationStartEnd; public override QSB.Events.EventType Type => QSB.Events.EventType.ConversationStartEnd;
public override void SetupListener() => GlobalMessenger<int, uint, bool>.AddListener(EventNames.QSBConversationStartEnd, Handler); public override void SetupListener() => GlobalMessenger<int, uint, bool>.AddListener(EventNames.QSBConversationStartEnd, Handler);
public override void CloseListener() => GlobalMessenger<int, uint, bool>.RemoveListener(EventNames.QSBConversationStartEnd, Handler); public override void CloseListener() => GlobalMessenger<int, uint, bool>.RemoveListener(EventNames.QSBConversationStartEnd, Handler);
private void Handler(int charId, uint playerId, bool state) => SendEvent(CreateMessage(charId, playerId, state)); private void Handler(int charId, uint playerId, bool state) => SendEvent(CreateMessage(charId, playerId, state));
@ -27,43 +26,44 @@ namespace QSB.ConversationSync.Events
State = state State = state
}; };
public override void OnReceiveRemote(ConversationStartEndMessage message) public override void OnReceiveRemote(bool server, ConversationStartEndMessage message)
{ {
if (message.CharacterId == -1) if (message.CharacterId == -1)
{ {
DebugLog.ToConsole("Warning - Received conv. start/end event with char id -1.", MessageType.Warning); DebugLog.ToConsole("Warning - Received conv. start/end event with char id -1.", MessageType.Warning);
return; return;
} }
var dialogueTree = WorldRegistry.OldDialogueTrees[message.CharacterId]; var dialogueTree = QSBWorldSync.OldDialogueTrees[message.CharacterId];
var animController = Resources.FindObjectsOfTypeAll<CharacterAnimController>().FirstOrDefault(x => x.GetValue<CharacterDialogueTree>("_dialogueTree") == dialogueTree); var animController = Resources.FindObjectsOfTypeAll<CharacterAnimController>().FirstOrDefault(x => x.GetValue<CharacterDialogueTree>("_dialogueTree") == dialogueTree);
// Make character face player and talk // Make character face player and talk
if (animController != default(CharacterAnimController)) if (animController == default(CharacterAnimController))
{ {
if (message.State) return;
}
if (message.State)
{
// Start talking
QSBPlayerManager.GetPlayer(message.PlayerId).CurrentDialogueID = message.CharacterId;
animController.SetValue("_inConversation", true);
animController.SetValue("_playerInHeadZone", true);
if (animController.GetValue<bool>("_hasTalkAnimation"))
{ {
// Start talking animController.GetValue<Animator>("_animator").SetTrigger("Talking");
QSBPlayerManager.GetPlayer(message.PlayerId).CurrentDialogueID = message.CharacterId;
animController.SetValue("_inConversation", true);
animController.SetValue("_playerInHeadZone", true);
if (animController.GetValue<bool>("_hasTalkAnimation"))
{
animController.GetValue<Animator>("_animator").SetTrigger("Talking");
}
dialogueTree.GetComponent<InteractVolume>().DisableInteraction();
} }
else dialogueTree.GetComponent<InteractVolume>().DisableInteraction();
}
else
{
// Stop talking
QSBPlayerManager.GetPlayer(message.PlayerId).CurrentDialogueID = -1;
animController.SetValue("_inConversation", false);
animController.SetValue("_playerInHeadZone", false);
if (animController.GetValue<bool>("_hasTalkAnimation"))
{ {
// Stop talking animController.GetValue<Animator>("_animator").SetTrigger("Idle");
QSBPlayerManager.GetPlayer(message.PlayerId).CurrentDialogueID = -1;
animController.SetValue("_inConversation", false);
animController.SetValue("_playerInHeadZone", false);
if (animController.GetValue<bool>("_hasTalkAnimation"))
{
animController.GetValue<Animator>("_animator").SetTrigger("Idle");
}
dialogueTree.GetComponent<InteractVolume>().EnableInteraction();
} }
dialogueTree.GetComponent<InteractVolume>().EnableInteraction();
} }
} }
} }

View File

@ -1,4 +1,5 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Patches;
using System.Linq; using System.Linq;
namespace QSB.DeathSync namespace QSB.DeathSync
@ -26,8 +27,8 @@ namespace QSB.DeathSync
public override void DoPatches() public override void DoPatches()
{ {
QSB.Helper.HarmonyHelper.AddPrefix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(PreFinishDeathSequence)); QSBCore.Helper.HarmonyHelper.AddPrefix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(PreFinishDeathSequence));
QSB.Helper.HarmonyHelper.AddPostfix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(BroadcastDeath)); QSBCore.Helper.HarmonyHelper.AddPostfix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(BroadcastDeath));
} }
} }
} }

View File

@ -1,5 +1,5 @@
using QSB.EventsCore; using QSB.Events;
using QSB.MessagesCore; using QSB.Messaging;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
@ -10,7 +10,6 @@ namespace QSB.DeathSync.Events
public override EventType Type => EventType.PlayerDeath; public override EventType Type => EventType.PlayerDeath;
public override void SetupListener() => GlobalMessenger<DeathType>.AddListener(EventNames.QSBPlayerDeath, Handler); public override void SetupListener() => GlobalMessenger<DeathType>.AddListener(EventNames.QSBPlayerDeath, Handler);
public override void CloseListener() => GlobalMessenger<DeathType>.RemoveListener(EventNames.QSBPlayerDeath, Handler); public override void CloseListener() => GlobalMessenger<DeathType>.RemoveListener(EventNames.QSBPlayerDeath, Handler);
private void Handler(DeathType type) => SendEvent(CreateMessage(type)); private void Handler(DeathType type) => SendEvent(CreateMessage(type));
@ -21,13 +20,11 @@ namespace QSB.DeathSync.Events
Value = type Value = type
}; };
public override void OnReceiveRemote(EnumMessage<DeathType> message) public override void OnReceiveRemote(bool server, EnumMessage<DeathType> message)
{ {
var playerName = QSBPlayerManager.GetPlayer(message.AboutId).Name; var playerName = QSBPlayerManager.GetPlayer(message.AboutId).Name;
var deathMessage = Necronomicon.GetPhrase(message.Value); var deathMessage = Necronomicon.GetPhrase(message.Value);
DebugLog.ToAll(string.Format(deathMessage, playerName)); DebugLog.ToAll(string.Format(deathMessage, playerName));
} }
public override void OnReceiveLocal(EnumMessage<DeathType> message) => OnReceiveRemote(message);
} }
} }

View File

@ -95,9 +95,7 @@ namespace QSB.DeathSync
} } } }
}; };
public static string GetPhrase(DeathType deathType) public static string GetPhrase(DeathType deathType) =>
{ DeathDictionary[deathType].OrderBy(x => Guid.NewGuid()).First();
return DeathDictionary[deathType].OrderBy(x => Guid.NewGuid()).First();
}
} }
} }

View File

@ -8,15 +8,15 @@ namespace QSB.DeathSync
{ {
public class PreventShipDestruction : MonoBehaviour public class PreventShipDestruction : MonoBehaviour
{ {
private void Awake() public void Awake()
{ {
QSB.Helper.HarmonyHelper.Transpile<ShipDetachableLeg>("Detach", typeof(Patch), nameof(Patch.ReturnNull)); QSBCore.Helper.HarmonyHelper.Transpile<ShipDetachableLeg>("Detach", typeof(Patch), nameof(Patch.ReturnNull));
QSB.Helper.HarmonyHelper.Transpile<ShipDetachableModule>("Detach", typeof(Patch), nameof(Patch.ReturnNull)); QSBCore.Helper.HarmonyHelper.Transpile<ShipDetachableModule>("Detach", typeof(Patch), nameof(Patch.ReturnNull));
QSB.Helper.HarmonyHelper.EmptyMethod<ShipEjectionSystem>("OnPressInteract"); QSBCore.Helper.HarmonyHelper.EmptyMethod<ShipEjectionSystem>("OnPressInteract");
QSB.Helper.Events.Subscribe<ShipDamageController>(OWML.Common.Events.AfterAwake); QSBCore.Helper.Events.Subscribe<ShipDamageController>(OWML.Common.Events.AfterAwake);
QSB.Helper.Events.Event += OnEvent; QSBCore.Helper.Events.Event += OnEvent;
} }
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)

View File

@ -1,15 +1,12 @@
using OWML.Common; using OWML.Common;
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.Utility; using QSB.Utility;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
namespace QSB.DeathSync namespace QSB.DeathSync
{ {
/// <summary>
/// Client-only-side component for managing respawning after death.
/// </summary>
public class RespawnOnDeath : MonoBehaviour public class RespawnOnDeath : MonoBehaviour
{ {
public static RespawnOnDeath Instance; public static RespawnOnDeath Instance;
@ -31,12 +28,12 @@ namespace QSB.DeathSync
private ShipCockpitController _cockpitController; private ShipCockpitController _cockpitController;
private PlayerSpacesuit _spaceSuit; private PlayerSpacesuit _spaceSuit;
private void Awake() public void Awake()
{ {
Instance = this; Instance = this;
QSB.Helper.Events.Subscribe<PlayerResources>(OWML.Common.Events.AfterStart); QSBCore.Helper.Events.Subscribe<PlayerResources>(OWML.Common.Events.AfterStart);
QSB.Helper.Events.Event += OnEvent; QSBCore.Helper.Events.Event += OnEvent;
} }
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
@ -129,11 +126,9 @@ namespace QSB.DeathSync
_spaceSuit.RemoveSuit(true); _spaceSuit.RemoveSuit(true);
} }
private SpawnPoint GetSpawnPoint(bool isShip = false) private SpawnPoint GetSpawnPoint(bool isShip = false) =>
{ _playerSpawner
return _playerSpawner
.GetValue<SpawnPoint[]>("_spawnList") .GetValue<SpawnPoint[]>("_spawnList")
.FirstOrDefault(spawnPoint => spawnPoint.GetSpawnLocation() == SpawnLocation.TimberHearth && spawnPoint.IsShipSpawn() == isShip); .FirstOrDefault(spawnPoint => spawnPoint.GetSpawnLocation() == SpawnLocation.TimberHearth && spawnPoint.IsShipSpawn() == isShip);
}
} }
} }

View File

@ -0,0 +1,39 @@
using QSB.Events;
using QSB.WorldSync;
namespace QSB.DialogueConditionSync.Events
{
public class DialogueConditionEvent : QSBEvent<DialogueConditionMessage>
{
public override EventType Type => EventType.DialogueCondition;
public override void SetupListener() => GlobalMessenger<string, bool>.AddListener(EventNames.DialogueCondition, Handler);
public override void CloseListener() => GlobalMessenger<string, bool>.RemoveListener(EventNames.DialogueCondition, Handler);
private void Handler(string name, bool state) => SendEvent(CreateMessage(name, state));
private DialogueConditionMessage CreateMessage(string name, bool state) => new DialogueConditionMessage
{
AboutId = LocalPlayerId,
ConditionName = name,
ConditionState = state
};
public override void OnReceiveLocal(bool server, DialogueConditionMessage message)
{
if (server)
{
QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState);
}
}
public override void OnReceiveRemote(bool server, DialogueConditionMessage message)
{
if (server)
{
QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState);
}
DialogueConditionManager.SharedInstance.SetConditionState(message.ConditionName, message.ConditionState);
}
}
}

View File

@ -0,0 +1,25 @@
using QSB.Messaging;
using QuantumUNET;
namespace QSB.DialogueConditionSync.Events
{
public class DialogueConditionMessage : PlayerMessage
{
public string ConditionName { get; set; }
public bool ConditionState { get; set; }
public override void Deserialize(QSBNetworkReader reader)
{
base.Deserialize(reader);
ConditionName = reader.ReadString();
ConditionState = reader.ReadBoolean();
}
public override void Serialize(QSBNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(ConditionName);
writer.Write(ConditionState);
}
}
}

View File

@ -11,25 +11,22 @@ namespace QSB.ElevatorSync
private List<Elevator> _elevators; private List<Elevator> _elevators;
private void Awake() public void Awake()
{ {
Instance = this; Instance = this;
QSBSceneManager.OnSceneLoaded += OnSceneLoaded; QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
} }
private void OnDestroy() public void OnDestroy() => QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
{
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
}
private void OnSceneLoaded(OWScene scene, bool isInUniverse) private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{ {
_elevators = Resources.FindObjectsOfTypeAll<Elevator>().ToList(); _elevators = Resources.FindObjectsOfTypeAll<Elevator>().ToList();
for (var id = 0; id < _elevators.Count; id++) for (var id = 0; id < _elevators.Count; id++)
{ {
var qsbElevator = WorldRegistry.GetObject<QSBElevator>(id) ?? new QSBElevator(); var qsbElevator = QSBWorldSync.GetWorldObject<QSBElevator>(id) ?? new QSBElevator();
qsbElevator.Init(_elevators[id], id); qsbElevator.Init(_elevators[id], id);
WorldRegistry.AddObject(qsbElevator); QSBWorldSync.AddWorldObject(qsbElevator);
} }
} }

View File

@ -1,5 +1,6 @@
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.Patches;
namespace QSB.ElevatorSync namespace QSB.ElevatorSync
{ {
@ -16,7 +17,7 @@ namespace QSB.ElevatorSync
public override void DoPatches() public override void DoPatches()
{ {
QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(StartLift)); QSBCore.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(StartLift));
} }
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
using QSB.WorldSync.Events; using QSB.WorldSync.Events;
@ -9,7 +9,6 @@ namespace QSB.ElevatorSync.Events
public override EventType Type => EventType.Elevator; public override EventType Type => EventType.Elevator;
public override void SetupListener() => GlobalMessenger<int, bool>.AddListener(EventNames.QSBStartLift, Handler); public override void SetupListener() => GlobalMessenger<int, bool>.AddListener(EventNames.QSBStartLift, Handler);
public override void CloseListener() => GlobalMessenger<int, bool>.RemoveListener(EventNames.QSBStartLift, Handler); public override void CloseListener() => GlobalMessenger<int, bool>.RemoveListener(EventNames.QSBStartLift, Handler);
private void Handler(int id, bool isGoingUp) => SendEvent(CreateMessage(id, isGoingUp)); private void Handler(int id, bool isGoingUp) => SendEvent(CreateMessage(id, isGoingUp));
@ -20,9 +19,9 @@ namespace QSB.ElevatorSync.Events
ObjectId = id ObjectId = id
}; };
public override void OnReceiveRemote(BoolWorldObjectMessage message) public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message)
{ {
var elevator = WorldRegistry.GetObject<QSBElevator>(message.ObjectId); var elevator = QSBWorldSync.GetWorldObject<QSBElevator>(message.ObjectId);
elevator?.RemoteCall(message.State); elevator?.RemoteCall(message.State);
} }
} }

View File

@ -18,7 +18,7 @@ namespace QSB.ElevatorSync
{ {
_elevator = elevator; _elevator = elevator;
ObjectId = id; ObjectId = id;
QSB.Helper.Events.Unity.RunWhen(() => _elevator.GetValue<SingleInteractionVolume>("_interactVolume") != null, InitValues); QSBCore.Helper.Events.Unity.RunWhen(() => _elevator.GetValue<SingleInteractionVolume>("_interactVolume") != null, InitValues);
} }
private void InitValues() private void InitValues()

View File

@ -1,4 +1,4 @@
namespace QSB.EventsCore namespace QSB.Events
{ {
public static class EventNames public static class EventNames
{ {
@ -17,16 +17,14 @@
public static string ExitShip = "ExitShip"; public static string ExitShip = "ExitShip";
public static string RestartTimeLoop = "RestartTimeLoop"; public static string RestartTimeLoop = "RestartTimeLoop";
public static string WakeUp = "WakeUp"; public static string WakeUp = "WakeUp";
public static string DialogueCondition = "DialogueConditionChanged";
public static string QSBPlayerDeath = "QSBPlayerDeath"; public static string QSBPlayerDeath = "QSBPlayerDeath";
public static string QSBPlayerJoin = "QSBPlayerJoin"; public static string QSBPlayerJoin = "QSBPlayerJoin";
public static string QSBPlayerLeave = "QSBPlayerLeave";
public static string QSBPlayerReady = "QSBPlayerReady"; public static string QSBPlayerReady = "QSBPlayerReady";
public static string QSBSectorChange = "QSBSectorChange"; public static string QSBSectorChange = "QSBSectorChange";
public static string QSBPlayerStatesRequest = "QSBPlayerStatesRequest"; public static string QSBPlayerStatesRequest = "QSBPlayerStatesRequest";
public static string QSBServerTime = "QSBServerTime"; public static string QSBServerTime = "QSBServerTime";
public static string QSBOnProbeAnchor = "QSBOnProbeAnchor";
public static string QSBOnProbeWarp = "QSBOnProbeWarp";
public static string QSBStartLift = "QSBStartLift"; public static string QSBStartLift = "QSBStartLift";
public static string QSBGeyserState = "QSBGeyserState"; public static string QSBGeyserState = "QSBGeyserState";
public static string QSBCrouch = "QSBAnimTrigger"; public static string QSBCrouch = "QSBAnimTrigger";

View File

@ -1,4 +1,4 @@
namespace QSB.EventsCore namespace QSB.Events
{ {
public enum EventType public enum EventType
{ {
@ -13,7 +13,6 @@
ProbeLauncherActiveChange, ProbeLauncherActiveChange,
SuitActiveChange, SuitActiveChange,
PlayerJoin, PlayerJoin,
PlayerLeave,
PlayerDeath, PlayerDeath,
PlayerSectorChange, PlayerSectorChange,
PlayerReady, PlayerReady,
@ -24,6 +23,7 @@
OrbUser, OrbUser,
Conversation, Conversation,
ConversationStartEnd, ConversationStartEnd,
PlayInstrument PlayInstrument,
DialogueCondition
} }
} }

View File

@ -1,9 +1,8 @@
namespace QSB.EventsCore namespace QSB.Events
{ {
public interface IQSBEvent public interface IQSBEvent
{ {
void SetupListener(); void SetupListener();
void CloseListener(); void CloseListener();
} }
} }

View File

@ -3,42 +3,32 @@ using QSB.Player;
using QSB.TransformSync; using QSB.TransformSync;
using QuantumUNET; using QuantumUNET;
namespace QSB.EventsCore namespace QSB.Events
{ {
public abstract class QSBEvent<T> : IQSBEvent where T : PlayerMessage, new() public abstract class QSBEvent<T> : IQSBEvent where T : PlayerMessage, new()
{ {
public abstract EventType Type { get; } public abstract EventType Type { get; }
public uint LocalPlayerId => QSBPlayerManager.LocalPlayerId; public uint LocalPlayerId => QSBPlayerManager.LocalPlayerId;
private readonly MessageHandler<T> _eventHandler; private readonly MessageHandler<T> _eventHandler;
protected QSBEvent() protected QSBEvent()
{ {
_eventHandler = new MessageHandler<T>(Type); _eventHandler = new MessageHandler<T>(Type);
_eventHandler.OnClientReceiveMessage += OnClientReceive; _eventHandler.OnClientReceiveMessage += message => OnReceive(false, message);
_eventHandler.OnServerReceiveMessage += OnServerReceive; _eventHandler.OnServerReceiveMessage += message => OnReceive(true, message);
} }
public abstract void SetupListener(); public abstract void SetupListener();
public abstract void CloseListener(); public abstract void CloseListener();
public virtual void OnReceiveRemote(T message) public virtual void OnReceiveRemote(bool server, T message) { }
{ public virtual void OnReceiveLocal(bool server, T message) { }
}
public virtual void OnReceiveLocal(T message)
{
}
public virtual void OnServerReceive(T message)
{
_eventHandler.SendToAll(message);
}
public void SendEvent(T message) public void SendEvent(T message)
{ {
message.FromId = QSBPlayerManager.LocalPlayerId; message.FromId = QSBPlayerManager.LocalPlayerId;
QSB.Helper.Events.Unity.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => Send(message)); QSBCore.Helper.Events.Unity.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => Send(message));
} }
private void Send(T message) private void Send(T message)
@ -53,16 +43,22 @@ namespace QSB.EventsCore
} }
} }
private void OnClientReceive(T message) private void OnReceive(bool isServer, T message)
{ {
if (isServer
&& !message.OnlySendToServer
&& message.FromId != QSBPlayerManager.LocalPlayerId)
{
_eventHandler.SendToAll(message);
}
if (message.FromId == QSBPlayerManager.LocalPlayerId || if (message.FromId == QSBPlayerManager.LocalPlayerId ||
QSBPlayerManager.IsBelongingToLocalPlayer(message.AboutId)) QSBPlayerManager.IsBelongingToLocalPlayer(message.AboutId))
{ {
OnReceiveLocal(message); OnReceiveLocal(isServer, message);
return; return;
} }
OnReceiveRemote(message); OnReceiveRemote(isServer, message);
} }
} }
} }

View File

@ -1,8 +1,8 @@
using OWML.Common; using OWML.Common;
using QSB.Animation;
using QSB.Animation.Events; using QSB.Animation.Events;
using QSB.ConversationSync.Events; using QSB.ConversationSync.Events;
using QSB.DeathSync.Events; using QSB.DeathSync.Events;
using QSB.DialogueConditionSync.Events;
using QSB.ElevatorSync.Events; using QSB.ElevatorSync.Events;
using QSB.GeyserSync.Events; using QSB.GeyserSync.Events;
using QSB.OrbSync.Events; using QSB.OrbSync.Events;
@ -12,7 +12,7 @@ using QSB.Tools.Events;
using QSB.Utility; using QSB.Utility;
using System.Collections.Generic; using System.Collections.Generic;
namespace QSB.EventsCore namespace QSB.Events
{ {
public static class QSBEventManager public static class QSBEventManager
{ {
@ -33,7 +33,6 @@ namespace QSB.EventsCore
new PlayerProbeLauncherEvent(), new PlayerProbeLauncherEvent(),
new PlayerProbeEvent(), new PlayerProbeEvent(),
new PlayerSectorEvent(), new PlayerSectorEvent(),
new PlayerLeaveEvent(),
new PlayerDeathEvent(), new PlayerDeathEvent(),
new PlayerStatesRequestEvent(), new PlayerStatesRequestEvent(),
new ElevatorEvent(), new ElevatorEvent(),
@ -45,7 +44,8 @@ namespace QSB.EventsCore
new ConversationEvent(), new ConversationEvent(),
new ConversationStartEndEvent(), new ConversationStartEndEvent(),
new ChangeAnimTypeEvent(), new ChangeAnimTypeEvent(),
new ServerSendPlayerStatesEvent() new ServerSendPlayerStatesEvent(),
new DialogueConditionEvent()
}; };
_eventList.ForEach(ev => ev.SetupListener()); _eventList.ForEach(ev => ev.SetupListener());
@ -58,9 +58,7 @@ namespace QSB.EventsCore
public static void Reset() public static void Reset()
{ {
Ready = false; Ready = false;
_eventList.ForEach(ev => ev.CloseListener()); _eventList.ForEach(ev => ev.CloseListener());
_eventList = new List<IQSBEvent>(); _eventList = new List<IQSBEvent>();
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
using QSB.WorldSync.Events; using QSB.WorldSync.Events;
@ -8,15 +8,8 @@ namespace QSB.GeyserSync.Events
{ {
public override EventType Type => EventType.Geyser; public override EventType Type => EventType.Geyser;
public override void SetupListener() public override void SetupListener() => GlobalMessenger<int, bool>.AddListener(EventNames.QSBGeyserState, Handler);
{ public override void CloseListener() => GlobalMessenger<int, bool>.RemoveListener(EventNames.QSBGeyserState, Handler);
GlobalMessenger<int, bool>.AddListener(EventNames.QSBGeyserState, Handler);
}
public override void CloseListener()
{
GlobalMessenger<int, bool>.RemoveListener(EventNames.QSBGeyserState, Handler);
}
private void Handler(int id, bool state) => SendEvent(CreateMessage(id, state)); private void Handler(int id, bool state) => SendEvent(CreateMessage(id, state));
@ -27,9 +20,9 @@ namespace QSB.GeyserSync.Events
State = state State = state
}; };
public override void OnReceiveRemote(BoolWorldObjectMessage message) public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message)
{ {
var geyser = WorldRegistry.GetObject<QSBGeyser>(message.ObjectId); var geyser = QSBWorldSync.GetWorldObject<QSBGeyser>(message.ObjectId);
geyser?.SetState(message.State); geyser?.SetState(message.State);
} }
} }

View File

@ -6,16 +6,13 @@ namespace QSB.GeyserSync
{ {
public class GeyserManager : MonoBehaviour public class GeyserManager : MonoBehaviour
{ {
public static GeyserManager Instance { get; private set; } public void Awake()
private void Awake()
{ {
Instance = this;
QSBSceneManager.OnSceneLoaded += OnSceneLoaded; QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
QSBPatchManager.OnPatchType += OnPatchType; QSBPatchManager.OnPatchType += OnPatchType;
} }
private void OnDestroy() public void OnDestroy()
{ {
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
QSBPatchManager.OnPatchType -= OnPatchType; QSBPatchManager.OnPatchType -= OnPatchType;
@ -26,9 +23,9 @@ namespace QSB.GeyserSync
var geyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>(); var geyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>();
for (var id = 0; id < geyserControllers.Length; id++) for (var id = 0; id < geyserControllers.Length; id++)
{ {
var qsbGeyser = WorldRegistry.GetObject<QSBGeyser>(id) ?? new QSBGeyser(); var qsbGeyser = QSBWorldSync.GetWorldObject<QSBGeyser>(id) ?? new QSBGeyser();
qsbGeyser.Init(geyserControllers[id], id); qsbGeyser.Init(geyserControllers[id], id);
WorldRegistry.AddObject(qsbGeyser); QSBWorldSync.AddWorldObject(qsbGeyser);
} }
} }
@ -38,7 +35,7 @@ namespace QSB.GeyserSync
{ {
return; return;
} }
QSB.Helper.HarmonyHelper.EmptyMethod<GeyserController>("Update"); QSBCore.Helper.HarmonyHelper.EmptyMethod<GeyserController>("Update");
} }
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
using QuantumUNET; using QuantumUNET;
@ -30,11 +30,9 @@ namespace QSB.GeyserSync
if (state) if (state)
{ {
_geyserController?.ActivateGeyser(); _geyserController?.ActivateGeyser();
return;
} }
else _geyserController?.DeactivateGeyser();
{
_geyserController?.DeactivateGeyser();
}
} }
} }
} }

View File

@ -1,6 +1,6 @@
using OWML.Common; using OWML.Common;
using QSB.Animation; using QSB.Animation;
using QSB.EventsCore; using QSB.Events;
using QSB.Instruments.QSBCamera; using QSB.Instruments.QSBCamera;
using QSB.Player; using QSB.Player;
using QSB.Utility; using QSB.Utility;
@ -10,54 +10,56 @@ namespace QSB.Instruments
{ {
public class InstrumentsManager : PlayerSyncObject public class InstrumentsManager : PlayerSyncObject
{ {
private Transform rootObj; private Transform _rootObj;
private AnimationType _savedType; private AnimationType _savedType;
private GameObject ChertDrum; private GameObject _chertDrum;
public void InitLocal(Transform root) public void InitLocal(Transform root)
{ {
rootObj = root; _rootObj = root;
gameObject.AddComponent<CameraManager>(); gameObject.AddComponent<CameraManager>();
QSBInputManager.ChertTaunt += () => StartInstrument(AnimationType.Chert); QSBInputManager.ChertTaunt += OnChertTaunt;
QSBInputManager.EskerTaunt += () => StartInstrument(AnimationType.Esker); QSBInputManager.EskerTaunt += OnEskerTaunt;
QSBInputManager.FeldsparTaunt += () => StartInstrument(AnimationType.Feldspar); QSBInputManager.FeldsparTaunt += OnFeldsparTaunt;
QSBInputManager.GabbroTaunt += () => StartInstrument(AnimationType.Gabbro); QSBInputManager.GabbroTaunt += OnGabbroTaunt;
QSBInputManager.RiebeckTaunt += () => StartInstrument(AnimationType.Riebeck); QSBInputManager.RiebeckTaunt += OnRiebeckTaunt;
QSBInputManager.ExitTaunt += () => ReturnToPlayer(); QSBInputManager.ExitTaunt += ReturnToPlayer;
QSB.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments); QSBCore.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
QSBPlayerManager.PlayerSyncObjects.Add(this);
} }
public void InitRemote(Transform root) public void InitRemote(Transform root)
{ {
rootObj = root; _rootObj = root;
QSB.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments); QSBCore.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
QSBPlayerManager.PlayerSyncObjects.Add(this);
} }
private void OnDestroy() protected override void OnDestroy()
{ {
base.OnDestroy();
if (!IsLocalPlayer) if (!IsLocalPlayer)
{ {
return; return;
} }
DebugLog.DebugWrite($"OnDestroy {PlayerId}"); QSBInputManager.ChertTaunt -= OnChertTaunt;
QSBInputManager.ChertTaunt -= () => StartInstrument(AnimationType.Chert); QSBInputManager.EskerTaunt -= OnEskerTaunt;
QSBInputManager.EskerTaunt -= () => StartInstrument(AnimationType.Esker); QSBInputManager.FeldsparTaunt -= OnFeldsparTaunt;
QSBInputManager.FeldsparTaunt -= () => StartInstrument(AnimationType.Feldspar); QSBInputManager.GabbroTaunt -= OnGabbroTaunt;
QSBInputManager.GabbroTaunt -= () => StartInstrument(AnimationType.Gabbro); QSBInputManager.RiebeckTaunt -= OnRiebeckTaunt;
QSBInputManager.RiebeckTaunt -= () => StartInstrument(AnimationType.Riebeck); QSBInputManager.ExitTaunt -= ReturnToPlayer;
QSBInputManager.ExitTaunt -= () => ReturnToPlayer();
} }
private void OnChertTaunt() => StartInstrument(AnimationType.Chert);
private void OnEskerTaunt() => StartInstrument(AnimationType.Esker);
private void OnFeldsparTaunt() => StartInstrument(AnimationType.Feldspar);
private void OnGabbroTaunt() => StartInstrument(AnimationType.Gabbro);
private void OnRiebeckTaunt() => StartInstrument(AnimationType.Riebeck);
private void SetupInstruments() private void SetupInstruments()
{ {
var bundle = QSB.InstrumentAssetBundle; var bundle = QSBCore.InstrumentAssetBundle;
ChertDrum = MakeChertDrum(bundle); _chertDrum = MakeChertDrum(bundle);
} }
private GameObject MakeChertDrum(AssetBundle bundle) private GameObject MakeChertDrum(AssetBundle bundle)
@ -76,8 +78,8 @@ namespace QSB.Instruments
// TODO : fix for instrument release // TODO : fix for instrument release
mr.sharedMaterial = null; mr.sharedMaterial = null;
} }
drum.transform.parent = rootObj; drum.transform.parent = _rootObj;
drum.transform.rotation = rootObj.rotation; drum.transform.rotation = _rootObj.rotation;
drum.transform.localPosition = Vector3.zero; drum.transform.localPosition = Vector3.zero;
drum.transform.localScale = new Vector3(16.0f, 16.5f, 16.0f); drum.transform.localScale = new Vector3(16.0f, 16.5f, 16.0f);
drum.SetActive(false); drum.SetActive(false);
@ -124,12 +126,11 @@ namespace QSB.Instruments
switch (type) switch (type)
{ {
case AnimationType.Chert: case AnimationType.Chert:
ChertDrum.SetActive(true); _chertDrum?.SetActive(true);
break; break;
case AnimationType.PlayerSuited: case AnimationType.PlayerSuited:
case AnimationType.PlayerUnsuited: case AnimationType.PlayerUnsuited:
ChertDrum.SetActive(false); _chertDrum?.SetActive(false);
break; break;
} }
} }

View File

@ -4,6 +4,8 @@ namespace QSB.Instruments.QSBCamera
{ {
internal class CameraController : MonoBehaviour internal class CameraController : MonoBehaviour
{ {
public GameObject CameraObject { get; set; }
private float _degreesX; private float _degreesX;
private float _degreesY; private float _degreesY;
private Quaternion _rotationX; private Quaternion _rotationX;
@ -15,9 +17,7 @@ namespace QSB.Instruments.QSBCamera
// Maximum distance for camera clipping // Maximum distance for camera clipping
private const float RayLength = 5f; private const float RayLength = 5f;
public GameObject CameraObject; public void FixedUpdate()
private void FixedUpdate()
{ {
if (CameraManager.Instance.Mode != CameraMode.ThirdPerson) if (CameraManager.Instance.Mode != CameraMode.ThirdPerson)
{ {
@ -41,27 +41,19 @@ namespace QSB.Instruments.QSBCamera
else else
{ {
// Raycast didn't hit collider, get target from camera direction // Raycast didn't hit collider, get target from camera direction
localTargetPoint = localDirection * RayLength * PercentToMove; localTargetPoint = RayLength * PercentToMove * localDirection;
} }
var targetDistance = Vector3.Distance(origin, transform.TransformPoint(localTargetPoint)); var targetDistance = Vector3.Distance(origin, transform.TransformPoint(localTargetPoint));
var currentDistance = Vector3.Distance(origin, CameraObject.transform.position); var currentDistance = Vector3.Distance(origin, CameraObject.transform.position);
Vector3 movement; var movement = targetDistance < currentDistance
if (targetDistance < currentDistance) ? localTargetPoint
{ : Vector3.MoveTowards(CameraObject.transform.localPosition, localTargetPoint, Time.fixedDeltaTime * 2f);
// Snap to target to avoid clipping
movement = localTargetPoint;
}
else
{
// Move camera out slowly
movement = Vector3.MoveTowards(CameraObject.transform.localPosition, localTargetPoint, Time.fixedDeltaTime * 2f);
}
CameraObject.transform.localPosition = movement; CameraObject.transform.localPosition = movement;
} }
private void UpdateInput() private void UpdateInput()
{ {
var input = OWInput.GetValue(InputLibrary.look, false, InputMode.All); var input = OWInput.GetValue(InputLibrary.look, false);
_degreesX += input.x * 180f * Time.fixedDeltaTime; _degreesX += input.x * 180f * Time.fixedDeltaTime;
_degreesY += input.y * 180f * Time.fixedDeltaTime; _degreesY += input.y * 180f * Time.fixedDeltaTime;
} }

View File

@ -8,13 +8,16 @@ namespace QSB.Instruments.QSBCamera
public class CameraManager : MonoBehaviour public class CameraManager : MonoBehaviour
{ {
public static CameraManager Instance; public static CameraManager Instance;
private GameObject CameraBase;
private GameObject CameraObj;
private Camera Camera;
private OWCamera OWCamera;
public bool IsSetUp { get; private set; } public bool IsSetUp { get; private set; }
public CameraMode Mode { get; private set; } public CameraMode Mode { get; private set; }
private GameObject _cameraBase;
private GameObject _cameraObj;
private Camera _camera;
private OWCamera _owCamera;
public void Start() public void Start()
{ {
Instance = this; Instance = this;
@ -23,38 +26,38 @@ namespace QSB.Instruments.QSBCamera
private void SetupCamera() private void SetupCamera()
{ {
CameraBase = new GameObject(); _cameraBase = new GameObject();
CameraBase.SetActive(false); _cameraBase.SetActive(false);
CameraBase.AddComponent<Transform>(); _cameraBase.AddComponent<Transform>();
CameraBase.transform.parent = Locator.GetPlayerTransform(); _cameraBase.transform.parent = Locator.GetPlayerTransform();
CameraBase.transform.localPosition = Vector3.zero; _cameraBase.transform.localPosition = Vector3.zero;
CameraBase.transform.localRotation = Quaternion.Euler(0, 0, 0); _cameraBase.transform.localRotation = Quaternion.Euler(0, 0, 0);
CameraObj = new GameObject(); _cameraObj = new GameObject();
CameraObj.transform.parent = CameraBase.transform; _cameraObj.transform.parent = _cameraBase.transform;
CameraObj.transform.localPosition = new Vector3(0, 0, -5f); _cameraObj.transform.localPosition = new Vector3(0, 0, -5f);
CameraObj.transform.localRotation = Quaternion.Euler(0, 0, 0); _cameraObj.transform.localRotation = Quaternion.Euler(0, 0, 0);
Camera = CameraObj.AddComponent<Camera>(); _camera = _cameraObj.AddComponent<Camera>();
Camera.cullingMask = Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27) | (1 << 22); _camera.cullingMask = Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27) | (1 << 22);
Camera.clearFlags = CameraClearFlags.Color; _camera.clearFlags = CameraClearFlags.Color;
Camera.backgroundColor = Color.black; _camera.backgroundColor = Color.black;
Camera.fieldOfView = 90f; _camera.fieldOfView = 90f;
Camera.nearClipPlane = 0.1f; _camera.nearClipPlane = 0.1f;
Camera.farClipPlane = 40000f; _camera.farClipPlane = 40000f;
Camera.depth = 0f; _camera.depth = 0f;
Camera.enabled = false; _camera.enabled = false;
OWCamera = CameraObj.AddComponent<OWCamera>(); _owCamera = _cameraObj.AddComponent<OWCamera>();
OWCamera.renderSkybox = true; _owCamera.renderSkybox = true;
CameraBase.AddComponent<CameraController>().CameraObject = CameraObj; _cameraBase.AddComponent<CameraController>().CameraObject = _cameraObj;
var screenGrab = CameraObj.AddComponent<FlashbackScreenGrabImageEffect>(); var screenGrab = _cameraObj.AddComponent<FlashbackScreenGrabImageEffect>();
screenGrab._downsampleShader = Locator.GetPlayerCamera().gameObject.GetComponent<FlashbackScreenGrabImageEffect>()._downsampleShader; screenGrab._downsampleShader = Locator.GetPlayerCamera().gameObject.GetComponent<FlashbackScreenGrabImageEffect>()._downsampleShader;
var fogImage = CameraObj.AddComponent<PlanetaryFogImageEffect>(); var fogImage = _cameraObj.AddComponent<PlanetaryFogImageEffect>();
fogImage.fogShader = Locator.GetPlayerCamera().gameObject.GetComponent<PlanetaryFogImageEffect>().fogShader; fogImage.fogShader = Locator.GetPlayerCamera().gameObject.GetComponent<PlanetaryFogImageEffect>().fogShader;
CameraBase.SetActive(true); _cameraBase.SetActive(true);
IsSetUp = true; IsSetUp = true;
} }
@ -79,14 +82,14 @@ namespace QSB.Instruments.QSBCamera
return; return;
} }
OWInput.ChangeInputMode(InputMode.None); OWInput.ChangeInputMode(InputMode.None);
GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", OWCamera); GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", _owCamera);
Locator.GetPlayerCamera().mainCamera.enabled = false; Locator.GetPlayerCamera().mainCamera.enabled = false;
if (CameraObj.GetComponent<PostProcessingBehaviour>() == null) if (_cameraObj.GetComponent<PostProcessingBehaviour>() == null)
{ {
var postProcessing = CameraObj.AddComponent<PostProcessingBehaviour>(); var postProcessing = _cameraObj.AddComponent<PostProcessingBehaviour>();
postProcessing.profile = Locator.GetPlayerCamera().gameObject.GetComponent<PostProcessingBehaviour>().profile; postProcessing.profile = Locator.GetPlayerCamera().gameObject.GetComponent<PostProcessingBehaviour>().profile;
} }
Camera.enabled = true; _camera.enabled = true;
Mode = CameraMode.ThirdPerson; Mode = CameraMode.ThirdPerson;
} }
@ -107,7 +110,7 @@ namespace QSB.Instruments.QSBCamera
OWInput.ChangeInputMode(InputMode.Character); OWInput.ChangeInputMode(InputMode.Character);
GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera()); GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera());
Locator.GetActiveCamera().mainCamera.enabled = true; Locator.GetActiveCamera().mainCamera.enabled = true;
Camera.enabled = false; _camera.enabled = false;
Mode = CameraMode.FirstPerson; Mode = CameraMode.FirstPerson;
} }
} }

View File

@ -2,7 +2,7 @@
{ {
public enum CameraMode public enum CameraMode
{ {
FirstPerson, FirstPerson = 0,
ThirdPerson ThirdPerson = 1
} }
} }

View File

@ -1,7 +1,6 @@
using QSB.Messaging; using QuantumUNET;
using QuantumUNET;
namespace QSB.MessagesCore namespace QSB.Messaging
{ {
public class EnumMessage<T> : PlayerMessage public class EnumMessage<T> : PlayerMessage
{ {

View File

@ -1,7 +1,6 @@
using QSB.Messaging; using QuantumUNET;
using QuantumUNET;
namespace QSB.MessagesCore namespace QSB.Messaging
{ {
public class FloatMessage : PlayerMessage public class FloatMessage : PlayerMessage
{ {

View File

@ -1,26 +1,22 @@
using OWML.Common; using QSB.Events;
using QSB.EventsCore;
using QSB.Utility;
using QuantumUNET; using QuantumUNET;
using QuantumUNET.Components;
using QuantumUNET.Messages; using QuantumUNET.Messages;
using System; using System;
using System.Linq; using System.Linq;
using UnityEngine.Networking;
namespace QSB.Messaging namespace QSB.Messaging
{ {
// Extend this to create new message handlers.
public class MessageHandler<T> where T : QSBMessageBase, new() public class MessageHandler<T> where T : QSBMessageBase, new()
{ {
public event Action<T> OnClientReceiveMessage; public event Action<T> OnClientReceiveMessage;
public event Action<T> OnServerReceiveMessage; public event Action<T> OnServerReceiveMessage;
private readonly EventType _eventType; private readonly short _eventType;
public MessageHandler(EventType eventType) public MessageHandler(EventType eventType)
{ {
_eventType = eventType + MsgType.Highest + 1; _eventType = (short)(eventType + QSBMsgType.Highest + 1);
if (QSBNetworkManager.Instance.IsReady) if (QSBNetworkManager.Instance.IsReady)
{ {
Init(); Init();
@ -33,14 +29,13 @@ namespace QSB.Messaging
private void Init() private void Init()
{ {
var eventName = Enum.GetName(typeof(EventType), _eventType - 1 - MsgType.Highest).ToUpper(); if (QSBNetworkServer.handlers.Keys.Contains(_eventType))
if (QSBNetworkServer.handlers.Keys.Contains((short)_eventType))
{ {
DebugLog.ToConsole($"Warning - NetworkServer already contains a handler for EventType {_eventType}", MessageType.Warning); QSBNetworkServer.handlers.Remove(_eventType);
QSBNetworkServer.handlers.Remove((short)_eventType); QSBNetworkManagerUNET.singleton.client.handlers.Remove(_eventType);
} }
QSBNetworkServer.RegisterHandler((short)_eventType, OnServerReceiveMessageHandler); QSBNetworkServer.RegisterHandler(_eventType, OnServerReceiveMessageHandler);
QSBNetworkManager.singleton.client.RegisterHandler((short)_eventType, OnClientReceiveMessageHandler); QSBNetworkManagerUNET.singleton.client.RegisterHandler(_eventType, OnClientReceiveMessageHandler);
} }
public void SendToAll(T message) public void SendToAll(T message)
@ -49,7 +44,7 @@ namespace QSB.Messaging
{ {
return; return;
} }
QSBNetworkServer.SendToAll((short)_eventType, message); QSBNetworkServer.SendToAll(_eventType, message);
} }
public void SendToServer(T message) public void SendToServer(T message)
@ -58,7 +53,7 @@ namespace QSB.Messaging
{ {
return; return;
} }
QSBNetworkManager.singleton.client.Send((short)_eventType, message); QSBNetworkManagerUNET.singleton.client.Send(_eventType, message);
} }
private void OnClientReceiveMessageHandler(QSBNetworkMessage netMsg) private void OnClientReceiveMessageHandler(QSBNetworkMessage netMsg)

View File

@ -7,17 +7,20 @@ namespace QSB.Messaging
{ {
public uint FromId { get; set; } public uint FromId { get; set; }
public uint AboutId { get; set; } public uint AboutId { get; set; }
public bool OnlySendToServer { get; set; }
public override void Deserialize(QSBNetworkReader reader) public override void Deserialize(QSBNetworkReader reader)
{ {
FromId = reader.ReadUInt32(); FromId = reader.ReadUInt32();
AboutId = reader.ReadUInt32(); AboutId = reader.ReadUInt32();
OnlySendToServer = reader.ReadBoolean();
} }
public override void Serialize(QSBNetworkWriter writer) public override void Serialize(QSBNetworkWriter writer)
{ {
writer.Write(FromId); writer.Write(FromId);
writer.Write(AboutId); writer.Write(AboutId);
writer.Write(OnlySendToServer);
} }
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
namespace QSB.OrbSync.Events namespace QSB.OrbSync.Events
@ -8,7 +8,6 @@ namespace QSB.OrbSync.Events
public override EventType Type => EventType.OrbSlot; public override EventType Type => EventType.OrbSlot;
public override void SetupListener() => GlobalMessenger<int, int, bool>.AddListener(EventNames.QSBOrbSlot, Handler); public override void SetupListener() => GlobalMessenger<int, int, bool>.AddListener(EventNames.QSBOrbSlot, Handler);
public override void CloseListener() => GlobalMessenger<int, int, bool>.RemoveListener(EventNames.QSBOrbSlot, Handler); public override void CloseListener() => GlobalMessenger<int, int, bool>.RemoveListener(EventNames.QSBOrbSlot, Handler);
private void Handler(int slotId, int orbId, bool slotState) => SendEvent(CreateMessage(slotId, orbId, slotState)); private void Handler(int slotId, int orbId, bool slotState) => SendEvent(CreateMessage(slotId, orbId, slotState));
@ -21,9 +20,9 @@ namespace QSB.OrbSync.Events
SlotState = slotState SlotState = slotState
}; };
public override void OnReceiveRemote(OrbSlotMessage message) public override void OnReceiveRemote(bool server, OrbSlotMessage message)
{ {
var orbSlot = WorldRegistry.GetObject<QSBOrbSlot>(message.SlotId); var orbSlot = QSBWorldSync.GetWorldObject<QSBOrbSlot>(message.SlotId);
orbSlot?.SetState(message.SlotState, message.OrbId); orbSlot?.SetState(message.SlotState, message.OrbId);
} }
} }

View File

@ -1,5 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.EventsCore; using QSB.Events;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using QSB.WorldSync.Events; using QSB.WorldSync.Events;
@ -14,7 +14,6 @@ namespace QSB.OrbSync.Events
public override EventType Type => EventType.OrbUser; public override EventType Type => EventType.OrbUser;
public override void SetupListener() => GlobalMessenger<int>.AddListener(EventNames.QSBOrbUser, Handler); public override void SetupListener() => GlobalMessenger<int>.AddListener(EventNames.QSBOrbUser, Handler);
public override void CloseListener() => GlobalMessenger<int>.RemoveListener(EventNames.QSBOrbUser, Handler); public override void CloseListener() => GlobalMessenger<int>.RemoveListener(EventNames.QSBOrbUser, Handler);
private void Handler(int id) => SendEvent(CreateMessage(id)); private void Handler(int id) => SendEvent(CreateMessage(id));
@ -25,10 +24,22 @@ namespace QSB.OrbSync.Events
ObjectId = id ObjectId = id
}; };
public override void OnServerReceive(WorldObjectMessage message) public override void OnReceiveRemote(bool server, WorldObjectMessage message)
{
if (server)
{
HandleServer(message);
}
else
{
HandleClient(message);
}
}
private static void HandleServer(WorldObjectMessage message)
{ {
var fromPlayer = QSBNetworkServer.connections.First(x => x.GetPlayer().PlayerId == message.FromId); var fromPlayer = QSBNetworkServer.connections.First(x => x.GetPlayer().PlayerId == message.FromId);
if (WorldRegistry.OrbSyncList.Count == 0) if (QSBWorldSync.OrbSyncList.Count == 0)
{ {
DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error); DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error);
return; return;
@ -37,14 +48,14 @@ namespace QSB.OrbSync.Events
{ {
DebugLog.DebugWrite("Error - FromPlayer is null!", MessageType.Error); DebugLog.DebugWrite("Error - FromPlayer is null!", MessageType.Error);
} }
var orb = WorldRegistry.OrbSyncList var orbSync = QSBWorldSync.OrbSyncList
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]); .First(x => x.AttachedOrb == QSBWorldSync.OldOrbList[message.ObjectId]);
if (orb == null) if (orbSync == null)
{ {
DebugLog.ToConsole($"Error - No orb found for user event. (ID {message.ObjectId})", MessageType.Error); DebugLog.ToConsole($"Error - No orb found for user event. (ID {message.ObjectId})", MessageType.Error);
return; return;
} }
var orbIdentity = orb.GetComponent<QSBNetworkIdentity>(); var orbIdentity = orbSync.GetComponent<QSBNetworkIdentity>();
if (orbIdentity == null) if (orbIdentity == null)
{ {
DebugLog.ToConsole($"Error - Orb identity is null. (ID {message.ObjectId})", MessageType.Error); DebugLog.ToConsole($"Error - Orb identity is null. (ID {message.ObjectId})", MessageType.Error);
@ -55,27 +66,21 @@ namespace QSB.OrbSync.Events
orbIdentity.RemoveClientAuthority(orbIdentity.ClientAuthorityOwner); orbIdentity.RemoveClientAuthority(orbIdentity.ClientAuthorityOwner);
} }
orbIdentity.AssignClientAuthority(fromPlayer); orbIdentity.AssignClientAuthority(fromPlayer);
orb.enabled = true; orbSync.enabled = true;
} }
public override void OnReceiveRemote(WorldObjectMessage message) private static void HandleClient(WorldObjectMessage message)
{ {
if (WorldRegistry.OrbSyncList.Count < message.ObjectId) if (QSBWorldSync.OrbSyncList.Count < message.ObjectId)
{ {
DebugLog.DebugWrite($"Error - Orb id {message.ObjectId} out of range of orb sync list {WorldRegistry.OrbSyncList.Count}.", MessageType.Error); DebugLog.DebugWrite(
$"Error - Orb id {message.ObjectId} out of range of orb sync list {QSBWorldSync.OrbSyncList.Count}.",
MessageType.Error);
return; return;
} }
var orb = WorldRegistry.OrbSyncList var orb = QSBWorldSync.OrbSyncList
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]); .First(x => x.AttachedOrb == QSBWorldSync.OldOrbList[message.ObjectId]);
orb.enabled = true; orb.enabled = true;
} }
public override void OnReceiveLocal(WorldObjectMessage message)
{
if (QSBNetworkServer.active)
{
OnServerReceive(message);
}
}
} }
} }

View File

@ -18,12 +18,11 @@ namespace QSB.OrbSync
private void BuildOrbSlots() private void BuildOrbSlots()
{ {
DebugLog.DebugWrite("Building QSBOrbSlots...", MessageType.Info); QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
WorldRegistry.RemoveObjects<QSBOrbSlot>();
var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>(); var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>();
for (var id = 0; id < orbSlots.Length; id++) for (var id = 0; id < orbSlots.Length; id++)
{ {
var qsbOrbSlot = WorldRegistry.GetObject<QSBOrbSlot>(id) ?? new QSBOrbSlot(); var qsbOrbSlot = QSBWorldSync.GetWorldObject<QSBOrbSlot>(id) ?? new QSBOrbSlot();
qsbOrbSlot.Init(orbSlots[id], id); qsbOrbSlot.Init(orbSlots[id], id);
} }
@ -32,29 +31,18 @@ namespace QSB.OrbSync
public void BuildOrbs() public void BuildOrbs()
{ {
DebugLog.DebugWrite("Building orb syncs...", MessageType.Info); QSBWorldSync.OldOrbList.Clear();
WorldRegistry.OldOrbList.Clear(); QSBWorldSync.OldOrbList = Resources.FindObjectsOfTypeAll<NomaiInterfaceOrb>().ToList();
WorldRegistry.OldOrbList = Resources.FindObjectsOfTypeAll<NomaiInterfaceOrb>().ToList();
if (QSBNetworkServer.active) if (QSBNetworkServer.active)
{ {
DebugLog.DebugWrite("- Is server, instantiating orb prefabs."); QSBWorldSync.OrbSyncList.ForEach(x => QSBNetworkServer.Destroy(x.gameObject));
WorldRegistry.OrbSyncList.ForEach(x => QSBNetworkServer.Destroy(x.gameObject)); QSBWorldSync.OrbSyncList.Clear();
WorldRegistry.OrbSyncList.Clear(); QSBWorldSync.OldOrbList.ForEach(x => QSBNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.OrbPrefab)));
WorldRegistry.OldOrbList.ForEach(x => QSBNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.OrbPrefab)));
} }
DebugLog.DebugWrite($"Finished orb build with {WorldRegistry.OldOrbList.Count} orbs.", MessageType.Success); DebugLog.DebugWrite($"Finished orb build with {QSBWorldSync.OldOrbList.Count} orbs.", MessageType.Success);
} }
public void QueueBuildSlots() public void QueueBuildSlots() => QSBCore.Helper.Events.Unity.RunWhen(() => QSBCore.HasWokenUp, BuildOrbSlots);
{ public void QueueBuildOrbs() => QSBCore.Helper.Events.Unity.RunWhen(() => QSBNetworkServer.active, BuildOrbs);
DebugLog.DebugWrite("Queueing build of QSBOrbSlots...", MessageType.Info);
QSB.Helper.Events.Unity.RunWhen(() => QSB.HasWokenUp, BuildOrbSlots);
}
public void QueueBuildOrbs()
{
DebugLog.DebugWrite("Queueing build of NetworkOrbs...", MessageType.Info);
QSB.Helper.Events.Unity.RunWhen(() => QSBNetworkServer.active, BuildOrbs);
}
} }
} }

View File

@ -1,4 +1,5 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Patches;
using QSB.WorldSync; using QSB.WorldSync;
using UnityEngine; using UnityEngine;
@ -12,7 +13,7 @@ namespace QSB.OrbSync
{ {
if (__result) if (__result)
{ {
GlobalMessenger<int>.FireEvent(EventNames.QSBOrbUser, WorldRegistry.OldOrbList.FindIndex(x => x == __instance)); GlobalMessenger<int>.FireEvent(EventNames.QSBOrbUser, QSBWorldSync.OldOrbList.FindIndex(x => x == __instance));
} }
} }
@ -31,8 +32,8 @@ namespace QSB.OrbSync
____occupyingOrb = orb; ____occupyingOrb = orb;
if (Time.timeSinceLevelLoad > 1f) if (Time.timeSinceLevelLoad > 1f)
{ {
WorldRegistry.HandleSlotStateChange(__instance, orb, true); QSBWorldSync.HandleSlotStateChange(__instance, orb, true);
WorldRegistry.RaiseEvent(__instance, "OnSlotActivated"); QSBWorldSync.RaiseEvent(__instance, "OnSlotActivated");
} }
__result = true; __result = true;
return false; return false;
@ -44,9 +45,9 @@ namespace QSB.OrbSync
} }
if (orbDistance > triggerRadius) if (orbDistance > triggerRadius)
{ {
WorldRegistry.HandleSlotStateChange(__instance, orb, false); QSBWorldSync.HandleSlotStateChange(__instance, orb, false);
____occupyingOrb = null; ____occupyingOrb = null;
WorldRegistry.RaiseEvent(__instance, "OnSlotDeactivated"); QSBWorldSync.RaiseEvent(__instance, "OnSlotDeactivated");
__result = false; __result = false;
return false; return false;
} }
@ -56,8 +57,8 @@ namespace QSB.OrbSync
public override void DoPatches() public override void DoPatches()
{ {
QSB.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(StartDragCallEvent)); QSBCore.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(StartDragCallEvent));
QSB.Helper.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(CheckOrbCollision)); QSBCore.Helper.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(CheckOrbCollision));
} }
} }
} }

View File

@ -1,5 +1,5 @@
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.EventsCore; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
namespace QSB.OrbSync namespace QSB.OrbSync
@ -16,12 +16,12 @@ namespace QSB.OrbSync
ObjectId = id; ObjectId = id;
InterfaceSlot = slot; InterfaceSlot = slot;
_initialized = true; _initialized = true;
WorldRegistry.AddObject(this); QSBWorldSync.AddWorldObject(this);
} }
public void HandleEvent(bool state, int orbId) public void HandleEvent(bool state, int orbId)
{ {
if (QSB.HasWokenUp) if (QSBCore.HasWokenUp)
{ {
GlobalMessenger<int, int, bool>.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state); GlobalMessenger<int, int, bool>.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state);
} }
@ -33,10 +33,10 @@ namespace QSB.OrbSync
{ {
return; return;
} }
var occOrb = state ? WorldRegistry.OldOrbList[orbId] : null; var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null;
InterfaceSlot.SetValue("_occupyingOrb", occOrb); InterfaceSlot.SetValue("_occupyingOrb", occOrb);
var ev = state ? "OnSlotActivated" : "OnSlotDeactivated"; var ev = state ? "OnSlotActivated" : "OnSlotDeactivated";
WorldRegistry.RaiseEvent(InterfaceSlot, ev); QSBWorldSync.RaiseEvent(InterfaceSlot, ev);
Activated = state; Activated = state;
} }
} }

View File

@ -1,9 +1,8 @@
namespace QSB namespace QSB.Patches
{ {
public abstract class QSBPatch public abstract class QSBPatch
{ {
public abstract QSBPatchTypes Type { get; } public abstract QSBPatchTypes Type { get; }
public abstract void DoPatches(); public abstract void DoPatches();
} }
} }

View File

@ -4,7 +4,6 @@ using QSB.DeathSync;
using QSB.ElevatorSync; using QSB.ElevatorSync;
using QSB.OrbSync; using QSB.OrbSync;
using QSB.TimeSync; using QSB.TimeSync;
using QSB.Tools;
using QSB.Utility; using QSB.Utility;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -16,10 +15,10 @@ namespace QSB.Patches
public static class QSBPatchManager public static class QSBPatchManager
{ {
public static List<QSBPatch> _patchList = new List<QSBPatch>();
public static event PatchEvent OnPatchType; public static event PatchEvent OnPatchType;
private static List<QSBPatch> _patchList = new List<QSBPatch>();
public static void Init() public static void Init()
{ {
_patchList = new List<QSBPatch> _patchList = new List<QSBPatch>
@ -28,8 +27,7 @@ namespace QSB.Patches
new DeathPatches(), new DeathPatches(),
new ElevatorPatches(), new ElevatorPatches(),
new OrbPatches(), new OrbPatches(),
new WakeUpPatches(), new WakeUpPatches()
new ProbePatches()
}; };
DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success); DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success);

View File

@ -1,9 +1,9 @@
namespace QSB namespace QSB.Patches
{ {
public enum QSBPatchTypes public enum QSBPatchTypes
{ {
OnModStart, OnModStart = 0,
OnClientConnect, OnClientConnect = 1,
OnNonServerClientConnect OnNonServerClientConnect = 2
} }
} }

View File

@ -1,5 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.EventsCore; using QSB.Events;
using QSB.Utility; using QSB.Utility;
namespace QSB.Player.Events namespace QSB.Player.Events
@ -9,7 +9,6 @@ namespace QSB.Player.Events
public override EventType Type => EventType.PlayerJoin; public override EventType Type => EventType.PlayerJoin;
public override void SetupListener() => GlobalMessenger<string>.AddListener(EventNames.QSBPlayerJoin, Handler); public override void SetupListener() => GlobalMessenger<string>.AddListener(EventNames.QSBPlayerJoin, Handler);
public override void CloseListener() => GlobalMessenger<string>.RemoveListener(EventNames.QSBPlayerJoin, Handler); public override void CloseListener() => GlobalMessenger<string>.RemoveListener(EventNames.QSBPlayerJoin, Handler);
private void Handler(string name) => SendEvent(CreateMessage(name)); private void Handler(string name) => SendEvent(CreateMessage(name));
@ -20,7 +19,7 @@ namespace QSB.Player.Events
PlayerName = name PlayerName = name
}; };
public override void OnReceiveRemote(PlayerJoinMessage message) public override void OnReceiveRemote(bool server, PlayerJoinMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.Name = message.PlayerName; player.Name = message.PlayerName;
@ -28,7 +27,7 @@ namespace QSB.Player.Events
DebugLog.DebugWrite($"{player.Name} joined as id {player.PlayerId}", MessageType.Info); DebugLog.DebugWrite($"{player.Name} joined as id {player.PlayerId}", MessageType.Info);
} }
public override void OnReceiveLocal(PlayerJoinMessage message) public override void OnReceiveLocal(bool server, PlayerJoinMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(QSBPlayerManager.LocalPlayerId); var player = QSBPlayerManager.GetPlayer(QSBPlayerManager.LocalPlayerId);
player.Name = message.PlayerName; player.Name = message.PlayerName;

View File

@ -1,33 +0,0 @@
using OWML.Common;
using QSB.EventsCore;
using QSB.Utility;
using System.Linq;
namespace QSB.Player.Events
{
public class PlayerLeaveEvent : QSBEvent<PlayerLeaveMessage>
{
public override EventType Type => EventType.PlayerLeave;
public override void SetupListener() => GlobalMessenger<uint, uint[]>.AddListener(EventNames.QSBPlayerLeave, Handler);
public override void CloseListener() => GlobalMessenger<uint, uint[]>.RemoveListener(EventNames.QSBPlayerLeave, Handler);
private void Handler(uint playerId, uint[] netIds) => SendEvent(CreateMessage(playerId, netIds));
private PlayerLeaveMessage CreateMessage(uint playerId, uint[] netIds) => new PlayerLeaveMessage
{
AboutId = playerId,
NetIds = netIds
};
public override void OnReceiveRemote(PlayerLeaveMessage message)
{
var playerName = QSBPlayerManager.GetPlayer(message.AboutId).Name;
DebugLog.ToAll($"{playerName} disconnected.", MessageType.Info);
QSBPlayerManager.GetPlayer(message.AboutId).HudMarker?.Remove();
QSBPlayerManager.RemovePlayer(message.AboutId);
message.NetIds.ToList().ForEach(netId => QSBNetworkManager.Instance.CleanupNetworkBehaviour(netId));
}
}
}

View File

@ -1,24 +0,0 @@
using QSB.Messaging;
using QuantumUNET;
using System;
using System.Linq;
namespace QSB.Player.Events
{
public class PlayerLeaveMessage : PlayerMessage
{
public uint[] NetIds { get; set; }
public override void Deserialize(QSBNetworkReader reader)
{
base.Deserialize(reader);
NetIds = reader.ReadString().Split(',').Select(x => Convert.ToUInt32(x)).ToArray();
}
public override void Serialize(QSBNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(string.Join(",", NetIds.Select(x => x.ToString()).ToArray()));
}
}
}

View File

@ -1,5 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.SectorSync; using QSB.SectorSync;
using QSB.Utility; using QSB.Utility;
@ -12,7 +12,6 @@ namespace QSB.Player.Events
public override EventType Type => EventType.PlayerReady; public override EventType Type => EventType.PlayerReady;
public override void SetupListener() => GlobalMessenger<bool>.AddListener(EventNames.QSBPlayerReady, Handler); public override void SetupListener() => GlobalMessenger<bool>.AddListener(EventNames.QSBPlayerReady, Handler);
public override void CloseListener() => GlobalMessenger<bool>.RemoveListener(EventNames.QSBPlayerReady, Handler); public override void CloseListener() => GlobalMessenger<bool>.RemoveListener(EventNames.QSBPlayerReady, Handler);
private void Handler(bool ready) => SendEvent(CreateMessage(ready)); private void Handler(bool ready) => SendEvent(CreateMessage(ready));
@ -23,23 +22,33 @@ namespace QSB.Player.Events
ToggleValue = ready ToggleValue = ready
}; };
public override void OnServerReceive(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
DebugLog.DebugWrite($"[S] Get ready event from {message.FromId}", MessageType.Success); if (server)
if (message.FromId == QSBPlayerManager.LocalPlayerId)
{ {
return; HandleServer(message);
} }
else
{
HandleClient(message);
}
}
private static void HandleServer(ToggleMessage message)
{
DebugLog.DebugWrite($"Get ready event from {message.FromId}", MessageType.Success);
QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue;
GlobalMessenger.FireEvent(EventNames.QSBServerSendPlayerStates); GlobalMessenger.FireEvent(EventNames.QSBServerSendPlayerStates);
} }
public override void OnReceiveRemote(ToggleMessage message) private void HandleClient(ToggleMessage message)
{ {
DebugLog.DebugWrite($"Get ready event from {message.FromId}", MessageType.Success); DebugLog.DebugWrite($"Get ready event from {message.FromId}", MessageType.Success);
if (!QSBPlayerManager.PlayerExists(message.FromId)) if (!QSBPlayerManager.PlayerExists(message.FromId))
{ {
DebugLog.ToConsole("Error - Got ready event for non-existent player! Did we not send a PlayerStatesRequestEvent? Or was it not handled?", MessageType.Error); DebugLog.ToConsole(
"Error - Got ready event for non-existent player! Did we not send a PlayerStatesRequestEvent? Or was it not handled?",
MessageType.Error);
return; return;
} }
foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>() foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>()

View File

@ -1,5 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.EventsCore; using QSB.Events;
using QSB.SectorSync; using QSB.SectorSync;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
@ -11,15 +11,8 @@ namespace QSB.Player.Events
{ {
public override EventType Type => EventType.PlayerSectorChange; public override EventType Type => EventType.PlayerSectorChange;
public override void SetupListener() public override void SetupListener() => GlobalMessenger<uint, QSBSector>.AddListener(EventNames.QSBSectorChange, Handler);
{ public override void CloseListener() => GlobalMessenger<uint, QSBSector>.RemoveListener(EventNames.QSBSectorChange, Handler);
GlobalMessenger<uint, QSBSector>.AddListener(EventNames.QSBSectorChange, Handler);
}
public override void CloseListener()
{
GlobalMessenger<uint, QSBSector>.RemoveListener(EventNames.QSBSectorChange, Handler);
}
private void Handler(uint netId, QSBSector sector) => SendEvent(CreateMessage(netId, sector)); private void Handler(uint netId, QSBSector sector) => SendEvent(CreateMessage(netId, sector));
@ -29,23 +22,23 @@ namespace QSB.Player.Events
ObjectId = sector.ObjectId ObjectId = sector.ObjectId
}; };
public override void OnReceiveRemote(WorldObjectMessage message) public override void OnReceiveRemote(bool server, WorldObjectMessage message)
{ {
if (!QSBSceneManager.IsInUniverse) if (!QSBSceneManager.IsInUniverse)
{ {
return; return;
} }
var sector = WorldRegistry.GetObject<QSBSector>(message.ObjectId); var sector = QSBWorldSync.GetWorldObject<QSBSector>(message.ObjectId);
if (sector == null) if (sector == null)
{ {
DebugLog.ToConsole($"Sector with order id {message.ObjectId} not found!", MessageType.Warning); DebugLog.ToConsole($"Sector with index id {message.ObjectId} not found!", MessageType.Warning);
return; return;
} }
var transformSync = QSBPlayerManager.GetSyncObject<TransformSync.TransformSync>(message.AboutId); var transformSync = QSBPlayerManager.GetSyncObject<TransformSync.TransformSync>(message.AboutId);
QSB.Helper.Events.Unity.RunWhen(() => transformSync?.SyncedTransform != null, QSBCore.Helper.Events.Unity.RunWhen(() => transformSync?.SyncedTransform != null,
() => transformSync?.SetReferenceSector(sector)); () => transformSync?.SetReferenceSector(sector));
} }
} }

View File

@ -8,8 +8,7 @@ namespace QSB.Player.Events
public string PlayerName { get; set; } public string PlayerName { get; set; }
public bool PlayerReady { get; set; } public bool PlayerReady { get; set; }
public State PlayerState { get; set; } public State PlayerState { get; set; }
public Sector.Name SectorID { get; set; }
public string SectorName { get; set; }
public override void Deserialize(QSBNetworkReader reader) public override void Deserialize(QSBNetworkReader reader)
{ {
@ -17,8 +16,6 @@ namespace QSB.Player.Events
PlayerName = reader.ReadString(); PlayerName = reader.ReadString();
PlayerReady = reader.ReadBoolean(); PlayerReady = reader.ReadBoolean();
PlayerState = (State)reader.ReadInt32(); PlayerState = (State)reader.ReadInt32();
SectorID = (Sector.Name)reader.ReadInt32();
SectorName = reader.ReadString();
} }
public override void Serialize(QSBNetworkWriter writer) public override void Serialize(QSBNetworkWriter writer)
@ -27,8 +24,6 @@ namespace QSB.Player.Events
writer.Write(PlayerName); writer.Write(PlayerName);
writer.Write(PlayerReady); writer.Write(PlayerReady);
writer.Write((int)PlayerState); writer.Write((int)PlayerState);
writer.Write((int)SectorID);
writer.Write(SectorName);
} }
} }
} }

View File

@ -1,7 +1,8 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.SectorSync; using QSB.SectorSync;
using QSB.Utility; using QSB.Utility;
using QSB.WorldSync;
using System.Linq; using System.Linq;
namespace QSB.Player.Events namespace QSB.Player.Events
@ -11,25 +12,30 @@ namespace QSB.Player.Events
public override EventType Type => EventType.PlayerStatesRequest; public override EventType Type => EventType.PlayerStatesRequest;
public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerStatesRequest, Handler); public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerStatesRequest, Handler);
public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerStatesRequest, Handler); public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerStatesRequest, Handler);
private void Handler() => SendEvent(CreateMessage()); private void Handler() => SendEvent(CreateMessage());
private PlayerMessage CreateMessage() => new PlayerMessage private PlayerMessage CreateMessage() => new PlayerMessage
{ {
AboutId = LocalPlayerId AboutId = LocalPlayerId,
OnlySendToServer = true
}; };
public override void OnServerReceive(PlayerMessage message) public override void OnReceiveRemote(bool server, PlayerMessage message)
{ {
DebugLog.DebugWrite($"[S] Get state request from {message.FromId}"); DebugLog.DebugWrite($"Get state request from {message.FromId}");
GlobalMessenger.FireEvent(EventNames.QSBServerSendPlayerStates); GlobalMessenger.FireEvent(EventNames.QSBServerSendPlayerStates);
foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>() foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>()
.Where(x => x != null && x.IsReady && x.ReferenceSector != null)) .Where(x => x != null && x.IsReady && x.ReferenceSector != null))
{ {
GlobalMessenger<uint, QSBSector>.FireEvent(EventNames.QSBSectorChange, item.NetId.Value, item.ReferenceSector); GlobalMessenger<uint, QSBSector>.FireEvent(EventNames.QSBSectorChange, item.NetId.Value, item.ReferenceSector);
} }
foreach (var condition in QSBWorldSync.DialogueConditions)
{
GlobalMessenger<string, bool>.FireEvent(EventNames.DialogueCondition, condition.Key, condition.Value);
}
} }
} }
} }

View File

@ -1,5 +1,5 @@
using OWML.Common; using OWML.Common;
using QSB.EventsCore; using QSB.Events;
using QSB.Utility; using QSB.Utility;
namespace QSB.Player.Events namespace QSB.Player.Events
@ -9,7 +9,6 @@ namespace QSB.Player.Events
public override EventType Type => EventType.PlayerState; public override EventType Type => EventType.PlayerState;
public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBServerSendPlayerStates, Handler); public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBServerSendPlayerStates, Handler);
public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBServerSendPlayerStates, Handler); public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBServerSendPlayerStates, Handler);
private void Handler() private void Handler()
@ -29,10 +28,10 @@ namespace QSB.Player.Events
PlayerState = player.State PlayerState = player.State
}; };
public override void OnReceiveRemote(PlayerStateMessage message) public override void OnReceiveRemote(bool server, PlayerStateMessage message)
{ {
DebugLog.DebugWrite($"Received playerstate of player ID {message.AboutId}", MessageType.Info); DebugLog.DebugWrite($"Received playerstate of player ID {message.AboutId}", MessageType.Info);
QSB.Helper.Events.Unity.RunWhen( QSBCore.Helper.Events.Unity.RunWhen(
() => QSBPlayerManager.GetSyncObject<TransformSync.TransformSync>(message.AboutId) != null, () => QSBPlayerManager.GetSyncObject<TransformSync.TransformSync>(message.AboutId) != null,
() => QSBPlayerManager.HandleFullStateMessage(message)); () => QSBPlayerManager.HandleFullStateMessage(message));
} }

View File

@ -16,12 +16,10 @@ namespace QSB.Player
// Body Objects // Body Objects
public GameObject Camera { get; set; } public GameObject Camera { get; set; }
public GameObject Body { get; set; } public GameObject Body { get; set; }
// Tools // Tools
public GameObject ProbeBody { get; set; } public GameObject ProbeBody { get; set; }
public QSBProbe Probe { get; set; } public QSBProbe Probe { get; set; }
public QSBFlashlight FlashLight => Camera?.GetComponentInChildren<QSBFlashlight>(); public QSBFlashlight FlashLight => Camera?.GetComponentInChildren<QSBFlashlight>();
public QSBTool Signalscope => GetToolByType(ToolType.Signalscope); public QSBTool Signalscope => GetToolByType(ToolType.Signalscope);
@ -30,12 +28,10 @@ namespace QSB.Player
// Conversation // Conversation
public int CurrentDialogueID { get; set; } public int CurrentDialogueID { get; set; }
public GameObject CurrentDialogueBox { get; set; } public GameObject CurrentDialogueBox { get; set; }
// Animation // Animation
public AnimationSync AnimationSync => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId); public AnimationSync AnimationSync => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId);
public bool PlayingInstrument => AnimationSync.CurrentType != AnimationType.PlayerSuited public bool PlayingInstrument => AnimationSync.CurrentType != AnimationType.PlayerSuited
&& AnimationSync.CurrentType != AnimationType.PlayerUnsuited; && AnimationSync.CurrentType != AnimationType.PlayerUnsuited;
@ -69,14 +65,12 @@ namespace QSB.Player
Translator?.ChangeEquipState(FlagsHelper.IsSet(State, State.Translator)); Translator?.ChangeEquipState(FlagsHelper.IsSet(State, State.Translator));
ProbeLauncher?.ChangeEquipState(FlagsHelper.IsSet(State, State.ProbeLauncher)); ProbeLauncher?.ChangeEquipState(FlagsHelper.IsSet(State, State.ProbeLauncher));
Signalscope?.ChangeEquipState(FlagsHelper.IsSet(State, State.Signalscope)); Signalscope?.ChangeEquipState(FlagsHelper.IsSet(State, State.Signalscope));
QSB.Helper.Events.Unity.RunWhen(() => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId) != null, QSBCore.Helper.Events.Unity.RunWhen(() => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId) != null,
() => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId).SetSuitState(FlagsHelper.IsSet(State, State.Suit))); () => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId).SetSuitState(FlagsHelper.IsSet(State, State.Suit)));
} }
public bool GetState(State state) public bool GetState(State state)
{ => FlagsHelper.IsSet(State, state);
return FlagsHelper.IsSet(State, state);
}
private QSBTool GetToolByType(ToolType type) private QSBTool GetToolByType(ToolType type)
{ {

View File

@ -1,13 +1,14 @@
using QuantumUNET; using QuantumUNET;
using QuantumUNET.Components;
namespace QSB.Player namespace QSB.Player
{ {
public abstract class PlayerSyncObject : QSBNetworkBehaviour public abstract class PlayerSyncObject : QSBNetworkBehaviour
{ {
public uint AttachedNetId => GetComponent<QSBNetworkIdentity>()?.NetId.Value ?? uint.MaxValue; public uint AttachedNetId => NetIdentity?.NetId.Value ?? uint.MaxValue;
public uint PlayerId => this.GetPlayerOfObject(); public uint PlayerId => NetIdentity.RootIdentity?.NetId.Value ?? NetIdentity.NetId.Value;
public uint PreviousPlayerId { get; set; }
public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId);
protected virtual void Start() => QSBPlayerManager.AddSyncObject(this);
protected virtual void OnDestroy() => QSBPlayerManager.AddSyncObject(this);
} }
} }

View File

@ -2,7 +2,6 @@
using QSB.Player.Events; using QSB.Player.Events;
using QSB.TransformSync; using QSB.TransformSync;
using QSB.Utility; using QSB.Utility;
using QuantumUNET.Components;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -10,11 +9,11 @@ namespace QSB.Player
{ {
public static class QSBPlayerManager public static class QSBPlayerManager
{ {
public static uint LocalPlayerId => PlayerTransformSync.LocalInstance.GetComponent<QSBNetworkIdentity>()?.NetId.Value ?? uint.MaxValue; public static uint LocalPlayerId => PlayerTransformSync.LocalInstance.NetIdentity?.NetId.Value ?? uint.MaxValue;
public static PlayerInfo LocalPlayer => GetPlayer(LocalPlayerId); public static PlayerInfo LocalPlayer => GetPlayer(LocalPlayerId);
public static List<PlayerInfo> PlayerList { get; } = new List<PlayerInfo>(); public static List<PlayerInfo> PlayerList { get; } = new List<PlayerInfo>();
public static List<PlayerSyncObject> PlayerSyncObjects { get; } = new List<PlayerSyncObject>(); private static readonly List<PlayerSyncObject> PlayerSyncObjects = new List<PlayerSyncObject>();
public static PlayerInfo GetPlayer(uint id) public static PlayerInfo GetPlayer(uint id)
{ {
@ -27,7 +26,7 @@ namespace QSB.Player
{ {
return player; return player;
} }
DebugLog.DebugWrite($"Creating player id {id}", MessageType.Info); DebugLog.DebugWrite($"Create Player : id<{id}>", MessageType.Info);
player = new PlayerInfo(id); player = new PlayerInfo(id);
PlayerList.Add(player); PlayerList.Add(player);
return player; return player;
@ -35,20 +34,18 @@ namespace QSB.Player
public static void RemovePlayer(uint id) public static void RemovePlayer(uint id)
{ {
DebugLog.DebugWrite($"Removing player {GetPlayer(id).Name} id {id}", MessageType.Info); DebugLog.DebugWrite($"Remove Player : id<{id}>", MessageType.Info);
PlayerList.Remove(GetPlayer(id)); PlayerList.Remove(GetPlayer(id));
} }
public static void RemoveAllPlayers() public static void RemoveAllPlayers()
{ {
DebugLog.DebugWrite($"Removing all players.", MessageType.Info); DebugLog.DebugWrite($"Remove All Players", MessageType.Info);
PlayerList.Clear(); PlayerList.Clear();
} }
public static bool PlayerExists(uint id) public static bool PlayerExists(uint id) =>
{ id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id);
return id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id);
}
public static void HandleFullStateMessage(PlayerStateMessage message) public static void HandleFullStateMessage(PlayerStateMessage message)
{ {
@ -62,14 +59,22 @@ namespace QSB.Player
} }
} }
public static IEnumerable<T> GetSyncObjects<T>() where T : PlayerSyncObject public static IEnumerable<T> GetSyncObjects<T>() where T : PlayerSyncObject =>
PlayerSyncObjects.OfType<T>().Where(x => x != null);
public static T GetSyncObject<T>(uint id) where T : PlayerSyncObject =>
GetSyncObjects<T>().FirstOrDefault(x => x != null && x.AttachedNetId == id);
public static void AddSyncObject(PlayerSyncObject obj)
{ {
return PlayerSyncObjects.OfType<T>().Where(x => x != null); DebugLog.DebugWrite($"SyncObject Add : type<{obj.GetType().Name}>, netid<{obj.NetId}>");
PlayerSyncObjects.Add(obj);
} }
public static T GetSyncObject<T>(uint id) where T : PlayerSyncObject public static void RemoveSyncObject(PlayerSyncObject obj)
{ {
return GetSyncObjects<T>().FirstOrDefault(x => x != null && x.AttachedNetId == id); DebugLog.DebugWrite($"SyncObject Remove : type<{obj.GetType().Name}>, netid<{obj.NetId}>");
PlayerSyncObjects.Remove(obj);
} }
public static bool IsBelongingToLocalPlayer(uint id) public static bool IsBelongingToLocalPlayer(uint id)
@ -77,73 +82,5 @@ namespace QSB.Player
return id == LocalPlayerId || return id == LocalPlayerId ||
PlayerSyncObjects.Any(x => x != null && x.AttachedNetId == id && x.IsLocalPlayer); PlayerSyncObjects.Any(x => x != null && x.AttachedNetId == id && x.IsLocalPlayer);
} }
public static uint GetPlayerOfObject(this PlayerSyncObject syncObject)
{
if (PlayerList.Count == 0)
{
DebugLog.ToConsole($"Error - No players exist to find owner of object. (Attached NetID : {syncObject.AttachedNetId})", MessageType.Error);
syncObject.PreviousPlayerId = uint.MaxValue;
return uint.MaxValue;
}
// Get all Player IDs
var playerIds = PlayerList.Select(x => x.PlayerId).ToList();
// Get highest ID below the given syncobject's netid. A netid cannot belong to a playerid above it, only below or equal to it.
var lowerBound = playerIds.Where(x => x <= syncObject.AttachedNetId).ToList().Max();
if (playerIds.Min() > syncObject.AttachedNetId)
{
DebugLog.ToConsole($"Warning - Minimum playerid is greater than syncobject's netid. (Attached NetID : {syncObject.AttachedNetId})", MessageType.Warning);
syncObject.PreviousPlayerId = uint.MaxValue;
return uint.MaxValue;
}
// If the player list count is not the same as the count of the same type syncobject (eg. 3 players and 4 PlayerTransformSyncs)
// and the highest ID below the syncobject's id is the same as the highest player id.
if (PlayerList.Count != PlayerSyncObjects.Count(x => x.GetType() == syncObject.GetType()) && lowerBound == playerIds.Max())
{
// If the previous player id was not the error value, return it. To smooth over discrepancies between player list and object list.
if (syncObject.PreviousPlayerId != uint.MaxValue)
{
return syncObject.PreviousPlayerId;
}
// If the syncobject is a PlayerTransformSync, make a player.
if (syncObject.GetType() == typeof(PlayerTransformSync) && syncObject.AttachedNetId != 0U)
{
return GetPlayer(syncObject.AttachedNetId).PlayerId;
}
DebugLog.ToConsole($"Warning - Unequal player:syncobject count. ({PlayerList.Count}:{PlayerSyncObjects.Count(x => x.GetType() == syncObject.GetType())}) (Attached NetID : {syncObject.AttachedNetId})", MessageType.Warning);
syncObject.PreviousPlayerId = uint.MaxValue;
return uint.MaxValue;
}
if (syncObject.PreviousPlayerId == uint.MaxValue)
{
DebugLog.ToConsole($"Warning - Syncobject previously had uint.MaxValue as it's playerid. (Attached NetID : {syncObject.AttachedNetId})", MessageType.Warning);
}
syncObject.PreviousPlayerId = lowerBound;
return lowerBound;
}
public static List<uint> GetPlayerNetIds(PlayerInfo player)
{
if (PlayerSyncObjects.Count == 0)
{
return default;
}
int count = 0;
int totalCount = PlayerSyncObjects.Count;
PlayerSyncObjects.RemoveAll(x => x == null);
PlayerSyncObjects.RemoveAll(x => x.GetComponent<QSBNetworkIdentity>() == null);
if (PlayerSyncObjects.Count != totalCount)
{
DebugLog.ToConsole($"Warning - Removed {totalCount - PlayerSyncObjects.Count} items from PlayerSyncObjects.", MessageType.Warning);
}
foreach (var item in PlayerSyncObjects.DistinctBy(x => x.AttachedNetId))
{
if (item.PlayerId == player.PlayerId)
{
count++;
}
}
return Enumerable.Range((int)player.PlayerId, count).Select(x => (uint)x).ToList();
}
} }
} }

View File

@ -12,6 +12,5 @@ namespace QSB.Player
Signalscope = 8, Signalscope = 8,
Translator = 16, Translator = 16,
ProbeActive = 32 ProbeActive = 32
//Increment these in binary to add more states
} }
} }

View File

@ -1,15 +1,16 @@
using System.Reflection; using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("FriendsInSpace")] [assembly: AssemblyTitle("Quantum Space Buddies")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("Multiplayer mod for Outer Wilds")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("Henry Pointer, Aleksander Waage, Ricardo Lopes")]
[assembly: AssemblyProduct("FriendsInSpace")] [assembly: AssemblyProduct("Quantum Space Buddies")]
[assembly: AssemblyCopyright("Copyright © 2020")] [assembly: AssemblyCopyright("Copyright © Henry Pointer, Aleksander Waage, Ricardo Lopes 2020-2021")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@ -32,4 +33,5 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: NeutralResourcesLanguage("en-GB")]

View File

@ -128,6 +128,8 @@
<Compile Include="Animation\AnimFloatParam.cs" /> <Compile Include="Animation\AnimFloatParam.cs" />
<Compile Include="Animation\CrouchSync.cs" /> <Compile Include="Animation\CrouchSync.cs" />
<Compile Include="Animation\PlayerHeadRotationSync.cs" /> <Compile Include="Animation\PlayerHeadRotationSync.cs" />
<Compile Include="DialogueConditionSync\Events\DialogueConditionEvent.cs" />
<Compile Include="DialogueConditionSync\Events\DialogueConditionMessage.cs" />
<Compile Include="ConversationSync\Events\ConversationEvent.cs" /> <Compile Include="ConversationSync\Events\ConversationEvent.cs" />
<Compile Include="ConversationSync\Events\ConversationMessage.cs" /> <Compile Include="ConversationSync\Events\ConversationMessage.cs" />
<Compile Include="ConversationSync\ConversationPatches.cs" /> <Compile Include="ConversationSync\ConversationPatches.cs" />
@ -140,16 +142,16 @@
<Compile Include="ElevatorSync\Events\ElevatorEvent.cs" /> <Compile Include="ElevatorSync\Events\ElevatorEvent.cs" />
<Compile Include="ElevatorSync\ElevatorManager.cs" /> <Compile Include="ElevatorSync\ElevatorManager.cs" />
<Compile Include="ElevatorSync\ElevatorPatches.cs" /> <Compile Include="ElevatorSync\ElevatorPatches.cs" />
<Compile Include="EventsCore\EventNames.cs" /> <Compile Include="Events\EventNames.cs" />
<Compile Include="DeathSync\Events\PlayerDeathEvent.cs" /> <Compile Include="DeathSync\Events\PlayerDeathEvent.cs" />
<Compile Include="EventsCore\IQSBEvent.cs" /> <Compile Include="Events\IQSBEvent.cs" />
<Compile Include="Animation\Events\ChangeAnimTypeEvent.cs" /> <Compile Include="Animation\Events\ChangeAnimTypeEvent.cs" />
<Compile Include="Instruments\QSBCamera\CameraController.cs" /> <Compile Include="Instruments\QSBCamera\CameraController.cs" />
<Compile Include="Instruments\QSBCamera\CameraManager.cs" /> <Compile Include="Instruments\QSBCamera\CameraManager.cs" />
<Compile Include="Instruments\QSBCamera\CameraMode.cs" /> <Compile Include="Instruments\QSBCamera\CameraMode.cs" />
<Compile Include="Instruments\InstrumentsManager.cs" /> <Compile Include="Instruments\InstrumentsManager.cs" />
<Compile Include="MessagesCore\EnumMessage.cs" /> <Compile Include="Messaging\EnumMessage.cs" />
<Compile Include="MessagesCore\FloatMessage.cs" /> <Compile Include="Messaging\FloatMessage.cs" />
<Compile Include="OrbSync\Events\OrbSlotMessage.cs" /> <Compile Include="OrbSync\Events\OrbSlotMessage.cs" />
<Compile Include="OrbSync\OrbManager.cs" /> <Compile Include="OrbSync\OrbManager.cs" />
<Compile Include="OrbSync\Events\OrbSlotEvent.cs" /> <Compile Include="OrbSync\Events\OrbSlotEvent.cs" />
@ -169,7 +171,6 @@
<Compile Include="TimeSync\WakeUpPatches.cs" /> <Compile Include="TimeSync\WakeUpPatches.cs" />
<Compile Include="Tools\Events\PlayerFlashlightEvent.cs" /> <Compile Include="Tools\Events\PlayerFlashlightEvent.cs" />
<Compile Include="Player\Events\PlayerJoinEvent.cs" /> <Compile Include="Player\Events\PlayerJoinEvent.cs" />
<Compile Include="Player\Events\PlayerLeaveEvent.cs" />
<Compile Include="Tools\Events\PlayerProbeEvent.cs" /> <Compile Include="Tools\Events\PlayerProbeEvent.cs" />
<Compile Include="Player\Events\PlayerReadyEvent.cs" /> <Compile Include="Player\Events\PlayerReadyEvent.cs" />
<Compile Include="TransformSync\NomaiOrbTransformSync.cs" /> <Compile Include="TransformSync\NomaiOrbTransformSync.cs" />
@ -180,13 +181,12 @@
<Compile Include="GeyserSync\Events\GeyserEvent.cs" /> <Compile Include="GeyserSync\Events\GeyserEvent.cs" />
<Compile Include="GeyserSync\GeyserManager.cs" /> <Compile Include="GeyserSync\GeyserManager.cs" />
<Compile Include="GeyserSync\QSBGeyser.cs" /> <Compile Include="GeyserSync\QSBGeyser.cs" />
<Compile Include="Player\Events\PlayerLeaveMessage.cs" />
<Compile Include="Tools\Events\PlayerProbeLauncherEvent.cs" /> <Compile Include="Tools\Events\PlayerProbeLauncherEvent.cs" />
<Compile Include="Tools\Events\PlayerSignalscopeEvent.cs" /> <Compile Include="Tools\Events\PlayerSignalscopeEvent.cs" />
<Compile Include="Tools\Events\PlayerTranslatorEvent.cs" /> <Compile Include="Tools\Events\PlayerTranslatorEvent.cs" />
<Compile Include="EventsCore\QSBEvent.cs" /> <Compile Include="Events\QSBEvent.cs" />
<Compile Include="Player\Events\PlayerJoinMessage.cs" /> <Compile Include="Player\Events\PlayerJoinMessage.cs" />
<Compile Include="MessagesCore\ToggleMessage.cs" /> <Compile Include="Messaging\ToggleMessage.cs" />
<Compile Include="SectorSync\QSBSector.cs" /> <Compile Include="SectorSync\QSBSector.cs" />
<Compile Include="SectorSync\QSBSectorManager.cs" /> <Compile Include="SectorSync\QSBSectorManager.cs" />
<Compile Include="TransformSync\TransformSync.cs" /> <Compile Include="TransformSync\TransformSync.cs" />
@ -201,13 +201,13 @@
<Compile Include="Tools\ToolType.cs" /> <Compile Include="Tools\ToolType.cs" />
<Compile Include="TransformSync\PlayerProbeSync.cs" /> <Compile Include="TransformSync\PlayerProbeSync.cs" />
<Compile Include="Utility\DebugActions.cs" /> <Compile Include="Utility\DebugActions.cs" />
<Compile Include="EventsCore\QSBEventManager.cs" /> <Compile Include="Events\QSBEventManager.cs" />
<Compile Include="Player\Events\PlayerStateMessage.cs" /> <Compile Include="Player\Events\PlayerStateMessage.cs" />
<Compile Include="DeathSync\Necronomicon.cs" /> <Compile Include="DeathSync\Necronomicon.cs" />
<Compile Include="Utility\DebugLog.cs" /> <Compile Include="Utility\DebugLog.cs" />
<Compile Include="MessagesCore\PlayerMessage.cs" /> <Compile Include="Messaging\PlayerMessage.cs" />
<Compile Include="MessagesCore\MessageHandler.cs" /> <Compile Include="Messaging\MessageHandler.cs" />
<Compile Include="EventsCore\EventType.cs" /> <Compile Include="Events\EventType.cs" />
<Compile Include="Player\PlayerInfo.cs" /> <Compile Include="Player\PlayerInfo.cs" />
<Compile Include="Player\State.cs" /> <Compile Include="Player\State.cs" />
<Compile Include="DeathSync\PreventShipDestruction.cs" /> <Compile Include="DeathSync\PreventShipDestruction.cs" />
@ -217,7 +217,6 @@
<Compile Include="Utility\FlagsHelper.cs" /> <Compile Include="Utility\FlagsHelper.cs" />
<Compile Include="Player\PlayerHUDMarker.cs" /> <Compile Include="Player\PlayerHUDMarker.cs" />
<Compile Include="Tools\PlayerToolsManager.cs" /> <Compile Include="Tools\PlayerToolsManager.cs" />
<Compile Include="Tools\ProbePatches.cs" />
<Compile Include="Utility\QuaternionHelper.cs" /> <Compile Include="Utility\QuaternionHelper.cs" />
<Compile Include="TimeSync\PreserveTimeScale.cs" /> <Compile Include="TimeSync\PreserveTimeScale.cs" />
<Compile Include="TransformSync\ShipTransformSync.cs" /> <Compile Include="TransformSync\ShipTransformSync.cs" />
@ -225,10 +224,10 @@
<Compile Include="TimeSync\Events\ServerTimeMessage.cs" /> <Compile Include="TimeSync\Events\ServerTimeMessage.cs" />
<Compile Include="TimeSync\WakeUpSync.cs" /> <Compile Include="TimeSync\WakeUpSync.cs" />
<Compile Include="QSBNetworkManager.cs" /> <Compile Include="QSBNetworkManager.cs" />
<Compile Include="QSB.cs" /> <Compile Include="QSBCore.cs" />
<Compile Include="TransformSync\PlayerTransformSync.cs" /> <Compile Include="TransformSync\PlayerTransformSync.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="WorldSync\WorldRegistry.cs" /> <Compile Include="WorldSync\QSBWorldSync.cs" />
<Compile Include="WorldSync\WorldObject.cs" /> <Compile Include="WorldSync\WorldObject.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -9,13 +9,14 @@ using QSB.Patches;
using QSB.SectorSync; using QSB.SectorSync;
using QSB.TimeSync; using QSB.TimeSync;
using QSB.Utility; using QSB.Utility;
using QuantumUNET;
using QuantumUNET.Components; using QuantumUNET.Components;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
namespace QSB namespace QSB
{ {
public class QSB : ModBehaviour public class QSBCore : ModBehaviour
{ {
public static IModBehaviour ModBehaviour { get; private set; } public static IModBehaviour ModBehaviour { get; private set; }
public static IModHelper Helper { get; private set; } public static IModHelper Helper { get; private set; }
@ -25,8 +26,9 @@ namespace QSB
public static AssetBundle NetworkAssetBundle { get; private set; } public static AssetBundle NetworkAssetBundle { get; private set; }
public static AssetBundle InstrumentAssetBundle { get; private set; } public static AssetBundle InstrumentAssetBundle { get; private set; }
public static bool HasWokenUp { get; set; } public static bool HasWokenUp { get; set; }
public static bool IsServer => QSBNetworkServer.active;
private void Awake() public void Awake()
{ {
Application.runInBackground = true; Application.runInBackground = true;
@ -39,7 +41,7 @@ namespace QSB
LogFilter.currentLogLevel = LogFilter.Debug; LogFilter.currentLogLevel = LogFilter.Debug;
} }
private void Start() public void Start()
{ {
Helper = ModHelper; Helper = ModHelper;
DebugLog.ToConsole($"* Start of QSB version {Helper.Manifest.Version} - authored by {Helper.Manifest.Author}", MessageType.Info); DebugLog.ToConsole($"* Start of QSB version {Helper.Manifest.Version} - authored by {Helper.Manifest.Author}", MessageType.Info);
@ -66,10 +68,8 @@ namespace QSB
Helper.HarmonyHelper.EmptyMethod(typeof(OWTime).GetMethod("Pause")); Helper.HarmonyHelper.EmptyMethod(typeof(OWTime).GetMethod("Pause"));
} }
private void Update() public void Update() =>
{
QSBNetworkIdentity.UNetStaticUpdate(); QSBNetworkIdentity.UNetStaticUpdate();
}
public override void Configure(IModConfig config) public override void Configure(IModConfig config)
{ {

View File

@ -7,15 +7,10 @@ namespace QSB
public class QSBInputManager : MonoBehaviour public class QSBInputManager : MonoBehaviour
{ {
public static event InputEvent ChertTaunt; public static event InputEvent ChertTaunt;
public static event InputEvent EskerTaunt; public static event InputEvent EskerTaunt;
public static event InputEvent RiebeckTaunt; public static event InputEvent RiebeckTaunt;
public static event InputEvent GabbroTaunt; public static event InputEvent GabbroTaunt;
public static event InputEvent FeldsparTaunt; public static event InputEvent FeldsparTaunt;
public static event InputEvent ExitTaunt; public static event InputEvent ExitTaunt;
// TODO : finish instruments - disabled for 0.7.0 release // TODO : finish instruments - disabled for 0.7.0 release

View File

@ -36,11 +36,11 @@ namespace QSB
"Jinha" "Jinha"
}; };
private void Awake() public void Awake()
{ {
PlayerName = GetPlayerName(); PlayerName = GetPlayerName();
CanEditName = true; CanEditName = true;
QSB.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update"); QSBCore.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update");
} }
private string GetPlayerName() private string GetPlayerName()
@ -54,7 +54,7 @@ namespace QSB
: _defaultNames.OrderBy(x => Guid.NewGuid()).First(); : _defaultNames.OrderBy(x => Guid.NewGuid()).First();
} }
private void OnGUI() public void OnGUI()
{ {
GUI.Label(new Rect(10, 10, 200f, 20f), "Name:"); GUI.Label(new Rect(10, 10, 200f, 20f), "Name:");
if (CanEditName) if (CanEditName)

View File

@ -3,7 +3,7 @@ using OWML.ModHelper.Events;
using QSB.Animation; using QSB.Animation;
using QSB.DeathSync; using QSB.DeathSync;
using QSB.ElevatorSync; using QSB.ElevatorSync;
using QSB.EventsCore; using QSB.Events;
using QSB.GeyserSync; using QSB.GeyserSync;
using QSB.Instruments; using QSB.Instruments;
using QSB.OrbSync; using QSB.OrbSync;
@ -25,93 +25,68 @@ namespace QSB
{ {
public class QSBNetworkManager : QSBNetworkManagerUNET public class QSBNetworkManager : QSBNetworkManagerUNET
{ {
private const int MaxConnections = 128;
private const int MaxBufferedPackets = 64;
public static QSBNetworkManager Instance { get; private set; } public static QSBNetworkManager Instance { get; private set; }
public event Action OnNetworkManagerReady; public event Action OnNetworkManagerReady;
public bool IsReady { get; private set; } public bool IsReady { get; private set; }
public GameObject OrbPrefab { get; set; }
private const int MaxConnections = 128;
private const int MaxBufferedPackets = 64;
private QSBNetworkLobby _lobby; private QSBNetworkLobby _lobby;
private AssetBundle _assetBundle; private AssetBundle _assetBundle;
private GameObject _shipPrefab; private GameObject _shipPrefab;
private GameObject _cameraPrefab; private GameObject _cameraPrefab;
private GameObject _probePrefab; private GameObject _probePrefab;
public GameObject OrbPrefab;
private void Awake() public void Awake()
{ {
Instance = this; Instance = this;
_lobby = gameObject.AddComponent<QSBNetworkLobby>(); _lobby = gameObject.AddComponent<QSBNetworkLobby>();
_assetBundle = QSB.NetworkAssetBundle; _assetBundle = QSBCore.NetworkAssetBundle;
playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab"); playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab");
var ident = playerPrefab.AddComponent<QSBNetworkIdentity>(); SetupNetworkId(playerPrefab);
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", playerPrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", playerPrefab.GetComponent<NetworkIdentity>().sceneId);
Destroy(playerPrefab.GetComponent<NetworkTransform>()); Destroy(playerPrefab.GetComponent<NetworkTransform>());
Destroy(playerPrefab.GetComponent<NetworkIdentity>()); Destroy(playerPrefab.GetComponent<NetworkIdentity>());
var transform = playerPrefab.AddComponent<QSBNetworkTransform>(); SetupNetworkTransform(playerPrefab);
transform.SendInterval = 0.1f;
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
playerPrefab.AddComponent<PlayerTransformSync>(); playerPrefab.AddComponent<PlayerTransformSync>();
playerPrefab.AddComponent<AnimationSync>(); playerPrefab.AddComponent<AnimationSync>();
playerPrefab.AddComponent<WakeUpSync>(); playerPrefab.AddComponent<WakeUpSync>();
playerPrefab.AddComponent<InstrumentsManager>(); playerPrefab.AddComponent<InstrumentsManager>();
_shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab"); _shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");
ident = _shipPrefab.AddComponent<QSBNetworkIdentity>(); SetupNetworkId(_shipPrefab);
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", _shipPrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", _shipPrefab.GetComponent<NetworkIdentity>().sceneId);
Destroy(_shipPrefab.GetComponent<NetworkTransform>()); Destroy(_shipPrefab.GetComponent<NetworkTransform>());
Destroy(_shipPrefab.GetComponent<NetworkIdentity>()); Destroy(_shipPrefab.GetComponent<NetworkIdentity>());
transform = _shipPrefab.AddComponent<QSBNetworkTransform>(); SetupNetworkTransform(_shipPrefab);
transform.SendInterval = 0.1f;
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
_shipPrefab.AddComponent<ShipTransformSync>(); _shipPrefab.AddComponent<ShipTransformSync>();
spawnPrefabs.Add(_shipPrefab); spawnPrefabs.Add(_shipPrefab);
_cameraPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkcameraroot.prefab"); _cameraPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkcameraroot.prefab");
ident = _cameraPrefab.AddComponent<QSBNetworkIdentity>(); SetupNetworkId(_cameraPrefab);
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", _cameraPrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", _cameraPrefab.GetComponent<NetworkIdentity>().sceneId);
Destroy(_cameraPrefab.GetComponent<NetworkTransform>()); Destroy(_cameraPrefab.GetComponent<NetworkTransform>());
Destroy(_cameraPrefab.GetComponent<NetworkIdentity>()); Destroy(_cameraPrefab.GetComponent<NetworkIdentity>());
transform = _cameraPrefab.AddComponent<QSBNetworkTransform>(); SetupNetworkTransform(_cameraPrefab);
transform.SendInterval = 0.1f;
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
_cameraPrefab.AddComponent<PlayerCameraSync>(); _cameraPrefab.AddComponent<PlayerCameraSync>();
spawnPrefabs.Add(_cameraPrefab); spawnPrefabs.Add(_cameraPrefab);
_probePrefab = _assetBundle.LoadAsset<GameObject>("assets/networkprobe.prefab"); _probePrefab = _assetBundle.LoadAsset<GameObject>("assets/networkprobe.prefab");
ident = _probePrefab.AddComponent<QSBNetworkIdentity>(); SetupNetworkId(_probePrefab);
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", _probePrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", _probePrefab.GetComponent<NetworkIdentity>().sceneId);
Destroy(_probePrefab.GetComponent<NetworkTransform>()); Destroy(_probePrefab.GetComponent<NetworkTransform>());
Destroy(_probePrefab.GetComponent<NetworkIdentity>()); Destroy(_probePrefab.GetComponent<NetworkIdentity>());
transform = _probePrefab.AddComponent<QSBNetworkTransform>(); SetupNetworkTransform(_probePrefab);
transform.SendInterval = 0.1f;
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
_probePrefab.AddComponent<PlayerProbeSync>(); _probePrefab.AddComponent<PlayerProbeSync>();
spawnPrefabs.Add(_probePrefab); spawnPrefabs.Add(_probePrefab);
OrbPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkorb.prefab"); OrbPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkorb.prefab");
ident = OrbPrefab.AddComponent<QSBNetworkIdentity>(); SetupNetworkId(OrbPrefab);
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", OrbPrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", OrbPrefab.GetComponent<NetworkIdentity>().sceneId);
Destroy(OrbPrefab.GetComponent<NetworkTransform>()); Destroy(OrbPrefab.GetComponent<NetworkTransform>());
Destroy(OrbPrefab.GetComponent<NetworkIdentity>()); Destroy(OrbPrefab.GetComponent<NetworkIdentity>());
transform = OrbPrefab.AddComponent<QSBNetworkTransform>(); SetupNetworkTransform(OrbPrefab);
transform.SendInterval = 0.1f;
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
OrbPrefab.AddComponent<NomaiOrbTransformSync>(); OrbPrefab.AddComponent<NomaiOrbTransformSync>();
spawnPrefabs.Add(OrbPrefab); spawnPrefabs.Add(OrbPrefab);
@ -119,22 +94,36 @@ namespace QSB
QSBSceneManager.OnUniverseSceneLoaded += OnSceneLoaded; QSBSceneManager.OnUniverseSceneLoaded += OnSceneLoaded;
} }
private void OnDestroy() private void SetupNetworkId(GameObject go)
=> QSBSceneManager.OnUniverseSceneLoaded -= OnSceneLoaded; {
var ident = go.AddComponent<QSBNetworkIdentity>();
ident.LocalPlayerAuthority = true;
ident.SetValue("m_AssetId", playerPrefab.GetComponent<NetworkIdentity>().assetId);
ident.SetValue("m_SceneId", playerPrefab.GetComponent<NetworkIdentity>().sceneId);
}
private void SetupNetworkTransform(GameObject go)
{
var trans = go.AddComponent<QSBNetworkTransform>();
trans.SendInterval = 0.1f;
trans.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
}
public void OnDestroy() =>
QSBSceneManager.OnUniverseSceneLoaded -= OnSceneLoaded;
private void OnSceneLoaded(OWScene scene) private void OnSceneLoaded(OWScene scene)
{ {
DebugLog.DebugWrite("scene loaded");
OrbManager.Instance.BuildOrbs(); OrbManager.Instance.BuildOrbs();
OrbManager.Instance.QueueBuildSlots(); OrbManager.Instance.QueueBuildSlots();
WorldRegistry.OldDialogueTrees.Clear(); QSBWorldSync.OldDialogueTrees.Clear();
WorldRegistry.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList(); QSBWorldSync.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList();
} }
private void ConfigureNetworkManager() private void ConfigureNetworkManager()
{ {
networkAddress = QSB.DefaultServerIP; networkAddress = QSBCore.DefaultServerIP;
networkPort = QSB.Port; networkPort = QSBCore.Port;
maxConnections = MaxConnections; maxConnections = MaxConnections;
customConfig = true; customConfig = true;
connectionConfig.AddChannel(QosType.Reliable); connectionConfig.AddChannel(QosType.Reliable);
@ -149,19 +138,19 @@ namespace QSB
public override void OnStartServer() public override void OnStartServer()
{ {
DebugLog.DebugWrite("OnStartServer", MessageType.Info); DebugLog.DebugWrite("OnStartServer", MessageType.Info);
if (WorldRegistry.OrbSyncList.Count == 0 && QSBSceneManager.IsInUniverse) if (QSBWorldSync.OrbSyncList.Count == 0 && QSBSceneManager.IsInUniverse)
{ {
OrbManager.Instance.QueueBuildOrbs(); OrbManager.Instance.QueueBuildOrbs();
} }
if (WorldRegistry.OldDialogueTrees.Count == 0 && QSBSceneManager.IsInUniverse) if (QSBWorldSync.OldDialogueTrees.Count == 0 && QSBSceneManager.IsInUniverse)
{ {
WorldRegistry.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList(); QSBWorldSync.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList();
} }
} }
public override void OnServerAddPlayer(QSBNetworkConnection connection, short playerControllerId) // Called on the server when a client joins public override void OnServerAddPlayer(QSBNetworkConnection connection, short playerControllerId) // Called on the server when a client joins
{ {
DebugLog.DebugWrite("OnServerAddPlayer", MessageType.Info); DebugLog.DebugWrite($"OnServerAddPlayer {playerControllerId}", MessageType.Info);
base.OnServerAddPlayer(connection, playerControllerId); base.OnServerAddPlayer(connection, playerControllerId);
QSBNetworkServer.SpawnWithClientAuthority(Instantiate(_shipPrefab), connection); QSBNetworkServer.SpawnWithClientAuthority(Instantiate(_shipPrefab), connection);
@ -174,6 +163,8 @@ namespace QSB
DebugLog.DebugWrite("OnClientConnect", MessageType.Info); DebugLog.DebugWrite("OnClientConnect", MessageType.Info);
base.OnClientConnect(connection); base.OnClientConnect(connection);
QSBEventManager.Init();
gameObject.AddComponent<SectorSync.SectorSync>(); gameObject.AddComponent<SectorSync.SectorSync>();
gameObject.AddComponent<RespawnOnDeath>(); gameObject.AddComponent<RespawnOnDeath>();
gameObject.AddComponent<PreventShipDestruction>(); gameObject.AddComponent<PreventShipDestruction>();
@ -196,13 +187,14 @@ namespace QSB
OnNetworkManagerReady?.Invoke(); OnNetworkManagerReady?.Invoke();
IsReady = true; IsReady = true;
QSB.Helper.Events.Unity.RunWhen(() => PlayerTransformSync.LocalInstance != null, QSBEventManager.Init); QSBCore.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null,
QSB.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready,
() => GlobalMessenger<string>.FireEvent(EventNames.QSBPlayerJoin, _lobby.PlayerName)); () => GlobalMessenger<string>.FireEvent(EventNames.QSBPlayerJoin, _lobby.PlayerName));
QSB.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready, if (!QSBCore.IsServer)
{
QSBCore.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null,
() => GlobalMessenger.FireEvent(EventNames.QSBPlayerStatesRequest)); () => GlobalMessenger.FireEvent(EventNames.QSBPlayerStatesRequest));
}
} }
public override void OnStopClient() // Called on the client when closing connection public override void OnStopClient() // Called on the client when closing connection
@ -215,30 +207,24 @@ namespace QSB
QSBEventManager.Reset(); QSBEventManager.Reset();
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove()); QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
foreach (var player in QSBPlayerManager.PlayerList)
{
QSBPlayerManager.GetPlayerNetIds(player).ForEach(CleanupNetworkBehaviour);
}
QSBPlayerManager.RemoveAllPlayers(); QSBPlayerManager.RemoveAllPlayers();
WorldRegistry.RemoveObjects<QSBOrbSlot>(); QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
WorldRegistry.RemoveObjects<QSBElevator>(); QSBWorldSync.RemoveWorldObjects<QSBElevator>();
WorldRegistry.RemoveObjects<QSBGeyser>(); QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
WorldRegistry.RemoveObjects<QSBSector>(); QSBWorldSync.RemoveWorldObjects<QSBSector>();
WorldRegistry.OrbSyncList.Clear(); QSBWorldSync.OrbSyncList.Clear();
WorldRegistry.OldDialogueTrees.Clear(); QSBWorldSync.OldDialogueTrees.Clear();
_lobby.CanEditName = true; _lobby.CanEditName = true;
} }
public override void OnServerDisconnect(QSBNetworkConnection connection) // Called on the server when any client disconnects public override void OnServerDisconnect(QSBNetworkConnection connection) // Called on the server when any client disconnects
{ {
base.OnServerDisconnect(connection);
DebugLog.DebugWrite("OnServerDisconnect", MessageType.Info); DebugLog.DebugWrite("OnServerDisconnect", MessageType.Info);
var player = connection.GetPlayer();
var netIds = connection.ClientOwnedObjects.Select(x => x.Value).ToArray();
GlobalMessenger<uint, uint[]>.FireEvent(EventNames.QSBPlayerLeave, player.PlayerId, netIds);
foreach (var item in WorldRegistry.OrbSyncList) foreach (var item in QSBWorldSync.OrbSyncList)
{ {
var identity = item.GetComponent<QSBNetworkIdentity>(); var identity = item.GetComponent<QSBNetworkIdentity>();
if (identity.ClientAuthorityOwner == connection) if (identity.ClientAuthorityOwner == connection)
@ -246,9 +232,6 @@ namespace QSB
identity.RemoveClientAuthority(connection); identity.RemoveClientAuthority(connection);
} }
} }
player.HudMarker?.Remove();
CleanupConnection(connection);
} }
public override void OnStopServer() public override void OnStopServer()
@ -258,63 +241,15 @@ namespace QSB
Destroy(GetComponent<RespawnOnDeath>()); Destroy(GetComponent<RespawnOnDeath>());
Destroy(GetComponent<PreventShipDestruction>()); Destroy(GetComponent<PreventShipDestruction>());
QSBEventManager.Reset(); QSBEventManager.Reset();
DebugLog.ToConsole("[S] Server stopped!", MessageType.Info); DebugLog.ToConsole("Server stopped!", MessageType.Info);
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove()); QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
QSBNetworkServer.connections.ToList().ForEach(CleanupConnection);
WorldRegistry.RemoveObjects<QSBOrbSlot>(); QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
WorldRegistry.RemoveObjects<QSBElevator>(); QSBWorldSync.RemoveWorldObjects<QSBElevator>();
WorldRegistry.RemoveObjects<QSBGeyser>(); QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
WorldRegistry.RemoveObjects<QSBSector>(); QSBWorldSync.RemoveWorldObjects<QSBSector>();
base.OnStopServer(); base.OnStopServer();
} }
private void CleanupConnection(QSBNetworkConnection connection)
{
var player = connection.GetPlayer();
DebugLog.ToConsole($"{player.Name} disconnected.", MessageType.Info);
QSBPlayerManager.RemovePlayer(player.PlayerId);
var netIds = connection.ClientOwnedObjects?.Select(x => x.Value).ToList();
netIds.ForEach(CleanupNetworkBehaviour);
}
public void CleanupNetworkBehaviour(uint netId)
{
DebugLog.DebugWrite($"Cleaning up netId {netId}");
// Multiple networkbehaviours can use the same networkidentity (same netId), so get all of them
var networkBehaviours = FindObjectsOfType<QSBNetworkBehaviour>()
.Where(x => x != null && x.NetId.Value == netId);
foreach (var networkBehaviour in networkBehaviours)
{
var transformSync = networkBehaviour.GetComponent<TransformSync.TransformSync>();
if (transformSync != null)
{
DebugLog.DebugWrite($" * Removing TransformSync from syncobjects");
QSBPlayerManager.PlayerSyncObjects.Remove(transformSync);
if (transformSync.SyncedTransform != null && netId != QSBPlayerManager.LocalPlayerId && !networkBehaviour.HasAuthority)
{
DebugLog.DebugWrite($" * Destroying {transformSync.SyncedTransform.gameObject.name}");
Destroy(transformSync.SyncedTransform.gameObject);
}
}
var animationSync = networkBehaviour.GetComponent<AnimationSync>();
if (animationSync != null)
{
DebugLog.DebugWrite($" * Removing AnimationSync from syncobjects");
QSBPlayerManager.PlayerSyncObjects.Remove(animationSync);
}
if (!networkBehaviour.HasAuthority)
{
DebugLog.DebugWrite($" * Destroying {networkBehaviour.gameObject.name}");
Destroy(networkBehaviour.gameObject);
}
}
}
} }
} }

View File

@ -31,7 +31,7 @@ namespace QSB
} }
} }
private static bool InUniverse(OWScene scene) private static bool InUniverse(OWScene scene) =>
=> scene == OWScene.SolarSystem || scene == OWScene.EyeOfTheUniverse; scene == OWScene.SolarSystem || scene == OWScene.EyeOfTheUniverse;
} }
} }

View File

@ -17,14 +17,14 @@ namespace QSB.SectorSync
Sector.Name.Ship Sector.Name.Ship
}; };
private void Awake() public void Awake()
{ {
Instance = this; Instance = this;
QSBSceneManager.OnUniverseSceneLoaded += (OWScene scene) => RebuildSectors(); QSBSceneManager.OnUniverseSceneLoaded += (OWScene scene) => RebuildSectors();
DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success); DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success);
} }
private void OnDestroy() public void OnDestroy()
{ {
QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => RebuildSectors(); QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => RebuildSectors();
} }
@ -32,20 +32,20 @@ namespace QSB.SectorSync
public void RebuildSectors() public void RebuildSectors()
{ {
DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning); DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning);
WorldRegistry.RemoveObjects<QSBSector>(); QSBWorldSync.RemoveWorldObjects<QSBSector>();
var sectors = Resources.FindObjectsOfTypeAll<Sector>().ToList(); var sectors = Resources.FindObjectsOfTypeAll<Sector>().ToList();
for (var id = 0; id < sectors.Count; id++) for (var id = 0; id < sectors.Count; id++)
{ {
var qsbSector = WorldRegistry.GetObject<QSBSector>(id) ?? new QSBSector(); var qsbSector = QSBWorldSync.GetWorldObject<QSBSector>(id) ?? new QSBSector();
qsbSector.Init(sectors[id], id); qsbSector.Init(sectors[id], id);
WorldRegistry.AddObject(qsbSector); QSBWorldSync.AddWorldObject(qsbSector);
} }
IsReady = WorldRegistry.GetObjects<QSBSector>().Any(); IsReady = QSBWorldSync.GetWorldObjects<QSBSector>().Any();
} }
public QSBSector GetClosestSector(Transform trans) public QSBSector GetClosestSector(Transform trans) // trans rights \o/
{ {
return WorldRegistry.GetObjects<QSBSector>() return QSBWorldSync.GetWorldObjects<QSBSector>()
.Where(sector => sector.Sector != null && !_sectorBlacklist.Contains(sector.Type)) .Where(sector => sector.Sector != null && !_sectorBlacklist.Contains(sector.Type))
.OrderBy(sector => Vector3.Distance(sector.Position, trans.position)) .OrderBy(sector => Vector3.Distance(sector.Position, trans.position))
.First(); .First();

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Player; using QSB.Player;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
@ -21,7 +21,8 @@ namespace QSB.SectorSync
{ {
return; return;
} }
QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>().Where(x => x.HasAuthority).ToList().ForEach(CheckTransformSyncSector); QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>()
.Where(x => x.HasAuthority).ToList().ForEach(CheckTransformSyncSector);
_checkTimer = 0; _checkTimer = 0;
} }
@ -41,9 +42,7 @@ namespace QSB.SectorSync
SendSector(transformSync.NetId.Value, closestSector); SendSector(transformSync.NetId.Value, closestSector);
} }
private void SendSector(uint id, QSBSector sector) private void SendSector(uint id, QSBSector sector) =>
{
GlobalMessenger<uint, QSBSector>.FireEvent(EventNames.QSBSectorChange, id, sector); GlobalMessenger<uint, QSBSector>.FireEvent(EventNames.QSBSectorChange, id, sector);
}
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
namespace QSB.TimeSync.Events namespace QSB.TimeSync.Events
{ {
@ -7,7 +7,6 @@ namespace QSB.TimeSync.Events
public override EventType Type => EventType.ServerTime; public override EventType Type => EventType.ServerTime;
public override void SetupListener() => GlobalMessenger<float, int>.AddListener(EventNames.QSBServerTime, Handler); public override void SetupListener() => GlobalMessenger<float, int>.AddListener(EventNames.QSBServerTime, Handler);
public override void CloseListener() => GlobalMessenger<float, int>.RemoveListener(EventNames.QSBServerTime, Handler); public override void CloseListener() => GlobalMessenger<float, int>.RemoveListener(EventNames.QSBServerTime, Handler);
private void Handler(float time, int count) => SendEvent(CreateMessage(time, count)); private void Handler(float time, int count) => SendEvent(CreateMessage(time, count));
@ -19,9 +18,7 @@ namespace QSB.TimeSync.Events
LoopCount = count LoopCount = count
}; };
public override void OnReceiveRemote(ServerTimeMessage message) public override void OnReceiveRemote(bool server, ServerTimeMessage message) =>
{
WakeUpSync.LocalInstance.OnClientReceiveMessage(message); WakeUpSync.LocalInstance.OnClientReceiveMessage(message);
}
} }
} }

View File

@ -5,9 +5,9 @@ namespace QSB.TimeSync
{ {
public class PreserveTimeScale : QSBNetworkBehaviour public class PreserveTimeScale : QSBNetworkBehaviour
{ {
private void Start() public void Start()
{ {
QSB.Helper.Menus.PauseMenu.GetTitleButton("Button-EndCurrentLoop").Hide(); // Remove the meditation button QSBCore.Helper.Menus.PauseMenu.GetTitleButton("Button-EndCurrentLoop").Hide(); // Remove the meditation button
// Allow server to sleep at campfires // Allow server to sleep at campfires
if (IsServer) if (IsServer)

View File

@ -2,8 +2,8 @@
{ {
public enum TimeSyncType public enum TimeSyncType
{ {
None, None = 0,
Pausing, Pausing = 1,
Fastforwarding Fastforwarding = 2
} }
} }

View File

@ -15,7 +15,7 @@ namespace QSB.TimeSync
private bool _isSetUp; private bool _isSetUp;
private TimeSyncType _currentType; private TimeSyncType _currentType;
private void Awake() public void Awake()
{ {
Instance = this; Instance = this;
enabled = false; enabled = false;
@ -32,7 +32,7 @@ namespace QSB.TimeSync
_canvas.enabled = false; _canvas.enabled = false;
} }
private void OnDestroy() public void OnDestroy()
{ {
QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoad; QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoad;
if (_canvas.enabled) if (_canvas.enabled)
@ -41,9 +41,11 @@ namespace QSB.TimeSync
} }
} }
public static void Start(TimeSyncType type) => QSB.Helper.Events.Unity.RunWhen(() => Instance._isSetUp, () => Instance.StartTimeSync(type)); public static void Start(TimeSyncType type) =>
QSBCore.Helper.Events.Unity.RunWhen(() => Instance._isSetUp, () => Instance.StartTimeSync(type));
public static void Stop() => QSB.Helper.Events.Unity.RunWhen(() => Instance._isSetUp, () => Instance.EndTimeSync()); public static void Stop() =>
QSBCore.Helper.Events.Unity.RunWhen(() => Instance._isSetUp, () => Instance.EndTimeSync());
private void StartTimeSync(TimeSyncType type) private void StartTimeSync(TimeSyncType type)
{ {
@ -75,7 +77,7 @@ namespace QSB.TimeSync
switch (_currentType) switch (_currentType)
{ {
case TimeSyncType.Fastforwarding: case TimeSyncType.Fastforwarding:
text = $"{minutes.ToString("D2")}:{seconds.ToString("D2")}" text = $"{minutes:D2}:{seconds:D2}"
+ Environment.NewLine + Environment.NewLine
+ "Fast-forwarding to match server time..."; + "Fast-forwarding to match server time...";
break; break;

View File

@ -1,4 +1,5 @@
using OWML.ModHelper.Events; using OWML.ModHelper.Events;
using QSB.Patches;
namespace QSB.TimeSync namespace QSB.TimeSync
{ {
@ -17,7 +18,7 @@ namespace QSB.TimeSync
public override void DoPatches() public override void DoPatches()
{ {
QSB.Helper.HarmonyHelper.AddPrefix<PlayerCameraEffectController>("OnStartOfTimeLoop", typeof(WakeUpPatches), nameof(OnStartOfTimeLoopPrefix)); QSBCore.Helper.HarmonyHelper.AddPrefix<PlayerCameraEffectController>("OnStartOfTimeLoop", typeof(WakeUpPatches), nameof(OnStartOfTimeLoopPrefix));
} }
} }
} }

View File

@ -1,5 +1,5 @@
using QSB.DeathSync; using QSB.DeathSync;
using QSB.EventsCore; using QSB.Events;
using QSB.TimeSync.Events; using QSB.TimeSync.Events;
using QuantumUNET; using QuantumUNET;
using UnityEngine; using UnityEngine;
@ -32,7 +32,7 @@ namespace QSB.TimeSync
LocalInstance = this; LocalInstance = this;
} }
private void Start() public void Start()
{ {
if (!IsLocalPlayer) if (!IsLocalPlayer)
{ {
@ -53,11 +53,11 @@ namespace QSB.TimeSync
{ {
if (QSBNetworkServer.active) if (QSBNetworkServer.active)
{ {
QSB.HasWokenUp = true; QSBCore.HasWokenUp = true;
} }
} }
private void OnDestroy() public void OnDestroy()
{ {
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
GlobalMessenger.RemoveListener(EventNames.RestartTimeLoop, OnLoopStart); GlobalMessenger.RemoveListener(EventNames.RestartTimeLoop, OnLoopStart);
@ -66,7 +66,7 @@ namespace QSB.TimeSync
private void OnSceneLoaded(OWScene scene, bool isInUniverse) private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{ {
QSB.HasWokenUp = (scene == OWScene.EyeOfTheUniverse); QSBCore.HasWokenUp = (scene == OWScene.EyeOfTheUniverse);
if (isInUniverse) if (isInUniverse)
{ {
Init(); Init();
@ -164,7 +164,7 @@ namespace QSB.TimeSync
EnableInput(); EnableInput();
} }
_isFirstFastForward = false; _isFirstFastForward = false;
QSB.HasWokenUp = true; QSBCore.HasWokenUp = true;
Physics.SyncTransforms(); Physics.SyncTransforms();
SpinnerUI.Hide(); SpinnerUI.Hide();
TimeSyncUI.Stop(); TimeSyncUI.Stop();
@ -184,7 +184,7 @@ namespace QSB.TimeSync
OWInput.ChangeInputMode(InputMode.Character); OWInput.ChangeInputMode(InputMode.Character);
} }
private void Update() public void Update()
{ {
if (IsServer) if (IsServer)
{ {

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
} }
private void HandleTurnOn() => SendEvent(CreateMessage(true)); private void HandleTurnOn() => SendEvent(CreateMessage(true));
private void HandleTurnOff() => SendEvent(CreateMessage(false)); private void HandleTurnOff() => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.UpdateState(State.Flashlight, message.ToggleValue); player.UpdateState(State.Flashlight, message.ToggleValue);
player.FlashLight?.UpdateState(message.ToggleValue); player.FlashLight?.UpdateState(message.ToggleValue);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message) =>
{
QSBPlayerManager.LocalPlayer.UpdateState(State.Flashlight, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.Flashlight, message.ToggleValue);
}
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
} }
private void HandleLaunch(SurveyorProbe probe) => SendEvent(CreateMessage(true)); private void HandleLaunch(SurveyorProbe probe) => SendEvent(CreateMessage(true));
private void HandleRetrieve(SurveyorProbe probe) => SendEvent(CreateMessage(false)); private void HandleRetrieve(SurveyorProbe probe) => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.UpdateState(State.ProbeActive, message.ToggleValue); player.UpdateState(State.ProbeActive, message.ToggleValue);
player.Probe?.SetState(message.ToggleValue); player.Probe?.SetState(message.ToggleValue);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message) =>
{
QSBPlayerManager.LocalPlayer.UpdateState(State.ProbeActive, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.ProbeActive, message.ToggleValue);
}
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
} }
private void HandleEquip(ProbeLauncher var) => SendEvent(CreateMessage(true)); private void HandleEquip(ProbeLauncher var) => SendEvent(CreateMessage(true));
private void HandleUnequip(ProbeLauncher var) => SendEvent(CreateMessage(false)); private void HandleUnequip(ProbeLauncher var) => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.UpdateState(State.ProbeLauncher, message.ToggleValue); player.UpdateState(State.ProbeLauncher, message.ToggleValue);
player.ProbeLauncher?.ChangeEquipState(message.ToggleValue); player.ProbeLauncher?.ChangeEquipState(message.ToggleValue);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message) =>
{
QSBPlayerManager.LocalPlayer.UpdateState(State.ProbeLauncher, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.ProbeLauncher, message.ToggleValue);
}
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
} }
private void HandleEquip(Signalscope var) => SendEvent(CreateMessage(true)); private void HandleEquip(Signalscope var) => SendEvent(CreateMessage(true));
private void HandleUnequip() => SendEvent(CreateMessage(false)); private void HandleUnequip() => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.UpdateState(State.Signalscope, message.ToggleValue); player.UpdateState(State.Signalscope, message.ToggleValue);
player.Signalscope?.ChangeEquipState(message.ToggleValue); player.Signalscope?.ChangeEquipState(message.ToggleValue);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message) =>
{
QSBPlayerManager.LocalPlayer.UpdateState(State.Signalscope, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.Signalscope, message.ToggleValue);
}
} }
} }

View File

@ -1,4 +1,4 @@
using QSB.EventsCore; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.Player; using QSB.Player;
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
} }
private void HandleEquip() => SendEvent(CreateMessage(true)); private void HandleEquip() => SendEvent(CreateMessage(true));
private void HandleUnequip() => SendEvent(CreateMessage(false)); private void HandleUnequip() => SendEvent(CreateMessage(false));
private ToggleMessage CreateMessage(bool value) => new ToggleMessage private ToggleMessage CreateMessage(bool value) => new ToggleMessage
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
ToggleValue = value ToggleValue = value
}; };
public override void OnReceiveRemote(ToggleMessage message) public override void OnReceiveRemote(bool server, ToggleMessage message)
{ {
var player = QSBPlayerManager.GetPlayer(message.AboutId); var player = QSBPlayerManager.GetPlayer(message.AboutId);
player.UpdateState(State.Translator, message.ToggleValue); player.UpdateState(State.Translator, message.ToggleValue);
player.Translator?.ChangeEquipState(message.ToggleValue); player.Translator?.ChangeEquipState(message.ToggleValue);
} }
public override void OnReceiveLocal(ToggleMessage message) public override void OnReceiveLocal(bool server, ToggleMessage message) =>
{
QSBPlayerManager.LocalPlayer.UpdateState(State.Translator, message.ToggleValue); QSBPlayerManager.LocalPlayer.UpdateState(State.Translator, message.ToggleValue);
}
} }
} }

View File

@ -59,7 +59,7 @@ namespace QSB.Tools
hold.transform.localRotation = Quaternion.Euler(0f, 0f, 0f); hold.transform.localRotation = Quaternion.Euler(0f, 0f, 0f);
} }
private static GameObject CreateFlashlight(Transform cameraBody) private static void CreateFlashlight(Transform cameraBody)
{ {
var flashlightRoot = Object.Instantiate(GameObject.Find("FlashlightRoot")); var flashlightRoot = Object.Instantiate(GameObject.Find("FlashlightRoot"));
flashlightRoot.SetActive(false); flashlightRoot.SetActive(false);
@ -72,11 +72,9 @@ namespace QSB.Tools
flashlightRoot.transform.parent = cameraBody; flashlightRoot.transform.parent = cameraBody;
flashlightRoot.transform.localPosition = FlashlightOffset; flashlightRoot.transform.localPosition = FlashlightOffset;
flashlightRoot.SetActive(true); flashlightRoot.SetActive(true);
return flashlightRoot;
} }
private static GameObject CreateSignalscope(Transform cameraBody) private static void CreateSignalscope(Transform cameraBody)
{ {
var signalscopeRoot = Object.Instantiate(GameObject.Find("Signalscope")); var signalscopeRoot = Object.Instantiate(GameObject.Find("Signalscope"));
signalscopeRoot.SetActive(false); signalscopeRoot.SetActive(false);
@ -101,11 +99,9 @@ namespace QSB.Tools
signalscopeRoot.transform.localPosition = Vector3.zero; signalscopeRoot.transform.localPosition = Vector3.zero;
signalscopeRoot.transform.localScale = SignalscopeScale; signalscopeRoot.transform.localScale = SignalscopeScale;
signalscopeRoot.SetActive(true); signalscopeRoot.SetActive(true);
return signalscopeRoot;
} }
private static GameObject CreateTranslator(Transform cameraBody) private static void CreateTranslator(Transform cameraBody)
{ {
var original = GameObject.Find("NomaiTranslatorProp"); var original = GameObject.Find("NomaiTranslatorProp");
@ -141,12 +137,10 @@ namespace QSB.Tools
translatorRoot.transform.parent = cameraBody; translatorRoot.transform.parent = cameraBody;
translatorRoot.transform.localPosition = Vector3.zero; translatorRoot.transform.localPosition = Vector3.zero;
translatorRoot.transform.localScale = TranslatorScale; translatorRoot.transform.localScale = TranslatorScale;
QSB.Helper.Events.Unity.FireOnNextUpdate(() => translatorRoot.SetActive(true)); QSBCore.Helper.Events.Unity.FireOnNextUpdate(() => translatorRoot.SetActive(true));
return translatorRoot;
} }
private static GameObject CreateProbeLauncher(Transform cameraBody) private static void CreateProbeLauncher(Transform cameraBody)
{ {
var launcherRoot = new GameObject("ProbeLauncher"); var launcherRoot = new GameObject("ProbeLauncher");
var modelOrig = GameObject.Find("PlayerCamera/ProbeLauncher/Props_HEA_ProbeLauncher"); var modelOrig = GameObject.Find("PlayerCamera/ProbeLauncher/Props_HEA_ProbeLauncher");
@ -182,13 +176,9 @@ namespace QSB.Tools
launcherRoot.transform.parent = cameraBody; launcherRoot.transform.parent = cameraBody;
launcherRoot.transform.localPosition = ProbeLauncherOffset; launcherRoot.transform.localPosition = ProbeLauncherOffset;
launcherRoot.SetActive(true); launcherRoot.SetActive(true);
return launcherRoot;
} }
private static MeshRenderer GetRenderer(GameObject root, string gameObjectName) private static MeshRenderer GetRenderer(GameObject root, string gameObjectName) =>
{ root.GetComponentsInChildren<MeshRenderer>(true).First(x => x.name == gameObjectName);
return root.GetComponentsInChildren<MeshRenderer>(true).First(x => x.name == gameObjectName);
}
} }
} }

View File

@ -1,29 +0,0 @@
using QSB.EventsCore;
namespace QSB.Tools
{
public class ProbePatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnModStart;
private static void ProbeAnchor()
{
GlobalMessenger.FireEvent(EventNames.QSBOnProbeAnchor);
}
private static bool ProbeWarp(ref bool ____isRetrieving)
{
if (!____isRetrieving)
{
GlobalMessenger.FireEvent(EventNames.QSBOnProbeWarp);
}
return true;
}
public override void DoPatches()
{
QSB.Helper.HarmonyHelper.AddPostfix<SurveyorProbe>("OnAnchor", typeof(ProbePatches), nameof(ProbeAnchor));
QSB.Helper.HarmonyHelper.AddPrefix<SurveyorProbe>("Retrieve", typeof(ProbePatches), nameof(ProbeWarp));
}
}
}

View File

@ -14,7 +14,7 @@ namespace QSB.Tools
private Vector3 _baseForward; private Vector3 _baseForward;
private Quaternion _baseRotation; private Quaternion _baseRotation;
private void Start() public void Start()
{ {
_baseForward = _basePivot.forward; _baseForward = _basePivot.forward;
_baseRotation = _basePivot.rotation; _baseRotation = _basePivot.rotation;
@ -78,9 +78,9 @@ namespace QSB.Tools
_flashlightOn = false; _flashlightOn = false;
} }
private void FixedUpdate() public void FixedUpdate()
{ {
// This really isn't needed... but it makes it look that extra bit nicer. // This really isn't needed... but it makes it look that extra bit nicer. ^_^
var lhs = Quaternion.FromToRotation(_basePivot.up, _root.up) * Quaternion.FromToRotation(_baseForward, _root.forward); var lhs = Quaternion.FromToRotation(_basePivot.up, _root.up) * Quaternion.FromToRotation(_baseForward, _root.forward);
var b = lhs * _baseRotation; var b = lhs * _baseRotation;
_baseRotation = Quaternion.Slerp(_baseRotation, b, 6f * Time.deltaTime); _baseRotation = Quaternion.Slerp(_baseRotation, b, 6f * Time.deltaTime);

View File

@ -9,22 +9,10 @@ namespace QSB.Tools
{ {
if (state) if (state)
{ {
Activate(); gameObject.SetActive(true);
gameObject.Show();
return;
} }
else
{
Deactivate();
}
}
private void Activate()
{
gameObject.SetActive(true);
gameObject.Show();
}
private void Deactivate()
{
gameObject.Hide(); gameObject.Hide();
} }
} }

View File

@ -31,26 +31,17 @@ namespace QSB.Tools
set => _arrivalDegrees = value; set => _arrivalDegrees = value;
} }
private void OnEnable() public void OnEnable() => ToolGameObject?.SetActive(true);
{ public void OnDisable() => ToolGameObject?.SetActive(false);
ToolGameObject?.SetActive(true);
}
private void OnDisable()
{
ToolGameObject?.SetActive(false);
}
public void ChangeEquipState(bool equipState) public void ChangeEquipState(bool equipState)
{ {
if (equipState) if (equipState)
{ {
EquipTool(); EquipTool();
return;
} }
else UnequipTool();
{
UnequipTool();
}
} }
} }
} }

View File

@ -2,8 +2,8 @@
{ {
public enum ToolType public enum ToolType
{ {
Signalscope, Signalscope = 0,
ProbeLauncher, ProbeLauncher = 1,
Translator Translator = 2
} }
} }

View File

@ -9,7 +9,7 @@ namespace QSB.TransformSync
public NomaiInterfaceOrb AttachedOrb { get; private set; } public NomaiInterfaceOrb AttachedOrb { get; private set; }
public Transform OrbTransform { get; private set; } public Transform OrbTransform { get; private set; }
private int Index => WorldRegistry.OrbSyncList.IndexOf(this); private int Index => QSBWorldSync.OrbSyncList.IndexOf(this);
private bool _isInitialized; private bool _isInitialized;
private bool _isReady; private bool _isReady;
@ -18,20 +18,20 @@ namespace QSB.TransformSync
public override void OnStartClient() public override void OnStartClient()
{ {
DontDestroyOnLoad(this); DontDestroyOnLoad(this);
WorldRegistry.OrbSyncList.Add(this); QSBWorldSync.OrbSyncList.Add(this);
QSB.Helper.Events.Unity.RunWhen(() => QSB.HasWokenUp, () => QSB.Helper.Events.Unity.FireOnNextUpdate(OnReady)); QSBCore.Helper.Events.Unity.RunWhen(() => QSBCore.HasWokenUp, () => QSBCore.Helper.Events.Unity.FireOnNextUpdate(OnReady));
} }
private void OnReady() private void OnReady()
{ {
AttachedOrb = WorldRegistry.OldOrbList[Index]; AttachedOrb = QSBWorldSync.OldOrbList[Index];
_isReady = true; _isReady = true;
} }
private void OnDestroy() public void OnDestroy()
{ {
WorldRegistry.OrbSyncList.Remove(this); QSBWorldSync.OrbSyncList.Remove(this);
} }
protected void Init() protected void Init()
@ -41,7 +41,7 @@ namespace QSB.TransformSync
_isInitialized = true; _isInitialized = true;
} }
private void Update() public void Update()
{ {
if (!_isInitialized && _isReady) if (!_isInitialized && _isReady)
{ {

View File

@ -1,5 +1,4 @@
using OWML.Common; using QSB.Events;
using QSB.EventsCore;
using QSB.Player; using QSB.Player;
using QSB.Tools; using QSB.Tools;
using QSB.Utility; using QSB.Utility;
@ -9,14 +8,6 @@ namespace QSB.TransformSync
{ {
public class PlayerCameraSync : TransformSync public class PlayerCameraSync : TransformSync
{ {
public static PlayerCameraSync LocalInstance { get; private set; }
public override void OnStartLocalPlayer()
{
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
LocalInstance = this;
}
protected override Transform InitLocalTransform() protected override Transform InitLocalTransform()
{ {
var body = Locator.GetPlayerCamera().gameObject.transform; var body = Locator.GetPlayerCamera().gameObject.transform;

View File

@ -8,20 +8,10 @@ namespace QSB.TransformSync
{ {
public class PlayerProbeSync : TransformSync public class PlayerProbeSync : TransformSync
{ {
public static PlayerProbeSync LocalInstance { get; private set; }
private Transform _disabledSocket; private Transform _disabledSocket;
public override void OnStartLocalPlayer() private Transform GetProbe() =>
{ Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry");
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
LocalInstance = this;
}
private Transform GetProbe()
{
return Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry");
}
protected override Transform InitLocalTransform() protected override Transform InitLocalTransform()
{ {
@ -50,16 +40,13 @@ namespace QSB.TransformSync
PlayerToolsManager.CreateProbe(body, Player); PlayerToolsManager.CreateProbe(body, Player);
QSB.Helper.Events.Unity.RunWhen(() => (Player.ProbeLauncher != null), () => SetSocket(Player.ProbeLauncher.ToolGameObject.transform)); QSBCore.Helper.Events.Unity.RunWhen(() => (Player.ProbeLauncher != null), () => SetSocket(Player.ProbeLauncher.ToolGameObject.transform));
Player.ProbeBody = body.gameObject; Player.ProbeBody = body.gameObject;
return body; return body;
} }
private void SetSocket(Transform socket) private void SetSocket(Transform socket) => _disabledSocket = socket;
{
_disabledSocket = socket;
}
protected override void UpdateTransform() protected override void UpdateTransform()
{ {

View File

@ -1,8 +1,6 @@
using OWML.Common; using QSB.Animation;
using QSB.Animation;
using QSB.Instruments; using QSB.Instruments;
using QSB.Player; using QSB.Player;
using QSB.Utility;
using UnityEngine; using UnityEngine;
namespace QSB.TransformSync namespace QSB.TransformSync
@ -11,22 +9,20 @@ namespace QSB.TransformSync
{ {
public static PlayerTransformSync LocalInstance { get; private set; } public static PlayerTransformSync LocalInstance { get; private set; }
static PlayerTransformSync() static PlayerTransformSync() => AnimControllerPatch.Init();
{
DebugLog.DebugWrite("Constructor", MessageType.Info);
AnimControllerPatch.Init();
}
public override void OnStartLocalPlayer() public override void OnStartLocalPlayer() =>
{
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
LocalInstance = this; LocalInstance = this;
protected override void OnDestroy()
{
base.OnDestroy();
Player.HudMarker?.Remove();
QSBPlayerManager.RemovePlayer(PlayerId);
} }
private Transform GetPlayerModel() private Transform GetPlayerModel() =>
{ Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");
return Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");
}
protected override Transform InitLocalTransform() protected override Transform InitLocalTransform()
{ {

View File

@ -1,29 +1,14 @@
using OWML.Common; using QSB.Player;
using QSB.Player;
using QSB.Utility;
using UnityEngine; using UnityEngine;
namespace QSB.TransformSync namespace QSB.TransformSync
{ {
public class ShipTransformSync : TransformSync public class ShipTransformSync : TransformSync
{ {
public static ShipTransformSync LocalInstance { get; private set; } private Transform GetShipModel() => Locator.GetShipTransform();
public override void OnStartLocalPlayer() protected override Transform InitLocalTransform() =>
{ GetShipModel().Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior");
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
LocalInstance = this;
}
private Transform GetShipModel()
{
return Locator.GetShipTransform();
}
protected override Transform InitLocalTransform()
{
return GetShipModel().Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior");
}
protected override Transform InitRemoteTransform() protected override Transform InitRemoteTransform()
{ {

View File

@ -2,6 +2,7 @@
using QSB.Player; using QSB.Player;
using QSB.SectorSync; using QSB.SectorSync;
using QSB.Utility; using QSB.Utility;
using System.Linq;
using UnityEngine; using UnityEngine;
namespace QSB.TransformSync namespace QSB.TransformSync
@ -11,7 +12,6 @@ namespace QSB.TransformSync
public abstract bool IsReady { get; } public abstract bool IsReady { get; }
protected abstract Transform InitLocalTransform(); protected abstract Transform InitLocalTransform();
protected abstract Transform InitRemoteTransform(); protected abstract Transform InitRemoteTransform();
public Transform SyncedTransform { get; private set; } public Transform SyncedTransform { get; private set; }
@ -23,33 +23,38 @@ namespace QSB.TransformSync
private Quaternion _rotationSmoothVelocity; private Quaternion _rotationSmoothVelocity;
private bool _isVisible; private bool _isVisible;
protected virtual void Awake() protected override void Start()
{ {
DebugLog.DebugWrite($"Awake of {GetType().Name}", MessageType.Info); base.Start();
QSBPlayerManager.PlayerSyncObjects.Add(this); var lowestBound = QSBPlayerManager.GetSyncObjects<PlayerTransformSync>().Where(x => x.NetId.Value <= NetId.Value).OrderBy(x => x.NetId.Value).Last();
NetIdentity.SetRootIdentity(lowestBound.NetIdentity);
DontDestroyOnLoad(gameObject); DontDestroyOnLoad(gameObject);
QSBSceneManager.OnSceneLoaded += OnSceneLoaded; QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
} }
protected virtual void OnDestroy() protected override void OnDestroy()
{ {
base.OnDestroy();
if (!HasAuthority && SyncedTransform != null)
{
Destroy(SyncedTransform.gameObject);
}
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
} }
private void OnSceneLoaded(OWScene scene, bool isInUniverse) private void OnSceneLoaded(OWScene scene, bool isInUniverse) =>
{
_isInitialized = false; _isInitialized = false;
}
protected void Init() protected void Init()
{ {
DebugLog.DebugWrite($"Init of {AttachedNetId} ({Player.PlayerId}.{GetType().Name})");
SyncedTransform = HasAuthority ? InitLocalTransform() : InitRemoteTransform(); SyncedTransform = HasAuthority ? InitLocalTransform() : InitRemoteTransform();
SetReferenceSector(QSBSectorManager.Instance.GetClosestSector(SyncedTransform));
_isInitialized = true; _isInitialized = true;
_isVisible = true; _isVisible = true;
} }
private void Update() public void Update()
{ {
if (!_isInitialized && IsReady) if (!_isInitialized && IsReady)
{ {

View File

@ -24,9 +24,9 @@ namespace QSB.Utility
bridgeVolume.AddObjectToVolume(Locator.GetPlayerCameraDetector()); bridgeVolume.AddObjectToVolume(Locator.GetPlayerCameraDetector());
} }
private void Update() public void Update()
{ {
if (!QSB.DebugMode) if (!QSBCore.DebugMode)
{ {
return; return;
} }
@ -40,7 +40,7 @@ namespace QSB.Utility
} }
if (Input.GetKeyDown(KeyCode.Keypad3)) if (Input.GetKeyDown(KeyCode.Keypad3))
{ {
LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToWhite, 1f, true); LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToWhite);
} }
} }
} }

View File

@ -11,7 +11,7 @@ namespace QSB.Utility
{ {
// make custom method name in owml log. // make custom method name in owml log.
// i wrote the owml code for this so this is fine?? shut up i dont want to change owml // i wrote the owml code for this so this is fine?? shut up i dont want to change owml
var console = (ModSocketOutput)QSB.Helper.Console; var console = (ModSocketOutput)QSBCore.Helper.Console;
var method = console.GetType() var method = console.GetType()
.GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) .GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
.Last(x => x.Name == "WriteLine"); .Last(x => x.Name == "WriteLine");
@ -37,7 +37,7 @@ namespace QSB.Utility
public static void DebugWrite(string message, MessageType type = MessageType.Message) public static void DebugWrite(string message, MessageType type = MessageType.Message)
{ {
if (QSB.DebugMode) if (QSBCore.DebugMode)
{ {
ToConsole(message, type); ToConsole(message, type);
} }

View File

@ -25,9 +25,7 @@ namespace QSB.Utility
return copy; return copy;
} }
public static Transform InstantiateInactive(this Transform original) public static Transform InstantiateInactive(this Transform original) =>
{ original.gameObject.InstantiateInactive().transform;
return original.gameObject.InstantiateInactive().transform;
}
} }
} }

View File

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
namespace QSB.Utility
{
public static class ListExtensions
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
var seenKeys = new HashSet<TKey>();
foreach (var element in source)
{
if (seenKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}
}

View File

@ -0,0 +1,85 @@
using OWML.Common;
using QSB.OrbSync;
using QSB.TransformSync;
using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace QSB.WorldSync
{
public static class QSBWorldSync
{
public static List<NomaiOrbTransformSync> OrbSyncList { get; } = new List<NomaiOrbTransformSync>();
public static List<NomaiInterfaceOrb> OldOrbList { get; set; } = new List<NomaiInterfaceOrb>();
public static List<CharacterDialogueTree> OldDialogueTrees { get; set; } = new List<CharacterDialogueTree>();
public static Dictionary<string, bool> DialogueConditions { get; } = new Dictionary<string, bool>();
private static readonly List<WorldObject> WorldObjects = new List<WorldObject>();
public static void AddWorldObject(WorldObject worldObject)
{
if (WorldObjects.Contains(worldObject))
{
return;
}
WorldObjects.Add(worldObject);
}
public static IEnumerable<T> GetWorldObjects<T>()
{
return WorldObjects.OfType<T>();
}
public static T GetWorldObject<T>(int id) where T : WorldObject
{
return GetWorldObjects<T>().FirstOrDefault(x => x.ObjectId == id);
}
public static void RemoveWorldObjects<T>() where T : WorldObject
{
WorldObjects.RemoveAll(x => x.GetType() == typeof(T));
}
public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state)
{
var slotList = GetWorldObjects<QSBOrbSlot>().ToList();
if (!slotList.Any())
{
return;
}
var qsbSlot = slotList.First(x => x.InterfaceSlot == slot);
var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb);
if (orbSync.HasAuthority)
{
qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb));
}
}
public static void RaiseEvent(object instance, string eventName)
{
if (!(instance.GetType()
.GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic)?
.GetValue(instance) is MulticastDelegate multiDelegate))
{
return;
}
var delegateList = multiDelegate.GetInvocationList().ToList();
foreach (var del in delegateList)
{
del.DynamicInvoke(instance);
}
}
public static void SetDialogueCondition(string name, bool state)
{
if (!QSBCore.IsServer)
{
DebugLog.DebugWrite("Warning - Cannot write to condition dict when not server!", MessageType.Warning);
return;
}
DialogueConditions[name] = state;
}
}
}

View File

@ -1,86 +0,0 @@
using OWML.Common;
using QSB.OrbSync;
using QSB.TransformSync;
using QSB.Utility;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace QSB.WorldSync
{
public static class WorldRegistry
{
private static readonly List<WorldObject> WorldObjects = new List<WorldObject>();
public static List<NomaiOrbTransformSync> OrbSyncList = new List<NomaiOrbTransformSync>();
public static List<NomaiInterfaceOrb> OldOrbList = new List<NomaiInterfaceOrb>();
public static List<CharacterDialogueTree> OldDialogueTrees = new List<CharacterDialogueTree>();
public static void AddObject(WorldObject worldObject)
{
if (WorldObjects.Contains(worldObject))
{
return;
}
WorldObjects.Add(worldObject);
}
public static IEnumerable<T> GetObjects<T>()
{
return WorldObjects.OfType<T>();
}
public static T GetObject<T>(int id) where T : WorldObject
{
return GetObjects<T>().FirstOrDefault(x => x.ObjectId == id);
}
public static void RemoveObjects<T>() where T : WorldObject
{
WorldObjects.RemoveAll(x => x.GetType() == typeof(T));
}
public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state)
{
QSBOrbSlot qsbSlot = null;
NomaiOrbTransformSync orbSync = null;
var slotList = GetObjects<QSBOrbSlot>();
if (slotList.Count() == 0)
{
return;
}
try
{
qsbSlot = slotList.First(x => x.InterfaceSlot == slot);
orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb);
if (orbSync.HasAuthority)
{
qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb));
}
}
catch
{
DebugLog.DebugWrite("Error - Exception when handling slot state change."
+ Environment.NewLine + $"Slot name {slot.name} to {state}"
+ Environment.NewLine + $"SlotList count : {slotList?.Count()}"
+ Environment.NewLine + $"QSBOrbSlot null? : {qsbSlot == null}"
+ Environment.NewLine + $"NomaiOrbTransformSync null? : {orbSync == null}", MessageType.Error);
}
}
public static void RaiseEvent(object instance, string eventName)
{
if (!(instance.GetType()
.GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic)?
.GetValue(instance) is MulticastDelegate multiDelegate))
{
return;
}
var delegateList = multiDelegate.GetInvocationList().ToList();
foreach (var del in delegateList)
{
del.DynamicInvoke(instance);
}
}
}
}

View File

@ -21,6 +21,8 @@ namespace QuantumUNET.Components
public short PlayerControllerId { get; private set; } = -1; public short PlayerControllerId { get; private set; } = -1;
public QSBNetworkConnection ConnectionToServer { get; private set; } public QSBNetworkConnection ConnectionToServer { get; private set; }
public QSBNetworkConnection ConnectionToClient { get; private set; } public QSBNetworkConnection ConnectionToClient { get; private set; }
public QSBNetworkIdentity RootIdentity { get; private set; }
public List<QSBNetworkIdentity> SubIdentities { get; private set; } = new List<QSBNetworkIdentity>();
public bool ServerOnly public bool ServerOnly
{ {
@ -46,6 +48,22 @@ namespace QuantumUNET.Components
} }
} }
public void SetRootIdentity(QSBNetworkIdentity newRoot)
{
if (RootIdentity != null)
{
RootIdentity.RemoveSubIdentity(this);
}
RootIdentity = newRoot;
RootIdentity.AddSubIndentity(this);
}
internal void AddSubIndentity(QSBNetworkIdentity identityToAdd)
=> SubIdentities.Add(identityToAdd);
internal void RemoveSubIdentity(QSBNetworkIdentity identityToRemove)
=> SubIdentities.Remove(identityToRemove);
internal void SetDynamicAssetId(NetworkHash128 newAssetId) internal void SetDynamicAssetId(NetworkHash128 newAssetId)
{ {
if (!m_AssetId.IsValid() || m_AssetId.Equals(newAssetId)) if (!m_AssetId.IsValid() || m_AssetId.Equals(newAssetId))
@ -961,11 +979,13 @@ namespace QuantumUNET.Components
private bool m_LocalPlayerAuthority; private bool m_LocalPlayerAuthority;
private bool m_IsServer; private bool m_IsServer;
private QSBNetworkBehaviour[] m_NetworkBehaviours; private QSBNetworkBehaviour[] m_NetworkBehaviours;
private HashSet<int> m_ObserverConnections; private HashSet<int> m_ObserverConnections;
private List<QSBNetworkConnection> m_Observers; private List<QSBNetworkConnection> m_Observers;
private bool m_Reset = false; private bool m_Reset = false;
private static uint s_NextNetworkId = 1U; private static uint s_NextNetworkId = 1U;

Some files were not shown because too many files have changed in this diff Show More