mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-04 12:39:52 +00:00
Merge pull request #224 from misternebula/condition-syncing
Condition syncing + rc/dc rewrite + playerid assignment rewrite
This commit is contained in:
commit
eb9a6ced96
@ -9,8 +9,8 @@ namespace QSB.Animation
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
QSB.Helper.Events.Subscribe<PlayerAnimController>(OWML.Common.Events.BeforeStart);
|
||||
QSB.Helper.Events.Event += OnEvent;
|
||||
QSBCore.Helper.Events.Subscribe<PlayerAnimController>(OWML.Common.Events.BeforeStart);
|
||||
QSBCore.Helper.Events.Event += OnEvent;
|
||||
}
|
||||
|
||||
private static void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
|
||||
|
@ -1,6 +1,6 @@
|
||||
using OWML.Common;
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using QuantumUNET.Components;
|
||||
@ -29,26 +29,21 @@ namespace QSB.Animation
|
||||
private RuntimeAnimatorController _riebeckController;
|
||||
|
||||
public AnimatorMirror Mirror { get; private set; }
|
||||
public AnimationType CurrentType;
|
||||
public AnimationType CurrentType { get; set; }
|
||||
|
||||
public Animator Animator
|
||||
{
|
||||
get { return _bodyAnim; }
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
protected void Awake()
|
||||
{
|
||||
_anim = gameObject.AddComponent<Animator>();
|
||||
_netAnim = gameObject.AddComponent<QSBNetworkAnimator>();
|
||||
_netAnim.enabled = false;
|
||||
_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)
|
||||
{
|
||||
return;
|
||||
@ -57,12 +52,14 @@ namespace QSB.Animation
|
||||
_playerController.OnBecomeGrounded -= OnBecomeGrounded;
|
||||
_playerController.OnBecomeUngrounded -= OnBecomeUngrounded;
|
||||
|
||||
QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => LoadControllers();
|
||||
QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoaded;
|
||||
}
|
||||
|
||||
private void OnUniverseSceneLoaded(OWScene obj) => LoadControllers();
|
||||
|
||||
private void LoadControllers()
|
||||
{
|
||||
var bundle = QSB.InstrumentAssetBundle;
|
||||
var bundle = QSBCore.InstrumentAssetBundle;
|
||||
_chertController = bundle.LoadAsset("assets/Chert/Traveller_Chert.controller") as RuntimeAnimatorController;
|
||||
_riebeckController = bundle.LoadAsset("assets/Riebeck/Traveller_Riebeck.controller") as RuntimeAnimatorController;
|
||||
}
|
||||
@ -85,8 +82,6 @@ namespace QSB.Animation
|
||||
Mirror.Init(_anim, _bodyAnim);
|
||||
}
|
||||
|
||||
QSBPlayerManager.PlayerSyncObjects.Add(this);
|
||||
|
||||
for (var i = 0; i < _anim.parameterCount; i++)
|
||||
{
|
||||
_netAnim.SetParameterAutoSend(i, true);
|
||||
@ -135,7 +130,7 @@ namespace QSB.Animation
|
||||
InitCrouchSync();
|
||||
|
||||
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()
|
||||
|
@ -2,12 +2,12 @@
|
||||
{
|
||||
public enum AnimationType
|
||||
{
|
||||
Chert,
|
||||
Esker,
|
||||
Feldspar,
|
||||
Gabbro,
|
||||
PlayerSuited,
|
||||
PlayerUnsuited,
|
||||
Riebeck
|
||||
Chert = 0,
|
||||
Esker = 1,
|
||||
Feldspar = 2,
|
||||
Gabbro = 3,
|
||||
PlayerSuited = 4,
|
||||
PlayerUnsuited = 5,
|
||||
Riebeck = 6
|
||||
}
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
using OWML.Common;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -36,12 +35,7 @@ namespace QSB.Animation
|
||||
}
|
||||
}
|
||||
|
||||
private PlayerInfo GetPlayer()
|
||||
{
|
||||
return QSBPlayerManager.GetSyncObjects<AnimationSync>().First(x => x.Mirror == this).Player;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (_to == null || _from == null)
|
||||
{
|
||||
|
@ -27,7 +27,7 @@ namespace QSB.Animation
|
||||
_bodyAnim = bodyAnim;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (IsLocalPlayer)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Instruments;
|
||||
using QSB.MessagesCore;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
namespace QSB.Animation.Events
|
||||
@ -10,7 +10,6 @@ namespace QSB.Animation.Events
|
||||
public override EventType Type => EventType.PlayInstrument;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<uint, AnimationType>.AddListener(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));
|
||||
@ -21,7 +20,7 @@ namespace QSB.Animation.Events
|
||||
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.GetSyncObject<InstrumentsManager>(message.AboutId).CheckInstrumentProps(message.Value);
|
||||
|
@ -1,5 +1,5 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.MessagesCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
namespace QSB.Animation.Events
|
||||
@ -9,7 +9,6 @@ namespace QSB.Animation.Events
|
||||
public override EventType Type => EventType.AnimTrigger;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<float>.AddListener(EventNames.QSBCrouch, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger<float>.RemoveListener(EventNames.QSBCrouch, Handler);
|
||||
|
||||
private void Handler(float value) => SendEvent(CreateMessage(value));
|
||||
@ -20,14 +19,10 @@ namespace QSB.Animation.Events
|
||||
Value = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(FloatMessage message)
|
||||
public override void OnReceiveRemote(bool server, FloatMessage message)
|
||||
{
|
||||
var animationSync = QSBPlayerManager.GetSyncObject<AnimationSync>(message.AboutId);
|
||||
if (animationSync == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
animationSync.HandleCrouch(message.Value);
|
||||
animationSync?.HandleCrouch(message.Value);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
namespace QSB.Animation
|
||||
namespace QSB.Animation.Events
|
||||
{
|
||||
public class PlayerSuitEvent : QSBEvent<ToggleMessage>
|
||||
{
|
||||
@ -21,7 +21,6 @@ namespace QSB.Animation
|
||||
}
|
||||
|
||||
private void HandleSuitUp() => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleSuitDown() => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,12 +29,12 @@ namespace QSB.Animation
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player?.UpdateState(State.Suit, message.ToggleValue);
|
||||
|
||||
if (!QSB.HasWokenUp)
|
||||
if (!QSBCore.HasWokenUp)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -45,7 +44,7 @@ namespace QSB.Animation
|
||||
animator.SetAnimationType(type);
|
||||
}
|
||||
|
||||
public override void OnReceiveLocal(ToggleMessage message)
|
||||
public override void OnReceiveLocal(bool server, ToggleMessage message)
|
||||
{
|
||||
QSBPlayerManager.LocalPlayer.UpdateState(State.Suit, message.ToggleValue);
|
||||
var animator = QSBPlayerManager.LocalPlayer.AnimationSync;
|
||||
|
@ -1,6 +1,6 @@
|
||||
using OWML.Common;
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
@ -15,43 +15,38 @@ namespace QSB.ConversationSync
|
||||
{
|
||||
public static ConversationManager Instance { get; private set; }
|
||||
public AssetBundle ConversationAssetBundle { get; private set; }
|
||||
private GameObject BoxPrefab;
|
||||
public Dictionary<CharacterDialogueTree, GameObject> BoxMappings = new Dictionary<CharacterDialogueTree, GameObject>();
|
||||
public Dictionary<CharacterDialogueTree, GameObject> BoxMappings { get; } = new Dictionary<CharacterDialogueTree, GameObject>();
|
||||
|
||||
private void Start()
|
||||
private GameObject _boxPrefab;
|
||||
|
||||
public void Start()
|
||||
{
|
||||
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!
|
||||
var font = (Font)Resources.Load(@"fonts\english - latin\spacemono-bold");
|
||||
if (font == null)
|
||||
{
|
||||
DebugLog.ToConsole("Error - Font is null!", MessageType.Error);
|
||||
}
|
||||
BoxPrefab.GetComponent<Text>().font = font;
|
||||
BoxPrefab.GetComponent<Text>().color = Color.white;
|
||||
_boxPrefab.GetComponent<Text>().font = font;
|
||||
_boxPrefab.GetComponent<Text>().color = Color.white;
|
||||
}
|
||||
|
||||
public uint GetPlayerTalkingToTree(CharacterDialogueTree tree)
|
||||
{
|
||||
var treeIndex = WorldRegistry.OldDialogueTrees.IndexOf(tree);
|
||||
if (!QSBPlayerManager.PlayerList.Any(x => x.CurrentDialogueID == treeIndex))
|
||||
{
|
||||
// No player talking to tree
|
||||
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;
|
||||
var treeIndex = QSBWorldSync.OldDialogueTrees.IndexOf(tree);
|
||||
return QSBPlayerManager.PlayerList.All(x => x.CurrentDialogueID != treeIndex)
|
||||
? uint.MaxValue
|
||||
: QSBPlayerManager.PlayerList.First(x => x.CurrentDialogueID == treeIndex).PlayerId;
|
||||
}
|
||||
|
||||
public void SendPlayerOption(string text)
|
||||
{
|
||||
public void SendPlayerOption(string text) =>
|
||||
GlobalMessenger<uint, string, ConversationType>
|
||||
.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, text, ConversationType.Player);
|
||||
}
|
||||
|
||||
public void SendCharacterDialogue(int id, string text)
|
||||
{
|
||||
@ -64,17 +59,13 @@ namespace QSB.ConversationSync
|
||||
.FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character);
|
||||
}
|
||||
|
||||
public void CloseBoxPlayer()
|
||||
{
|
||||
public void CloseBoxPlayer() =>
|
||||
GlobalMessenger<uint, string, ConversationType>
|
||||
.FireEvent(EventNames.QSBConversation, QSBPlayerManager.LocalPlayerId, "", ConversationType.ClosePlayer);
|
||||
}
|
||||
|
||||
public void CloseBoxCharacter(int id)
|
||||
{
|
||||
public void CloseBoxCharacter(int id) =>
|
||||
GlobalMessenger<uint, string, ConversationType>
|
||||
.FireEvent(EventNames.QSBConversation, (uint)id, "", ConversationType.CloseCharacter);
|
||||
}
|
||||
|
||||
public void SendConvState(int charId, bool state)
|
||||
{
|
||||
@ -109,14 +100,14 @@ namespace QSB.ConversationSync
|
||||
|
||||
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);
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove old box if it exists
|
||||
var oldDialogueTree = WorldRegistry.OldDialogueTrees[index];
|
||||
var oldDialogueTree = QSBWorldSync.OldDialogueTrees[index];
|
||||
if (BoxMappings.ContainsKey(oldDialogueTree))
|
||||
{
|
||||
Destroy(BoxMappings[oldDialogueTree]);
|
||||
@ -128,7 +119,7 @@ namespace QSB.ConversationSync
|
||||
|
||||
private GameObject CreateBox(Transform parent, float vertOffset, string text)
|
||||
{
|
||||
var newBox = Instantiate(BoxPrefab);
|
||||
var newBox = Instantiate(_boxPrefab);
|
||||
newBox.SetActive(false);
|
||||
newBox.transform.parent = parent;
|
||||
newBox.transform.localPosition = new Vector3(0, vertOffset, 0);
|
||||
|
@ -1,4 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.Patches;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
@ -13,7 +14,7 @@ namespace QSB.ConversationSync
|
||||
|
||||
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)
|
||||
{
|
||||
DebugLog.ToConsole($"Warning - Index for tree {__instance.name} was -1.", MessageType.Warning);
|
||||
@ -58,7 +59,7 @@ namespace QSB.ConversationSync
|
||||
{
|
||||
var key = ____name + ____listPagesToDisplay[____currentPage];
|
||||
// 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));
|
||||
}
|
||||
|
||||
@ -73,17 +74,12 @@ namespace QSB.ConversationSync
|
||||
CharacterDialogueTree ____dialogueTree)
|
||||
{
|
||||
var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree);
|
||||
Vector3 position;
|
||||
if (playerId == uint.MaxValue)
|
||||
{
|
||||
// TODO : Find closest player and track to that camera.
|
||||
position = Locator.GetActiveCamera().transform.position;
|
||||
}
|
||||
else
|
||||
{
|
||||
position = QSBPlayerManager.GetPlayer(playerId).Camera.transform.position;
|
||||
}
|
||||
float b = ___headTrackingWeight * Mathf.Min(1, (!___lookOnlyWhenTalking) ? ((!____playerInHeadZone) ? 0 : 1) : ((!____inConversation || !____playerInHeadZone) ? 0 : 1));
|
||||
var position = playerId == uint.MaxValue
|
||||
? Locator.GetActiveCamera().transform.position
|
||||
: QSBPlayerManager.GetPlayer(playerId).Camera.transform.position;
|
||||
var b = ___headTrackingWeight * Mathf.Min(1, !___lookOnlyWhenTalking
|
||||
? !____playerInHeadZone ? 0 : 1
|
||||
: !____inConversation || !____playerInHeadZone ? 0 : 1);
|
||||
____currentLookWeight = Mathf.Lerp(____currentLookWeight, b, Time.deltaTime * 2f);
|
||||
____currentLookTarget = ___lookSpring.Update(____currentLookTarget, position, Time.deltaTime);
|
||||
____animator.SetLookAtPosition(____currentLookTarget);
|
||||
@ -94,21 +90,17 @@ namespace QSB.ConversationSync
|
||||
public static bool OnZoneExit(CharacterDialogueTree ____dialogueTree)
|
||||
{
|
||||
var playerId = ConversationManager.Instance.GetPlayerTalkingToTree(____dialogueTree);
|
||||
if (playerId == uint.MaxValue)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return playerId == uint.MaxValue;
|
||||
}
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<DialogueNode>("GetNextPage", typeof(ConversationPatches), nameof(GetNextPage));
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("InputDialogueOption", typeof(ConversationPatches), nameof(InputDialogueOption));
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<CharacterDialogueTree>("StartConversation", typeof(ConversationPatches), nameof(StartConversation));
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(ConversationPatches), nameof(EndConversation));
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnAnimatorIK", typeof(ConversationPatches), nameof(OnAnimatorIK));
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneExit", typeof(ConversationPatches), nameof(OnZoneExit));
|
||||
QSBCore.Helper.HarmonyHelper.AddPostfix<DialogueNode>("GetNextPage", typeof(ConversationPatches), nameof(GetNextPage));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("InputDialogueOption", typeof(ConversationPatches), nameof(InputDialogueOption));
|
||||
QSBCore.Helper.HarmonyHelper.AddPostfix<CharacterDialogueTree>("StartConversation", typeof(ConversationPatches), nameof(StartConversation));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterDialogueTree>("EndConversation", typeof(ConversationPatches), nameof(EndConversation));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnAnimatorIK", typeof(ConversationPatches), nameof(OnAnimatorIK));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<CharacterAnimController>("OnZoneExit", typeof(ConversationPatches), nameof(OnZoneExit));
|
||||
}
|
||||
}
|
||||
}
|
@ -2,9 +2,9 @@
|
||||
{
|
||||
public enum ConversationType
|
||||
{
|
||||
Character,
|
||||
Player,
|
||||
CloseCharacter,
|
||||
ClosePlayer
|
||||
Character = 0,
|
||||
Player = 1,
|
||||
CloseCharacter = 2,
|
||||
ClosePlayer = 3
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.WorldSync;
|
||||
|
||||
@ -9,7 +9,6 @@ namespace QSB.ConversationSync.Events
|
||||
public override EventType Type => EventType.Conversation;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<uint, string, ConversationType>.AddListener(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));
|
||||
@ -22,7 +21,7 @@ namespace QSB.ConversationSync.Events
|
||||
Message = message
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ConversationMessage message)
|
||||
public override void OnReceiveRemote(bool server, ConversationMessage message)
|
||||
{
|
||||
switch (message.Type)
|
||||
{
|
||||
@ -40,7 +39,7 @@ namespace QSB.ConversationSync.Events
|
||||
{
|
||||
break;
|
||||
}
|
||||
var tree = WorldRegistry.OldDialogueTrees[message.ObjectId];
|
||||
var tree = QSBWorldSync.OldDialogueTrees[message.ObjectId];
|
||||
UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]);
|
||||
break;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
using OWML.Common;
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
@ -11,10 +11,9 @@ namespace QSB.ConversationSync.Events
|
||||
{
|
||||
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 CloseListener() => GlobalMessenger<int, uint, bool>.RemoveListener(EventNames.QSBConversationStartEnd, Handler);
|
||||
|
||||
private void Handler(int charId, uint playerId, bool state) => SendEvent(CreateMessage(charId, playerId, state));
|
||||
@ -27,43 +26,44 @@ namespace QSB.ConversationSync.Events
|
||||
State = state
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ConversationStartEndMessage message)
|
||||
public override void OnReceiveRemote(bool server, ConversationStartEndMessage message)
|
||||
{
|
||||
if (message.CharacterId == -1)
|
||||
{
|
||||
DebugLog.ToConsole("Warning - Received conv. start/end event with char id -1.", MessageType.Warning);
|
||||
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);
|
||||
|
||||
// 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
|
||||
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();
|
||||
animController.GetValue<Animator>("_animator").SetTrigger("Talking");
|
||||
}
|
||||
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
|
||||
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();
|
||||
animController.GetValue<Animator>("_animator").SetTrigger("Idle");
|
||||
}
|
||||
dialogueTree.GetComponent<InteractVolume>().EnableInteraction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Patches;
|
||||
using System.Linq;
|
||||
|
||||
namespace QSB.DeathSync
|
||||
@ -26,8 +27,8 @@ namespace QSB.DeathSync
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(PreFinishDeathSequence));
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(BroadcastDeath));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(PreFinishDeathSequence));
|
||||
QSBCore.Helper.HarmonyHelper.AddPostfix<DeathManager>("KillPlayer", typeof(DeathPatches), nameof(BroadcastDeath));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.MessagesCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
|
||||
@ -10,7 +10,6 @@ namespace QSB.DeathSync.Events
|
||||
public override EventType Type => EventType.PlayerDeath;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<DeathType>.AddListener(EventNames.QSBPlayerDeath, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger<DeathType>.RemoveListener(EventNames.QSBPlayerDeath, Handler);
|
||||
|
||||
private void Handler(DeathType type) => SendEvent(CreateMessage(type));
|
||||
@ -21,13 +20,11 @@ namespace QSB.DeathSync.Events
|
||||
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 deathMessage = Necronomicon.GetPhrase(message.Value);
|
||||
DebugLog.ToAll(string.Format(deathMessage, playerName));
|
||||
}
|
||||
|
||||
public override void OnReceiveLocal(EnumMessage<DeathType> message) => OnReceiveRemote(message);
|
||||
}
|
||||
}
|
@ -95,9 +95,7 @@ namespace QSB.DeathSync
|
||||
} }
|
||||
};
|
||||
|
||||
public static string GetPhrase(DeathType deathType)
|
||||
{
|
||||
return DeathDictionary[deathType].OrderBy(x => Guid.NewGuid()).First();
|
||||
}
|
||||
public static string GetPhrase(DeathType deathType) =>
|
||||
DeathDictionary[deathType].OrderBy(x => Guid.NewGuid()).First();
|
||||
}
|
||||
}
|
@ -8,15 +8,15 @@ namespace QSB.DeathSync
|
||||
{
|
||||
public class PreventShipDestruction : MonoBehaviour
|
||||
{
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
QSB.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<ShipDetachableLeg>("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);
|
||||
QSB.Helper.Events.Event += OnEvent;
|
||||
QSBCore.Helper.Events.Subscribe<ShipDamageController>(OWML.Common.Events.AfterAwake);
|
||||
QSBCore.Helper.Events.Event += OnEvent;
|
||||
}
|
||||
|
||||
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
|
||||
|
@ -1,15 +1,12 @@
|
||||
using OWML.Common;
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Utility;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.DeathSync
|
||||
{
|
||||
/// <summary>
|
||||
/// Client-only-side component for managing respawning after death.
|
||||
/// </summary>
|
||||
public class RespawnOnDeath : MonoBehaviour
|
||||
{
|
||||
public static RespawnOnDeath Instance;
|
||||
@ -31,12 +28,12 @@ namespace QSB.DeathSync
|
||||
private ShipCockpitController _cockpitController;
|
||||
private PlayerSpacesuit _spaceSuit;
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
|
||||
QSB.Helper.Events.Subscribe<PlayerResources>(OWML.Common.Events.AfterStart);
|
||||
QSB.Helper.Events.Event += OnEvent;
|
||||
QSBCore.Helper.Events.Subscribe<PlayerResources>(OWML.Common.Events.AfterStart);
|
||||
QSBCore.Helper.Events.Event += OnEvent;
|
||||
}
|
||||
|
||||
private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev)
|
||||
@ -129,11 +126,9 @@ namespace QSB.DeathSync
|
||||
_spaceSuit.RemoveSuit(true);
|
||||
}
|
||||
|
||||
private SpawnPoint GetSpawnPoint(bool isShip = false)
|
||||
{
|
||||
return _playerSpawner
|
||||
private SpawnPoint GetSpawnPoint(bool isShip = false) =>
|
||||
_playerSpawner
|
||||
.GetValue<SpawnPoint[]>("_spawnList")
|
||||
.FirstOrDefault(spawnPoint => spawnPoint.GetSpawnLocation() == SpawnLocation.TimberHearth && spawnPoint.IsShipSpawn() == isShip);
|
||||
}
|
||||
}
|
||||
}
|
39
QSB/DialogueConditionSync/Events/DialogueConditionEvent.cs
Normal file
39
QSB/DialogueConditionSync/Events/DialogueConditionEvent.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
25
QSB/DialogueConditionSync/Events/DialogueConditionMessage.cs
Normal file
25
QSB/DialogueConditionSync/Events/DialogueConditionMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -11,25 +11,22 @@ namespace QSB.ElevatorSync
|
||||
|
||||
private List<Elevator> _elevators;
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
|
||||
}
|
||||
public void OnDestroy() => QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
|
||||
|
||||
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
|
||||
{
|
||||
_elevators = Resources.FindObjectsOfTypeAll<Elevator>().ToList();
|
||||
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);
|
||||
WorldRegistry.AddObject(qsbElevator);
|
||||
QSBWorldSync.AddWorldObject(qsbElevator);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Patches;
|
||||
|
||||
namespace QSB.ElevatorSync
|
||||
{
|
||||
@ -16,7 +17,7 @@ namespace QSB.ElevatorSync
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(StartLift));
|
||||
QSBCore.Helper.HarmonyHelper.AddPostfix<Elevator>("StartLift", typeof(ElevatorPatches), nameof(StartLift));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.WorldSync;
|
||||
using QSB.WorldSync.Events;
|
||||
|
||||
@ -9,7 +9,6 @@ namespace QSB.ElevatorSync.Events
|
||||
public override EventType Type => EventType.Elevator;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<int, bool>.AddListener(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));
|
||||
@ -20,9 +19,9 @@ namespace QSB.ElevatorSync.Events
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ namespace QSB.ElevatorSync
|
||||
{
|
||||
_elevator = elevator;
|
||||
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()
|
||||
|
@ -1,4 +1,4 @@
|
||||
namespace QSB.EventsCore
|
||||
namespace QSB.Events
|
||||
{
|
||||
public static class EventNames
|
||||
{
|
||||
@ -17,16 +17,14 @@
|
||||
public static string ExitShip = "ExitShip";
|
||||
public static string RestartTimeLoop = "RestartTimeLoop";
|
||||
public static string WakeUp = "WakeUp";
|
||||
public static string DialogueCondition = "DialogueConditionChanged";
|
||||
|
||||
public static string QSBPlayerDeath = "QSBPlayerDeath";
|
||||
public static string QSBPlayerJoin = "QSBPlayerJoin";
|
||||
public static string QSBPlayerLeave = "QSBPlayerLeave";
|
||||
public static string QSBPlayerReady = "QSBPlayerReady";
|
||||
public static string QSBSectorChange = "QSBSectorChange";
|
||||
public static string QSBPlayerStatesRequest = "QSBPlayerStatesRequest";
|
||||
public static string QSBServerTime = "QSBServerTime";
|
||||
public static string QSBOnProbeAnchor = "QSBOnProbeAnchor";
|
||||
public static string QSBOnProbeWarp = "QSBOnProbeWarp";
|
||||
public static string QSBStartLift = "QSBStartLift";
|
||||
public static string QSBGeyserState = "QSBGeyserState";
|
||||
public static string QSBCrouch = "QSBAnimTrigger";
|
@ -1,4 +1,4 @@
|
||||
namespace QSB.EventsCore
|
||||
namespace QSB.Events
|
||||
{
|
||||
public enum EventType
|
||||
{
|
||||
@ -13,7 +13,6 @@
|
||||
ProbeLauncherActiveChange,
|
||||
SuitActiveChange,
|
||||
PlayerJoin,
|
||||
PlayerLeave,
|
||||
PlayerDeath,
|
||||
PlayerSectorChange,
|
||||
PlayerReady,
|
||||
@ -24,6 +23,7 @@
|
||||
OrbUser,
|
||||
Conversation,
|
||||
ConversationStartEnd,
|
||||
PlayInstrument
|
||||
PlayInstrument,
|
||||
DialogueCondition
|
||||
}
|
||||
}
|
@ -1,9 +1,8 @@
|
||||
namespace QSB.EventsCore
|
||||
namespace QSB.Events
|
||||
{
|
||||
public interface IQSBEvent
|
||||
{
|
||||
void SetupListener();
|
||||
|
||||
void CloseListener();
|
||||
}
|
||||
}
|
@ -3,42 +3,32 @@ using QSB.Player;
|
||||
using QSB.TransformSync;
|
||||
using QuantumUNET;
|
||||
|
||||
namespace QSB.EventsCore
|
||||
namespace QSB.Events
|
||||
{
|
||||
public abstract class QSBEvent<T> : IQSBEvent where T : PlayerMessage, new()
|
||||
{
|
||||
public abstract EventType Type { get; }
|
||||
public uint LocalPlayerId => QSBPlayerManager.LocalPlayerId;
|
||||
|
||||
private readonly MessageHandler<T> _eventHandler;
|
||||
|
||||
protected QSBEvent()
|
||||
{
|
||||
_eventHandler = new MessageHandler<T>(Type);
|
||||
_eventHandler.OnClientReceiveMessage += OnClientReceive;
|
||||
_eventHandler.OnServerReceiveMessage += OnServerReceive;
|
||||
_eventHandler.OnClientReceiveMessage += message => OnReceive(false, message);
|
||||
_eventHandler.OnServerReceiveMessage += message => OnReceive(true, message);
|
||||
}
|
||||
|
||||
public abstract void SetupListener();
|
||||
|
||||
public abstract void CloseListener();
|
||||
|
||||
public virtual void OnReceiveRemote(T message)
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void OnReceiveLocal(T message)
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void OnServerReceive(T message)
|
||||
{
|
||||
_eventHandler.SendToAll(message);
|
||||
}
|
||||
public virtual void OnReceiveRemote(bool server, T message) { }
|
||||
public virtual void OnReceiveLocal(bool server, T message) { }
|
||||
|
||||
public void SendEvent(T message)
|
||||
{
|
||||
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)
|
||||
@ -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 ||
|
||||
QSBPlayerManager.IsBelongingToLocalPlayer(message.AboutId))
|
||||
{
|
||||
OnReceiveLocal(message);
|
||||
OnReceiveLocal(isServer, message);
|
||||
return;
|
||||
}
|
||||
|
||||
OnReceiveRemote(message);
|
||||
OnReceiveRemote(isServer, message);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +1,8 @@
|
||||
using OWML.Common;
|
||||
using QSB.Animation;
|
||||
using QSB.Animation.Events;
|
||||
using QSB.ConversationSync.Events;
|
||||
using QSB.DeathSync.Events;
|
||||
using QSB.DialogueConditionSync.Events;
|
||||
using QSB.ElevatorSync.Events;
|
||||
using QSB.GeyserSync.Events;
|
||||
using QSB.OrbSync.Events;
|
||||
@ -12,7 +12,7 @@ using QSB.Tools.Events;
|
||||
using QSB.Utility;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace QSB.EventsCore
|
||||
namespace QSB.Events
|
||||
{
|
||||
public static class QSBEventManager
|
||||
{
|
||||
@ -33,7 +33,6 @@ namespace QSB.EventsCore
|
||||
new PlayerProbeLauncherEvent(),
|
||||
new PlayerProbeEvent(),
|
||||
new PlayerSectorEvent(),
|
||||
new PlayerLeaveEvent(),
|
||||
new PlayerDeathEvent(),
|
||||
new PlayerStatesRequestEvent(),
|
||||
new ElevatorEvent(),
|
||||
@ -45,7 +44,8 @@ namespace QSB.EventsCore
|
||||
new ConversationEvent(),
|
||||
new ConversationStartEndEvent(),
|
||||
new ChangeAnimTypeEvent(),
|
||||
new ServerSendPlayerStatesEvent()
|
||||
new ServerSendPlayerStatesEvent(),
|
||||
new DialogueConditionEvent()
|
||||
};
|
||||
|
||||
_eventList.ForEach(ev => ev.SetupListener());
|
||||
@ -58,9 +58,7 @@ namespace QSB.EventsCore
|
||||
public static void Reset()
|
||||
{
|
||||
Ready = false;
|
||||
|
||||
_eventList.ForEach(ev => ev.CloseListener());
|
||||
|
||||
_eventList = new List<IQSBEvent>();
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.WorldSync;
|
||||
using QSB.WorldSync.Events;
|
||||
|
||||
@ -8,15 +8,8 @@ namespace QSB.GeyserSync.Events
|
||||
{
|
||||
public override EventType Type => EventType.Geyser;
|
||||
|
||||
public override void SetupListener()
|
||||
{
|
||||
GlobalMessenger<int, bool>.AddListener(EventNames.QSBGeyserState, Handler);
|
||||
}
|
||||
|
||||
public override void CloseListener()
|
||||
{
|
||||
GlobalMessenger<int, bool>.RemoveListener(EventNames.QSBGeyserState, Handler);
|
||||
}
|
||||
public override void SetupListener() => 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));
|
||||
|
||||
@ -27,9 +20,9 @@ namespace QSB.GeyserSync.Events
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -6,16 +6,13 @@ namespace QSB.GeyserSync
|
||||
{
|
||||
public class GeyserManager : MonoBehaviour
|
||||
{
|
||||
public static GeyserManager Instance { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
|
||||
QSBPatchManager.OnPatchType += OnPatchType;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
public void OnDestroy()
|
||||
{
|
||||
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
|
||||
QSBPatchManager.OnPatchType -= OnPatchType;
|
||||
@ -26,9 +23,9 @@ namespace QSB.GeyserSync
|
||||
var geyserControllers = Resources.FindObjectsOfTypeAll<GeyserController>();
|
||||
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);
|
||||
WorldRegistry.AddObject(qsbGeyser);
|
||||
QSBWorldSync.AddWorldObject(qsbGeyser);
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,7 +35,7 @@ namespace QSB.GeyserSync
|
||||
{
|
||||
return;
|
||||
}
|
||||
QSB.Helper.HarmonyHelper.EmptyMethod<GeyserController>("Update");
|
||||
QSBCore.Helper.HarmonyHelper.EmptyMethod<GeyserController>("Update");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.WorldSync;
|
||||
using QuantumUNET;
|
||||
|
||||
@ -30,11 +30,9 @@ namespace QSB.GeyserSync
|
||||
if (state)
|
||||
{
|
||||
_geyserController?.ActivateGeyser();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
_geyserController?.DeactivateGeyser();
|
||||
}
|
||||
_geyserController?.DeactivateGeyser();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
using OWML.Common;
|
||||
using QSB.Animation;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Instruments.QSBCamera;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
@ -10,54 +10,56 @@ namespace QSB.Instruments
|
||||
{
|
||||
public class InstrumentsManager : PlayerSyncObject
|
||||
{
|
||||
private Transform rootObj;
|
||||
private Transform _rootObj;
|
||||
private AnimationType _savedType;
|
||||
private GameObject ChertDrum;
|
||||
private GameObject _chertDrum;
|
||||
|
||||
public void InitLocal(Transform root)
|
||||
{
|
||||
rootObj = root;
|
||||
_rootObj = root;
|
||||
gameObject.AddComponent<CameraManager>();
|
||||
|
||||
QSBInputManager.ChertTaunt += () => StartInstrument(AnimationType.Chert);
|
||||
QSBInputManager.EskerTaunt += () => StartInstrument(AnimationType.Esker);
|
||||
QSBInputManager.FeldsparTaunt += () => StartInstrument(AnimationType.Feldspar);
|
||||
QSBInputManager.GabbroTaunt += () => StartInstrument(AnimationType.Gabbro);
|
||||
QSBInputManager.RiebeckTaunt += () => StartInstrument(AnimationType.Riebeck);
|
||||
QSBInputManager.ExitTaunt += () => ReturnToPlayer();
|
||||
QSBInputManager.ChertTaunt += OnChertTaunt;
|
||||
QSBInputManager.EskerTaunt += OnEskerTaunt;
|
||||
QSBInputManager.FeldsparTaunt += OnFeldsparTaunt;
|
||||
QSBInputManager.GabbroTaunt += OnGabbroTaunt;
|
||||
QSBInputManager.RiebeckTaunt += OnRiebeckTaunt;
|
||||
QSBInputManager.ExitTaunt += ReturnToPlayer;
|
||||
|
||||
QSB.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
|
||||
|
||||
QSBPlayerManager.PlayerSyncObjects.Add(this);
|
||||
QSBCore.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
|
||||
}
|
||||
|
||||
public void InitRemote(Transform root)
|
||||
{
|
||||
rootObj = root;
|
||||
QSB.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
|
||||
|
||||
QSBPlayerManager.PlayerSyncObjects.Add(this);
|
||||
_rootObj = root;
|
||||
QSBCore.Helper.Events.Unity.RunWhen(() => Locator.GetPlayerBody() != null, SetupInstruments);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
if (!IsLocalPlayer)
|
||||
{
|
||||
return;
|
||||
}
|
||||
DebugLog.DebugWrite($"OnDestroy {PlayerId}");
|
||||
QSBInputManager.ChertTaunt -= () => StartInstrument(AnimationType.Chert);
|
||||
QSBInputManager.EskerTaunt -= () => StartInstrument(AnimationType.Esker);
|
||||
QSBInputManager.FeldsparTaunt -= () => StartInstrument(AnimationType.Feldspar);
|
||||
QSBInputManager.GabbroTaunt -= () => StartInstrument(AnimationType.Gabbro);
|
||||
QSBInputManager.RiebeckTaunt -= () => StartInstrument(AnimationType.Riebeck);
|
||||
QSBInputManager.ExitTaunt -= () => ReturnToPlayer();
|
||||
QSBInputManager.ChertTaunt -= OnChertTaunt;
|
||||
QSBInputManager.EskerTaunt -= OnEskerTaunt;
|
||||
QSBInputManager.FeldsparTaunt -= OnFeldsparTaunt;
|
||||
QSBInputManager.GabbroTaunt -= OnGabbroTaunt;
|
||||
QSBInputManager.RiebeckTaunt -= OnRiebeckTaunt;
|
||||
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()
|
||||
{
|
||||
var bundle = QSB.InstrumentAssetBundle;
|
||||
ChertDrum = MakeChertDrum(bundle);
|
||||
var bundle = QSBCore.InstrumentAssetBundle;
|
||||
_chertDrum = MakeChertDrum(bundle);
|
||||
}
|
||||
|
||||
private GameObject MakeChertDrum(AssetBundle bundle)
|
||||
@ -76,8 +78,8 @@ namespace QSB.Instruments
|
||||
// TODO : fix for instrument release
|
||||
mr.sharedMaterial = null;
|
||||
}
|
||||
drum.transform.parent = rootObj;
|
||||
drum.transform.rotation = rootObj.rotation;
|
||||
drum.transform.parent = _rootObj;
|
||||
drum.transform.rotation = _rootObj.rotation;
|
||||
drum.transform.localPosition = Vector3.zero;
|
||||
drum.transform.localScale = new Vector3(16.0f, 16.5f, 16.0f);
|
||||
drum.SetActive(false);
|
||||
@ -124,12 +126,11 @@ namespace QSB.Instruments
|
||||
switch (type)
|
||||
{
|
||||
case AnimationType.Chert:
|
||||
ChertDrum.SetActive(true);
|
||||
_chertDrum?.SetActive(true);
|
||||
break;
|
||||
|
||||
case AnimationType.PlayerSuited:
|
||||
case AnimationType.PlayerUnsuited:
|
||||
ChertDrum.SetActive(false);
|
||||
_chertDrum?.SetActive(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ namespace QSB.Instruments.QSBCamera
|
||||
{
|
||||
internal class CameraController : MonoBehaviour
|
||||
{
|
||||
public GameObject CameraObject { get; set; }
|
||||
|
||||
private float _degreesX;
|
||||
private float _degreesY;
|
||||
private Quaternion _rotationX;
|
||||
@ -15,9 +17,7 @@ namespace QSB.Instruments.QSBCamera
|
||||
// Maximum distance for camera clipping
|
||||
private const float RayLength = 5f;
|
||||
|
||||
public GameObject CameraObject;
|
||||
|
||||
private void FixedUpdate()
|
||||
public void FixedUpdate()
|
||||
{
|
||||
if (CameraManager.Instance.Mode != CameraMode.ThirdPerson)
|
||||
{
|
||||
@ -41,27 +41,19 @@ namespace QSB.Instruments.QSBCamera
|
||||
else
|
||||
{
|
||||
// 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 currentDistance = Vector3.Distance(origin, CameraObject.transform.position);
|
||||
Vector3 movement;
|
||||
if (targetDistance < currentDistance)
|
||||
{
|
||||
// Snap to target to avoid clipping
|
||||
movement = localTargetPoint;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Move camera out slowly
|
||||
movement = Vector3.MoveTowards(CameraObject.transform.localPosition, localTargetPoint, Time.fixedDeltaTime * 2f);
|
||||
}
|
||||
var movement = targetDistance < currentDistance
|
||||
? localTargetPoint
|
||||
: Vector3.MoveTowards(CameraObject.transform.localPosition, localTargetPoint, Time.fixedDeltaTime * 2f);
|
||||
CameraObject.transform.localPosition = movement;
|
||||
}
|
||||
|
||||
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;
|
||||
_degreesY += input.y * 180f * Time.fixedDeltaTime;
|
||||
}
|
||||
|
@ -8,13 +8,16 @@ namespace QSB.Instruments.QSBCamera
|
||||
public class CameraManager : MonoBehaviour
|
||||
{
|
||||
public static CameraManager Instance;
|
||||
private GameObject CameraBase;
|
||||
private GameObject CameraObj;
|
||||
private Camera Camera;
|
||||
private OWCamera OWCamera;
|
||||
|
||||
|
||||
public bool IsSetUp { get; private set; }
|
||||
public CameraMode Mode { get; private set; }
|
||||
|
||||
private GameObject _cameraBase;
|
||||
private GameObject _cameraObj;
|
||||
private Camera _camera;
|
||||
private OWCamera _owCamera;
|
||||
|
||||
public void Start()
|
||||
{
|
||||
Instance = this;
|
||||
@ -23,38 +26,38 @@ namespace QSB.Instruments.QSBCamera
|
||||
|
||||
private void SetupCamera()
|
||||
{
|
||||
CameraBase = new GameObject();
|
||||
CameraBase.SetActive(false);
|
||||
CameraBase.AddComponent<Transform>();
|
||||
CameraBase.transform.parent = Locator.GetPlayerTransform();
|
||||
CameraBase.transform.localPosition = Vector3.zero;
|
||||
CameraBase.transform.localRotation = Quaternion.Euler(0, 0, 0);
|
||||
_cameraBase = new GameObject();
|
||||
_cameraBase.SetActive(false);
|
||||
_cameraBase.AddComponent<Transform>();
|
||||
_cameraBase.transform.parent = Locator.GetPlayerTransform();
|
||||
_cameraBase.transform.localPosition = Vector3.zero;
|
||||
_cameraBase.transform.localRotation = Quaternion.Euler(0, 0, 0);
|
||||
|
||||
CameraObj = new GameObject();
|
||||
CameraObj.transform.parent = CameraBase.transform;
|
||||
CameraObj.transform.localPosition = new Vector3(0, 0, -5f);
|
||||
CameraObj.transform.localRotation = Quaternion.Euler(0, 0, 0);
|
||||
Camera = CameraObj.AddComponent<Camera>();
|
||||
Camera.cullingMask = Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27) | (1 << 22);
|
||||
Camera.clearFlags = CameraClearFlags.Color;
|
||||
Camera.backgroundColor = Color.black;
|
||||
Camera.fieldOfView = 90f;
|
||||
Camera.nearClipPlane = 0.1f;
|
||||
Camera.farClipPlane = 40000f;
|
||||
Camera.depth = 0f;
|
||||
Camera.enabled = false;
|
||||
OWCamera = CameraObj.AddComponent<OWCamera>();
|
||||
OWCamera.renderSkybox = true;
|
||||
_cameraObj = new GameObject();
|
||||
_cameraObj.transform.parent = _cameraBase.transform;
|
||||
_cameraObj.transform.localPosition = new Vector3(0, 0, -5f);
|
||||
_cameraObj.transform.localRotation = Quaternion.Euler(0, 0, 0);
|
||||
_camera = _cameraObj.AddComponent<Camera>();
|
||||
_camera.cullingMask = Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27) | (1 << 22);
|
||||
_camera.clearFlags = CameraClearFlags.Color;
|
||||
_camera.backgroundColor = Color.black;
|
||||
_camera.fieldOfView = 90f;
|
||||
_camera.nearClipPlane = 0.1f;
|
||||
_camera.farClipPlane = 40000f;
|
||||
_camera.depth = 0f;
|
||||
_camera.enabled = false;
|
||||
_owCamera = _cameraObj.AddComponent<OWCamera>();
|
||||
_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;
|
||||
|
||||
var fogImage = CameraObj.AddComponent<PlanetaryFogImageEffect>();
|
||||
var fogImage = _cameraObj.AddComponent<PlanetaryFogImageEffect>();
|
||||
fogImage.fogShader = Locator.GetPlayerCamera().gameObject.GetComponent<PlanetaryFogImageEffect>().fogShader;
|
||||
|
||||
CameraBase.SetActive(true);
|
||||
_cameraBase.SetActive(true);
|
||||
|
||||
IsSetUp = true;
|
||||
}
|
||||
@ -79,14 +82,14 @@ namespace QSB.Instruments.QSBCamera
|
||||
return;
|
||||
}
|
||||
OWInput.ChangeInputMode(InputMode.None);
|
||||
GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", OWCamera);
|
||||
GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", _owCamera);
|
||||
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;
|
||||
}
|
||||
Camera.enabled = true;
|
||||
_camera.enabled = true;
|
||||
Mode = CameraMode.ThirdPerson;
|
||||
}
|
||||
|
||||
@ -107,7 +110,7 @@ namespace QSB.Instruments.QSBCamera
|
||||
OWInput.ChangeInputMode(InputMode.Character);
|
||||
GlobalMessenger<OWCamera>.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera());
|
||||
Locator.GetActiveCamera().mainCamera.enabled = true;
|
||||
Camera.enabled = false;
|
||||
_camera.enabled = false;
|
||||
Mode = CameraMode.FirstPerson;
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
{
|
||||
public enum CameraMode
|
||||
{
|
||||
FirstPerson,
|
||||
ThirdPerson
|
||||
FirstPerson = 0,
|
||||
ThirdPerson = 1
|
||||
}
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
using QSB.Messaging;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET;
|
||||
|
||||
namespace QSB.MessagesCore
|
||||
namespace QSB.Messaging
|
||||
{
|
||||
public class EnumMessage<T> : PlayerMessage
|
||||
{
|
@ -1,7 +1,6 @@
|
||||
using QSB.Messaging;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET;
|
||||
|
||||
namespace QSB.MessagesCore
|
||||
namespace QSB.Messaging
|
||||
{
|
||||
public class FloatMessage : PlayerMessage
|
||||
{
|
@ -1,26 +1,22 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Utility;
|
||||
using QSB.Events;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET.Components;
|
||||
using QuantumUNET.Messages;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace QSB.Messaging
|
||||
{
|
||||
// Extend this to create new message handlers.
|
||||
public class MessageHandler<T> where T : QSBMessageBase, new()
|
||||
{
|
||||
public event Action<T> OnClientReceiveMessage;
|
||||
|
||||
public event Action<T> OnServerReceiveMessage;
|
||||
|
||||
private readonly EventType _eventType;
|
||||
private readonly short _eventType;
|
||||
|
||||
public MessageHandler(EventType eventType)
|
||||
{
|
||||
_eventType = eventType + MsgType.Highest + 1;
|
||||
_eventType = (short)(eventType + QSBMsgType.Highest + 1);
|
||||
if (QSBNetworkManager.Instance.IsReady)
|
||||
{
|
||||
Init();
|
||||
@ -33,14 +29,13 @@ namespace QSB.Messaging
|
||||
|
||||
private void Init()
|
||||
{
|
||||
var eventName = Enum.GetName(typeof(EventType), _eventType - 1 - MsgType.Highest).ToUpper();
|
||||
if (QSBNetworkServer.handlers.Keys.Contains((short)_eventType))
|
||||
if (QSBNetworkServer.handlers.Keys.Contains(_eventType))
|
||||
{
|
||||
DebugLog.ToConsole($"Warning - NetworkServer already contains a handler for EventType {_eventType}", MessageType.Warning);
|
||||
QSBNetworkServer.handlers.Remove((short)_eventType);
|
||||
QSBNetworkServer.handlers.Remove(_eventType);
|
||||
QSBNetworkManagerUNET.singleton.client.handlers.Remove(_eventType);
|
||||
}
|
||||
QSBNetworkServer.RegisterHandler((short)_eventType, OnServerReceiveMessageHandler);
|
||||
QSBNetworkManager.singleton.client.RegisterHandler((short)_eventType, OnClientReceiveMessageHandler);
|
||||
QSBNetworkServer.RegisterHandler(_eventType, OnServerReceiveMessageHandler);
|
||||
QSBNetworkManagerUNET.singleton.client.RegisterHandler(_eventType, OnClientReceiveMessageHandler);
|
||||
}
|
||||
|
||||
public void SendToAll(T message)
|
||||
@ -49,7 +44,7 @@ namespace QSB.Messaging
|
||||
{
|
||||
return;
|
||||
}
|
||||
QSBNetworkServer.SendToAll((short)_eventType, message);
|
||||
QSBNetworkServer.SendToAll(_eventType, message);
|
||||
}
|
||||
|
||||
public void SendToServer(T message)
|
||||
@ -58,7 +53,7 @@ namespace QSB.Messaging
|
||||
{
|
||||
return;
|
||||
}
|
||||
QSBNetworkManager.singleton.client.Send((short)_eventType, message);
|
||||
QSBNetworkManagerUNET.singleton.client.Send(_eventType, message);
|
||||
}
|
||||
|
||||
private void OnClientReceiveMessageHandler(QSBNetworkMessage netMsg)
|
@ -7,17 +7,20 @@ namespace QSB.Messaging
|
||||
{
|
||||
public uint FromId { get; set; }
|
||||
public uint AboutId { get; set; }
|
||||
public bool OnlySendToServer { get; set; }
|
||||
|
||||
public override void Deserialize(QSBNetworkReader reader)
|
||||
{
|
||||
FromId = reader.ReadUInt32();
|
||||
AboutId = reader.ReadUInt32();
|
||||
OnlySendToServer = reader.ReadBoolean();
|
||||
}
|
||||
|
||||
public override void Serialize(QSBNetworkWriter writer)
|
||||
{
|
||||
writer.Write(FromId);
|
||||
writer.Write(AboutId);
|
||||
writer.Write(OnlySendToServer);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.WorldSync;
|
||||
|
||||
namespace QSB.OrbSync.Events
|
||||
@ -8,7 +8,6 @@ namespace QSB.OrbSync.Events
|
||||
public override EventType Type => EventType.OrbSlot;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<int, int, bool>.AddListener(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));
|
||||
@ -21,9 +20,9 @@ namespace QSB.OrbSync.Events
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
using QSB.WorldSync.Events;
|
||||
@ -14,7 +14,6 @@ namespace QSB.OrbSync.Events
|
||||
public override EventType Type => EventType.OrbUser;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<int>.AddListener(EventNames.QSBOrbUser, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger<int>.RemoveListener(EventNames.QSBOrbUser, Handler);
|
||||
|
||||
private void Handler(int id) => SendEvent(CreateMessage(id));
|
||||
@ -25,10 +24,22 @@ namespace QSB.OrbSync.Events
|
||||
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);
|
||||
if (WorldRegistry.OrbSyncList.Count == 0)
|
||||
if (QSBWorldSync.OrbSyncList.Count == 0)
|
||||
{
|
||||
DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error);
|
||||
return;
|
||||
@ -37,14 +48,14 @@ namespace QSB.OrbSync.Events
|
||||
{
|
||||
DebugLog.DebugWrite("Error - FromPlayer is null!", MessageType.Error);
|
||||
}
|
||||
var orb = WorldRegistry.OrbSyncList
|
||||
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]);
|
||||
if (orb == null)
|
||||
var orbSync = QSBWorldSync.OrbSyncList
|
||||
.First(x => x.AttachedOrb == QSBWorldSync.OldOrbList[message.ObjectId]);
|
||||
if (orbSync == null)
|
||||
{
|
||||
DebugLog.ToConsole($"Error - No orb found for user event. (ID {message.ObjectId})", MessageType.Error);
|
||||
return;
|
||||
}
|
||||
var orbIdentity = orb.GetComponent<QSBNetworkIdentity>();
|
||||
var orbIdentity = orbSync.GetComponent<QSBNetworkIdentity>();
|
||||
if (orbIdentity == null)
|
||||
{
|
||||
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.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;
|
||||
}
|
||||
var orb = WorldRegistry.OrbSyncList
|
||||
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]);
|
||||
var orb = QSBWorldSync.OrbSyncList
|
||||
.First(x => x.AttachedOrb == QSBWorldSync.OldOrbList[message.ObjectId]);
|
||||
orb.enabled = true;
|
||||
}
|
||||
|
||||
public override void OnReceiveLocal(WorldObjectMessage message)
|
||||
{
|
||||
if (QSBNetworkServer.active)
|
||||
{
|
||||
OnServerReceive(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -18,12 +18,11 @@ namespace QSB.OrbSync
|
||||
|
||||
private void BuildOrbSlots()
|
||||
{
|
||||
DebugLog.DebugWrite("Building QSBOrbSlots...", MessageType.Info);
|
||||
WorldRegistry.RemoveObjects<QSBOrbSlot>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
|
||||
var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>();
|
||||
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);
|
||||
}
|
||||
|
||||
@ -32,29 +31,18 @@ namespace QSB.OrbSync
|
||||
|
||||
public void BuildOrbs()
|
||||
{
|
||||
DebugLog.DebugWrite("Building orb syncs...", MessageType.Info);
|
||||
WorldRegistry.OldOrbList.Clear();
|
||||
WorldRegistry.OldOrbList = Resources.FindObjectsOfTypeAll<NomaiInterfaceOrb>().ToList();
|
||||
QSBWorldSync.OldOrbList.Clear();
|
||||
QSBWorldSync.OldOrbList = Resources.FindObjectsOfTypeAll<NomaiInterfaceOrb>().ToList();
|
||||
if (QSBNetworkServer.active)
|
||||
{
|
||||
DebugLog.DebugWrite("- Is server, instantiating orb prefabs.");
|
||||
WorldRegistry.OrbSyncList.ForEach(x => QSBNetworkServer.Destroy(x.gameObject));
|
||||
WorldRegistry.OrbSyncList.Clear();
|
||||
WorldRegistry.OldOrbList.ForEach(x => QSBNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.OrbPrefab)));
|
||||
QSBWorldSync.OrbSyncList.ForEach(x => QSBNetworkServer.Destroy(x.gameObject));
|
||||
QSBWorldSync.OrbSyncList.Clear();
|
||||
QSBWorldSync.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()
|
||||
{
|
||||
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);
|
||||
}
|
||||
public void QueueBuildSlots() => QSBCore.Helper.Events.Unity.RunWhen(() => QSBCore.HasWokenUp, BuildOrbSlots);
|
||||
public void QueueBuildOrbs() => QSBCore.Helper.Events.Unity.RunWhen(() => QSBNetworkServer.active, BuildOrbs);
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Patches;
|
||||
using QSB.WorldSync;
|
||||
using UnityEngine;
|
||||
|
||||
@ -12,7 +13,7 @@ namespace QSB.OrbSync
|
||||
{
|
||||
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;
|
||||
if (Time.timeSinceLevelLoad > 1f)
|
||||
{
|
||||
WorldRegistry.HandleSlotStateChange(__instance, orb, true);
|
||||
WorldRegistry.RaiseEvent(__instance, "OnSlotActivated");
|
||||
QSBWorldSync.HandleSlotStateChange(__instance, orb, true);
|
||||
QSBWorldSync.RaiseEvent(__instance, "OnSlotActivated");
|
||||
}
|
||||
__result = true;
|
||||
return false;
|
||||
@ -44,9 +45,9 @@ namespace QSB.OrbSync
|
||||
}
|
||||
if (orbDistance > triggerRadius)
|
||||
{
|
||||
WorldRegistry.HandleSlotStateChange(__instance, orb, false);
|
||||
QSBWorldSync.HandleSlotStateChange(__instance, orb, false);
|
||||
____occupyingOrb = null;
|
||||
WorldRegistry.RaiseEvent(__instance, "OnSlotDeactivated");
|
||||
QSBWorldSync.RaiseEvent(__instance, "OnSlotDeactivated");
|
||||
__result = false;
|
||||
return false;
|
||||
}
|
||||
@ -56,8 +57,8 @@ namespace QSB.OrbSync
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
QSB.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(StartDragCallEvent));
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(CheckOrbCollision));
|
||||
QSBCore.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(StartDragCallEvent));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(CheckOrbCollision));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.WorldSync;
|
||||
|
||||
namespace QSB.OrbSync
|
||||
@ -16,12 +16,12 @@ namespace QSB.OrbSync
|
||||
ObjectId = id;
|
||||
InterfaceSlot = slot;
|
||||
_initialized = true;
|
||||
WorldRegistry.AddObject(this);
|
||||
QSBWorldSync.AddWorldObject(this);
|
||||
}
|
||||
|
||||
public void HandleEvent(bool state, int orbId)
|
||||
{
|
||||
if (QSB.HasWokenUp)
|
||||
if (QSBCore.HasWokenUp)
|
||||
{
|
||||
GlobalMessenger<int, int, bool>.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state);
|
||||
}
|
||||
@ -33,10 +33,10 @@ namespace QSB.OrbSync
|
||||
{
|
||||
return;
|
||||
}
|
||||
var occOrb = state ? WorldRegistry.OldOrbList[orbId] : null;
|
||||
var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null;
|
||||
InterfaceSlot.SetValue("_occupyingOrb", occOrb);
|
||||
var ev = state ? "OnSlotActivated" : "OnSlotDeactivated";
|
||||
WorldRegistry.RaiseEvent(InterfaceSlot, ev);
|
||||
QSBWorldSync.RaiseEvent(InterfaceSlot, ev);
|
||||
Activated = state;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,8 @@
|
||||
namespace QSB
|
||||
namespace QSB.Patches
|
||||
{
|
||||
public abstract class QSBPatch
|
||||
{
|
||||
public abstract QSBPatchTypes Type { get; }
|
||||
|
||||
public abstract void DoPatches();
|
||||
}
|
||||
}
|
@ -4,7 +4,6 @@ using QSB.DeathSync;
|
||||
using QSB.ElevatorSync;
|
||||
using QSB.OrbSync;
|
||||
using QSB.TimeSync;
|
||||
using QSB.Tools;
|
||||
using QSB.Utility;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@ -16,10 +15,10 @@ namespace QSB.Patches
|
||||
|
||||
public static class QSBPatchManager
|
||||
{
|
||||
public static List<QSBPatch> _patchList = new List<QSBPatch>();
|
||||
|
||||
public static event PatchEvent OnPatchType;
|
||||
|
||||
private static List<QSBPatch> _patchList = new List<QSBPatch>();
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
_patchList = new List<QSBPatch>
|
||||
@ -28,8 +27,7 @@ namespace QSB.Patches
|
||||
new DeathPatches(),
|
||||
new ElevatorPatches(),
|
||||
new OrbPatches(),
|
||||
new WakeUpPatches(),
|
||||
new ProbePatches()
|
||||
new WakeUpPatches()
|
||||
};
|
||||
|
||||
DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success);
|
||||
|
@ -1,9 +1,9 @@
|
||||
namespace QSB
|
||||
namespace QSB.Patches
|
||||
{
|
||||
public enum QSBPatchTypes
|
||||
{
|
||||
OnModStart,
|
||||
OnClientConnect,
|
||||
OnNonServerClientConnect
|
||||
OnModStart = 0,
|
||||
OnClientConnect = 1,
|
||||
OnNonServerClientConnect = 2
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Utility;
|
||||
|
||||
namespace QSB.Player.Events
|
||||
@ -9,7 +9,6 @@ namespace QSB.Player.Events
|
||||
public override EventType Type => EventType.PlayerJoin;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<string>.AddListener(EventNames.QSBPlayerJoin, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger<string>.RemoveListener(EventNames.QSBPlayerJoin, Handler);
|
||||
|
||||
private void Handler(string name) => SendEvent(CreateMessage(name));
|
||||
@ -20,7 +19,7 @@ namespace QSB.Player.Events
|
||||
PlayerName = name
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(PlayerJoinMessage message)
|
||||
public override void OnReceiveRemote(bool server, PlayerJoinMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.Name = message.PlayerName;
|
||||
@ -28,7 +27,7 @@ namespace QSB.Player.Events
|
||||
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);
|
||||
player.Name = message.PlayerName;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.SectorSync;
|
||||
using QSB.Utility;
|
||||
@ -12,7 +12,6 @@ namespace QSB.Player.Events
|
||||
public override EventType Type => EventType.PlayerReady;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<bool>.AddListener(EventNames.QSBPlayerReady, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger<bool>.RemoveListener(EventNames.QSBPlayerReady, Handler);
|
||||
|
||||
private void Handler(bool ready) => SendEvent(CreateMessage(ready));
|
||||
@ -23,23 +22,33 @@ namespace QSB.Player.Events
|
||||
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 (message.FromId == QSBPlayerManager.LocalPlayerId)
|
||||
if (server)
|
||||
{
|
||||
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;
|
||||
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);
|
||||
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;
|
||||
}
|
||||
foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>()
|
||||
|
@ -1,5 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.SectorSync;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
@ -11,15 +11,8 @@ namespace QSB.Player.Events
|
||||
{
|
||||
public override EventType Type => EventType.PlayerSectorChange;
|
||||
|
||||
public override void SetupListener()
|
||||
{
|
||||
GlobalMessenger<uint, QSBSector>.AddListener(EventNames.QSBSectorChange, Handler);
|
||||
}
|
||||
|
||||
public override void CloseListener()
|
||||
{
|
||||
GlobalMessenger<uint, QSBSector>.RemoveListener(EventNames.QSBSectorChange, Handler);
|
||||
}
|
||||
public override void SetupListener() => 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));
|
||||
|
||||
@ -29,23 +22,23 @@ namespace QSB.Player.Events
|
||||
ObjectId = sector.ObjectId
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(WorldObjectMessage message)
|
||||
public override void OnReceiveRemote(bool server, WorldObjectMessage message)
|
||||
{
|
||||
if (!QSBSceneManager.IsInUniverse)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var sector = WorldRegistry.GetObject<QSBSector>(message.ObjectId);
|
||||
var sector = QSBWorldSync.GetWorldObject<QSBSector>(message.ObjectId);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
@ -8,8 +8,7 @@ namespace QSB.Player.Events
|
||||
public string PlayerName { get; set; }
|
||||
public bool PlayerReady { get; set; }
|
||||
public State PlayerState { get; set; }
|
||||
public Sector.Name SectorID { get; set; }
|
||||
public string SectorName { get; set; }
|
||||
|
||||
|
||||
public override void Deserialize(QSBNetworkReader reader)
|
||||
{
|
||||
@ -17,8 +16,6 @@ namespace QSB.Player.Events
|
||||
PlayerName = reader.ReadString();
|
||||
PlayerReady = reader.ReadBoolean();
|
||||
PlayerState = (State)reader.ReadInt32();
|
||||
SectorID = (Sector.Name)reader.ReadInt32();
|
||||
SectorName = reader.ReadString();
|
||||
}
|
||||
|
||||
public override void Serialize(QSBNetworkWriter writer)
|
||||
@ -27,8 +24,6 @@ namespace QSB.Player.Events
|
||||
writer.Write(PlayerName);
|
||||
writer.Write(PlayerReady);
|
||||
writer.Write((int)PlayerState);
|
||||
writer.Write((int)SectorID);
|
||||
writer.Write(SectorName);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,8 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.SectorSync;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
using System.Linq;
|
||||
|
||||
namespace QSB.Player.Events
|
||||
@ -11,25 +12,30 @@ namespace QSB.Player.Events
|
||||
public override EventType Type => EventType.PlayerStatesRequest;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBPlayerStatesRequest, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBPlayerStatesRequest, Handler);
|
||||
|
||||
private void Handler() => SendEvent(CreateMessage());
|
||||
|
||||
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);
|
||||
foreach (var item in QSBPlayerManager.GetSyncObjects<TransformSync.TransformSync>()
|
||||
.Where(x => x != null && x.IsReady && x.ReferenceSector != null))
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Utility;
|
||||
|
||||
namespace QSB.Player.Events
|
||||
@ -9,7 +9,6 @@ namespace QSB.Player.Events
|
||||
public override EventType Type => EventType.PlayerState;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBServerSendPlayerStates, Handler);
|
||||
|
||||
public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBServerSendPlayerStates, Handler);
|
||||
|
||||
private void Handler()
|
||||
@ -29,10 +28,10 @@ namespace QSB.Player.Events
|
||||
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);
|
||||
QSB.Helper.Events.Unity.RunWhen(
|
||||
QSBCore.Helper.Events.Unity.RunWhen(
|
||||
() => QSBPlayerManager.GetSyncObject<TransformSync.TransformSync>(message.AboutId) != null,
|
||||
() => QSBPlayerManager.HandleFullStateMessage(message));
|
||||
}
|
||||
|
@ -16,12 +16,10 @@ namespace QSB.Player
|
||||
|
||||
// Body Objects
|
||||
public GameObject Camera { get; set; }
|
||||
|
||||
public GameObject Body { get; set; }
|
||||
|
||||
// Tools
|
||||
public GameObject ProbeBody { get; set; }
|
||||
|
||||
public QSBProbe Probe { get; set; }
|
||||
public QSBFlashlight FlashLight => Camera?.GetComponentInChildren<QSBFlashlight>();
|
||||
public QSBTool Signalscope => GetToolByType(ToolType.Signalscope);
|
||||
@ -30,12 +28,10 @@ namespace QSB.Player
|
||||
|
||||
// Conversation
|
||||
public int CurrentDialogueID { get; set; }
|
||||
|
||||
public GameObject CurrentDialogueBox { get; set; }
|
||||
|
||||
// Animation
|
||||
public AnimationSync AnimationSync => QSBPlayerManager.GetSyncObject<AnimationSync>(PlayerId);
|
||||
|
||||
public bool PlayingInstrument => AnimationSync.CurrentType != AnimationType.PlayerSuited
|
||||
&& AnimationSync.CurrentType != AnimationType.PlayerUnsuited;
|
||||
|
||||
@ -69,14 +65,12 @@ namespace QSB.Player
|
||||
Translator?.ChangeEquipState(FlagsHelper.IsSet(State, State.Translator));
|
||||
ProbeLauncher?.ChangeEquipState(FlagsHelper.IsSet(State, State.ProbeLauncher));
|
||||
Signalscope?.ChangeEquipState(FlagsHelper.IsSet(State, State.Signalscope));
|
||||
QSB.Helper.Events.Unity.RunWhen(() => 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)));
|
||||
}
|
||||
|
||||
public bool GetState(State state)
|
||||
{
|
||||
return FlagsHelper.IsSet(State, state);
|
||||
}
|
||||
=> FlagsHelper.IsSet(State, state);
|
||||
|
||||
private QSBTool GetToolByType(ToolType type)
|
||||
{
|
||||
|
@ -1,13 +1,14 @@
|
||||
using QuantumUNET;
|
||||
using QuantumUNET.Components;
|
||||
|
||||
namespace QSB.Player
|
||||
{
|
||||
public abstract class PlayerSyncObject : QSBNetworkBehaviour
|
||||
{
|
||||
public uint AttachedNetId => GetComponent<QSBNetworkIdentity>()?.NetId.Value ?? uint.MaxValue;
|
||||
public uint PlayerId => this.GetPlayerOfObject();
|
||||
public uint PreviousPlayerId { get; set; }
|
||||
public uint AttachedNetId => NetIdentity?.NetId.Value ?? uint.MaxValue;
|
||||
public uint PlayerId => NetIdentity.RootIdentity?.NetId.Value ?? NetIdentity.NetId.Value;
|
||||
public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId);
|
||||
|
||||
protected virtual void Start() => QSBPlayerManager.AddSyncObject(this);
|
||||
protected virtual void OnDestroy() => QSBPlayerManager.AddSyncObject(this);
|
||||
}
|
||||
}
|
@ -2,7 +2,6 @@
|
||||
using QSB.Player.Events;
|
||||
using QSB.TransformSync;
|
||||
using QSB.Utility;
|
||||
using QuantumUNET.Components;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
@ -10,11 +9,11 @@ namespace QSB.Player
|
||||
{
|
||||
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 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)
|
||||
{
|
||||
@ -27,7 +26,7 @@ namespace QSB.Player
|
||||
{
|
||||
return player;
|
||||
}
|
||||
DebugLog.DebugWrite($"Creating player id {id}", MessageType.Info);
|
||||
DebugLog.DebugWrite($"Create Player : id<{id}>", MessageType.Info);
|
||||
player = new PlayerInfo(id);
|
||||
PlayerList.Add(player);
|
||||
return player;
|
||||
@ -35,20 +34,18 @@ namespace QSB.Player
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
public static void RemoveAllPlayers()
|
||||
{
|
||||
DebugLog.DebugWrite($"Removing all players.", MessageType.Info);
|
||||
DebugLog.DebugWrite($"Remove All Players", MessageType.Info);
|
||||
PlayerList.Clear();
|
||||
}
|
||||
|
||||
public static bool PlayerExists(uint id)
|
||||
{
|
||||
return id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id);
|
||||
}
|
||||
public static bool PlayerExists(uint id) =>
|
||||
id != uint.MaxValue && PlayerList.Any(x => x.PlayerId == id);
|
||||
|
||||
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)
|
||||
@ -77,73 +82,5 @@ namespace QSB.Player
|
||||
return id == LocalPlayerId ||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
@ -12,6 +12,5 @@ namespace QSB.Player
|
||||
Signalscope = 8,
|
||||
Translator = 16,
|
||||
ProbeActive = 32
|
||||
//Increment these in binary to add more states
|
||||
}
|
||||
}
|
@ -1,15 +1,16 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("FriendsInSpace")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyTitle("Quantum Space Buddies")]
|
||||
[assembly: AssemblyDescription("Multiplayer mod for Outer Wilds")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("FriendsInSpace")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyCompany("Henry Pointer, Aleksander Waage, Ricardo Lopes")]
|
||||
[assembly: AssemblyProduct("Quantum Space Buddies")]
|
||||
[assembly: AssemblyCopyright("Copyright © Henry Pointer, Aleksander Waage, Ricardo Lopes 2020-2021")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@ -32,4 +33,5 @@ using System.Runtime.InteropServices;
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: NeutralResourcesLanguage("en-GB")]
|
||||
|
@ -128,6 +128,8 @@
|
||||
<Compile Include="Animation\AnimFloatParam.cs" />
|
||||
<Compile Include="Animation\CrouchSync.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\ConversationMessage.cs" />
|
||||
<Compile Include="ConversationSync\ConversationPatches.cs" />
|
||||
@ -140,16 +142,16 @@
|
||||
<Compile Include="ElevatorSync\Events\ElevatorEvent.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorManager.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorPatches.cs" />
|
||||
<Compile Include="EventsCore\EventNames.cs" />
|
||||
<Compile Include="Events\EventNames.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="Instruments\QSBCamera\CameraController.cs" />
|
||||
<Compile Include="Instruments\QSBCamera\CameraManager.cs" />
|
||||
<Compile Include="Instruments\QSBCamera\CameraMode.cs" />
|
||||
<Compile Include="Instruments\InstrumentsManager.cs" />
|
||||
<Compile Include="MessagesCore\EnumMessage.cs" />
|
||||
<Compile Include="MessagesCore\FloatMessage.cs" />
|
||||
<Compile Include="Messaging\EnumMessage.cs" />
|
||||
<Compile Include="Messaging\FloatMessage.cs" />
|
||||
<Compile Include="OrbSync\Events\OrbSlotMessage.cs" />
|
||||
<Compile Include="OrbSync\OrbManager.cs" />
|
||||
<Compile Include="OrbSync\Events\OrbSlotEvent.cs" />
|
||||
@ -169,7 +171,6 @@
|
||||
<Compile Include="TimeSync\WakeUpPatches.cs" />
|
||||
<Compile Include="Tools\Events\PlayerFlashlightEvent.cs" />
|
||||
<Compile Include="Player\Events\PlayerJoinEvent.cs" />
|
||||
<Compile Include="Player\Events\PlayerLeaveEvent.cs" />
|
||||
<Compile Include="Tools\Events\PlayerProbeEvent.cs" />
|
||||
<Compile Include="Player\Events\PlayerReadyEvent.cs" />
|
||||
<Compile Include="TransformSync\NomaiOrbTransformSync.cs" />
|
||||
@ -180,13 +181,12 @@
|
||||
<Compile Include="GeyserSync\Events\GeyserEvent.cs" />
|
||||
<Compile Include="GeyserSync\GeyserManager.cs" />
|
||||
<Compile Include="GeyserSync\QSBGeyser.cs" />
|
||||
<Compile Include="Player\Events\PlayerLeaveMessage.cs" />
|
||||
<Compile Include="Tools\Events\PlayerProbeLauncherEvent.cs" />
|
||||
<Compile Include="Tools\Events\PlayerSignalscopeEvent.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="MessagesCore\ToggleMessage.cs" />
|
||||
<Compile Include="Messaging\ToggleMessage.cs" />
|
||||
<Compile Include="SectorSync\QSBSector.cs" />
|
||||
<Compile Include="SectorSync\QSBSectorManager.cs" />
|
||||
<Compile Include="TransformSync\TransformSync.cs" />
|
||||
@ -201,13 +201,13 @@
|
||||
<Compile Include="Tools\ToolType.cs" />
|
||||
<Compile Include="TransformSync\PlayerProbeSync.cs" />
|
||||
<Compile Include="Utility\DebugActions.cs" />
|
||||
<Compile Include="EventsCore\QSBEventManager.cs" />
|
||||
<Compile Include="Events\QSBEventManager.cs" />
|
||||
<Compile Include="Player\Events\PlayerStateMessage.cs" />
|
||||
<Compile Include="DeathSync\Necronomicon.cs" />
|
||||
<Compile Include="Utility\DebugLog.cs" />
|
||||
<Compile Include="MessagesCore\PlayerMessage.cs" />
|
||||
<Compile Include="MessagesCore\MessageHandler.cs" />
|
||||
<Compile Include="EventsCore\EventType.cs" />
|
||||
<Compile Include="Messaging\PlayerMessage.cs" />
|
||||
<Compile Include="Messaging\MessageHandler.cs" />
|
||||
<Compile Include="Events\EventType.cs" />
|
||||
<Compile Include="Player\PlayerInfo.cs" />
|
||||
<Compile Include="Player\State.cs" />
|
||||
<Compile Include="DeathSync\PreventShipDestruction.cs" />
|
||||
@ -217,7 +217,6 @@
|
||||
<Compile Include="Utility\FlagsHelper.cs" />
|
||||
<Compile Include="Player\PlayerHUDMarker.cs" />
|
||||
<Compile Include="Tools\PlayerToolsManager.cs" />
|
||||
<Compile Include="Tools\ProbePatches.cs" />
|
||||
<Compile Include="Utility\QuaternionHelper.cs" />
|
||||
<Compile Include="TimeSync\PreserveTimeScale.cs" />
|
||||
<Compile Include="TransformSync\ShipTransformSync.cs" />
|
||||
@ -225,10 +224,10 @@
|
||||
<Compile Include="TimeSync\Events\ServerTimeMessage.cs" />
|
||||
<Compile Include="TimeSync\WakeUpSync.cs" />
|
||||
<Compile Include="QSBNetworkManager.cs" />
|
||||
<Compile Include="QSB.cs" />
|
||||
<Compile Include="QSBCore.cs" />
|
||||
<Compile Include="TransformSync\PlayerTransformSync.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="WorldSync\WorldRegistry.cs" />
|
||||
<Compile Include="WorldSync\QSBWorldSync.cs" />
|
||||
<Compile Include="WorldSync\WorldObject.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
@ -9,13 +9,14 @@ using QSB.Patches;
|
||||
using QSB.SectorSync;
|
||||
using QSB.TimeSync;
|
||||
using QSB.Utility;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET.Components;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
namespace QSB
|
||||
{
|
||||
public class QSB : ModBehaviour
|
||||
public class QSBCore : ModBehaviour
|
||||
{
|
||||
public static IModBehaviour ModBehaviour { 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 InstrumentAssetBundle { get; private set; }
|
||||
public static bool HasWokenUp { get; set; }
|
||||
public static bool IsServer => QSBNetworkServer.active;
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Application.runInBackground = true;
|
||||
|
||||
@ -39,7 +41,7 @@ namespace QSB
|
||||
LogFilter.currentLogLevel = LogFilter.Debug;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
public void Start()
|
||||
{
|
||||
Helper = ModHelper;
|
||||
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"));
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
public void Update() =>
|
||||
QSBNetworkIdentity.UNetStaticUpdate();
|
||||
}
|
||||
|
||||
public override void Configure(IModConfig config)
|
||||
{
|
@ -7,15 +7,10 @@ namespace QSB
|
||||
public class QSBInputManager : MonoBehaviour
|
||||
{
|
||||
public static event InputEvent ChertTaunt;
|
||||
|
||||
public static event InputEvent EskerTaunt;
|
||||
|
||||
public static event InputEvent RiebeckTaunt;
|
||||
|
||||
public static event InputEvent GabbroTaunt;
|
||||
|
||||
public static event InputEvent FeldsparTaunt;
|
||||
|
||||
public static event InputEvent ExitTaunt;
|
||||
|
||||
// TODO : finish instruments - disabled for 0.7.0 release
|
||||
|
@ -36,11 +36,11 @@ namespace QSB
|
||||
"Jinha"
|
||||
};
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
PlayerName = GetPlayerName();
|
||||
CanEditName = true;
|
||||
QSB.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update");
|
||||
QSBCore.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update");
|
||||
}
|
||||
|
||||
private string GetPlayerName()
|
||||
@ -54,7 +54,7 @@ namespace QSB
|
||||
: _defaultNames.OrderBy(x => Guid.NewGuid()).First();
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
public void OnGUI()
|
||||
{
|
||||
GUI.Label(new Rect(10, 10, 200f, 20f), "Name:");
|
||||
if (CanEditName)
|
||||
|
@ -3,7 +3,7 @@ using OWML.ModHelper.Events;
|
||||
using QSB.Animation;
|
||||
using QSB.DeathSync;
|
||||
using QSB.ElevatorSync;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.GeyserSync;
|
||||
using QSB.Instruments;
|
||||
using QSB.OrbSync;
|
||||
@ -25,93 +25,68 @@ namespace QSB
|
||||
{
|
||||
public class QSBNetworkManager : QSBNetworkManagerUNET
|
||||
{
|
||||
private const int MaxConnections = 128;
|
||||
private const int MaxBufferedPackets = 64;
|
||||
|
||||
public static QSBNetworkManager Instance { get; private set; }
|
||||
|
||||
public event Action OnNetworkManagerReady;
|
||||
|
||||
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 AssetBundle _assetBundle;
|
||||
private GameObject _shipPrefab;
|
||||
private GameObject _cameraPrefab;
|
||||
private GameObject _probePrefab;
|
||||
public GameObject OrbPrefab;
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
|
||||
_lobby = gameObject.AddComponent<QSBNetworkLobby>();
|
||||
_assetBundle = QSB.NetworkAssetBundle;
|
||||
_assetBundle = QSBCore.NetworkAssetBundle;
|
||||
|
||||
playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab");
|
||||
var ident = playerPrefab.AddComponent<QSBNetworkIdentity>();
|
||||
ident.LocalPlayerAuthority = true;
|
||||
ident.SetValue("m_AssetId", playerPrefab.GetComponent<NetworkIdentity>().assetId);
|
||||
ident.SetValue("m_SceneId", playerPrefab.GetComponent<NetworkIdentity>().sceneId);
|
||||
SetupNetworkId(playerPrefab);
|
||||
Destroy(playerPrefab.GetComponent<NetworkTransform>());
|
||||
Destroy(playerPrefab.GetComponent<NetworkIdentity>());
|
||||
var transform = playerPrefab.AddComponent<QSBNetworkTransform>();
|
||||
transform.SendInterval = 0.1f;
|
||||
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
|
||||
SetupNetworkTransform(playerPrefab);
|
||||
playerPrefab.AddComponent<PlayerTransformSync>();
|
||||
playerPrefab.AddComponent<AnimationSync>();
|
||||
playerPrefab.AddComponent<WakeUpSync>();
|
||||
playerPrefab.AddComponent<InstrumentsManager>();
|
||||
|
||||
_shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");
|
||||
ident = _shipPrefab.AddComponent<QSBNetworkIdentity>();
|
||||
ident.LocalPlayerAuthority = true;
|
||||
ident.SetValue("m_AssetId", _shipPrefab.GetComponent<NetworkIdentity>().assetId);
|
||||
ident.SetValue("m_SceneId", _shipPrefab.GetComponent<NetworkIdentity>().sceneId);
|
||||
SetupNetworkId(_shipPrefab);
|
||||
Destroy(_shipPrefab.GetComponent<NetworkTransform>());
|
||||
Destroy(_shipPrefab.GetComponent<NetworkIdentity>());
|
||||
transform = _shipPrefab.AddComponent<QSBNetworkTransform>();
|
||||
transform.SendInterval = 0.1f;
|
||||
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
|
||||
SetupNetworkTransform(_shipPrefab);
|
||||
_shipPrefab.AddComponent<ShipTransformSync>();
|
||||
spawnPrefabs.Add(_shipPrefab);
|
||||
|
||||
_cameraPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkcameraroot.prefab");
|
||||
ident = _cameraPrefab.AddComponent<QSBNetworkIdentity>();
|
||||
ident.LocalPlayerAuthority = true;
|
||||
ident.SetValue("m_AssetId", _cameraPrefab.GetComponent<NetworkIdentity>().assetId);
|
||||
ident.SetValue("m_SceneId", _cameraPrefab.GetComponent<NetworkIdentity>().sceneId);
|
||||
SetupNetworkId(_cameraPrefab);
|
||||
Destroy(_cameraPrefab.GetComponent<NetworkTransform>());
|
||||
Destroy(_cameraPrefab.GetComponent<NetworkIdentity>());
|
||||
transform = _cameraPrefab.AddComponent<QSBNetworkTransform>();
|
||||
transform.SendInterval = 0.1f;
|
||||
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
|
||||
SetupNetworkTransform(_cameraPrefab);
|
||||
_cameraPrefab.AddComponent<PlayerCameraSync>();
|
||||
spawnPrefabs.Add(_cameraPrefab);
|
||||
|
||||
_probePrefab = _assetBundle.LoadAsset<GameObject>("assets/networkprobe.prefab");
|
||||
ident = _probePrefab.AddComponent<QSBNetworkIdentity>();
|
||||
ident.LocalPlayerAuthority = true;
|
||||
ident.SetValue("m_AssetId", _probePrefab.GetComponent<NetworkIdentity>().assetId);
|
||||
ident.SetValue("m_SceneId", _probePrefab.GetComponent<NetworkIdentity>().sceneId);
|
||||
SetupNetworkId(_probePrefab);
|
||||
Destroy(_probePrefab.GetComponent<NetworkTransform>());
|
||||
Destroy(_probePrefab.GetComponent<NetworkIdentity>());
|
||||
transform = _probePrefab.AddComponent<QSBNetworkTransform>();
|
||||
transform.SendInterval = 0.1f;
|
||||
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
|
||||
SetupNetworkTransform(_probePrefab);
|
||||
_probePrefab.AddComponent<PlayerProbeSync>();
|
||||
spawnPrefabs.Add(_probePrefab);
|
||||
|
||||
OrbPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkorb.prefab");
|
||||
ident = OrbPrefab.AddComponent<QSBNetworkIdentity>();
|
||||
ident.LocalPlayerAuthority = true;
|
||||
ident.SetValue("m_AssetId", OrbPrefab.GetComponent<NetworkIdentity>().assetId);
|
||||
ident.SetValue("m_SceneId", OrbPrefab.GetComponent<NetworkIdentity>().sceneId);
|
||||
SetupNetworkId(OrbPrefab);
|
||||
Destroy(OrbPrefab.GetComponent<NetworkTransform>());
|
||||
Destroy(OrbPrefab.GetComponent<NetworkIdentity>());
|
||||
transform = OrbPrefab.AddComponent<QSBNetworkTransform>();
|
||||
transform.SendInterval = 0.1f;
|
||||
transform.SyncRotationAxis = QSBNetworkTransform.AxisSyncMode.AxisXYZ;
|
||||
SetupNetworkTransform(OrbPrefab);
|
||||
OrbPrefab.AddComponent<NomaiOrbTransformSync>();
|
||||
spawnPrefabs.Add(OrbPrefab);
|
||||
|
||||
@ -119,22 +94,36 @@ namespace QSB
|
||||
QSBSceneManager.OnUniverseSceneLoaded += OnSceneLoaded;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
=> QSBSceneManager.OnUniverseSceneLoaded -= OnSceneLoaded;
|
||||
private void SetupNetworkId(GameObject go)
|
||||
{
|
||||
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)
|
||||
{
|
||||
DebugLog.DebugWrite("scene loaded");
|
||||
OrbManager.Instance.BuildOrbs();
|
||||
OrbManager.Instance.QueueBuildSlots();
|
||||
WorldRegistry.OldDialogueTrees.Clear();
|
||||
WorldRegistry.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList();
|
||||
QSBWorldSync.OldDialogueTrees.Clear();
|
||||
QSBWorldSync.OldDialogueTrees = Resources.FindObjectsOfTypeAll<CharacterDialogueTree>().ToList();
|
||||
}
|
||||
|
||||
private void ConfigureNetworkManager()
|
||||
{
|
||||
networkAddress = QSB.DefaultServerIP;
|
||||
networkPort = QSB.Port;
|
||||
networkAddress = QSBCore.DefaultServerIP;
|
||||
networkPort = QSBCore.Port;
|
||||
maxConnections = MaxConnections;
|
||||
customConfig = true;
|
||||
connectionConfig.AddChannel(QosType.Reliable);
|
||||
@ -149,19 +138,19 @@ namespace QSB
|
||||
public override void OnStartServer()
|
||||
{
|
||||
DebugLog.DebugWrite("OnStartServer", MessageType.Info);
|
||||
if (WorldRegistry.OrbSyncList.Count == 0 && QSBSceneManager.IsInUniverse)
|
||||
if (QSBWorldSync.OrbSyncList.Count == 0 && QSBSceneManager.IsInUniverse)
|
||||
{
|
||||
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
|
||||
{
|
||||
DebugLog.DebugWrite("OnServerAddPlayer", MessageType.Info);
|
||||
DebugLog.DebugWrite($"OnServerAddPlayer {playerControllerId}", MessageType.Info);
|
||||
base.OnServerAddPlayer(connection, playerControllerId);
|
||||
|
||||
QSBNetworkServer.SpawnWithClientAuthority(Instantiate(_shipPrefab), connection);
|
||||
@ -174,6 +163,8 @@ namespace QSB
|
||||
DebugLog.DebugWrite("OnClientConnect", MessageType.Info);
|
||||
base.OnClientConnect(connection);
|
||||
|
||||
QSBEventManager.Init();
|
||||
|
||||
gameObject.AddComponent<SectorSync.SectorSync>();
|
||||
gameObject.AddComponent<RespawnOnDeath>();
|
||||
gameObject.AddComponent<PreventShipDestruction>();
|
||||
@ -196,13 +187,14 @@ namespace QSB
|
||||
OnNetworkManagerReady?.Invoke();
|
||||
IsReady = true;
|
||||
|
||||
QSB.Helper.Events.Unity.RunWhen(() => PlayerTransformSync.LocalInstance != null, QSBEventManager.Init);
|
||||
|
||||
QSB.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready,
|
||||
QSBCore.Helper.Events.Unity.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null,
|
||||
() => 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));
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnStopClient() // Called on the client when closing connection
|
||||
@ -215,30 +207,24 @@ namespace QSB
|
||||
QSBEventManager.Reset();
|
||||
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
|
||||
|
||||
foreach (var player in QSBPlayerManager.PlayerList)
|
||||
{
|
||||
QSBPlayerManager.GetPlayerNetIds(player).ForEach(CleanupNetworkBehaviour);
|
||||
}
|
||||
QSBPlayerManager.RemoveAllPlayers();
|
||||
|
||||
WorldRegistry.RemoveObjects<QSBOrbSlot>();
|
||||
WorldRegistry.RemoveObjects<QSBElevator>();
|
||||
WorldRegistry.RemoveObjects<QSBGeyser>();
|
||||
WorldRegistry.RemoveObjects<QSBSector>();
|
||||
WorldRegistry.OrbSyncList.Clear();
|
||||
WorldRegistry.OldDialogueTrees.Clear();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBElevator>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBSector>();
|
||||
QSBWorldSync.OrbSyncList.Clear();
|
||||
QSBWorldSync.OldDialogueTrees.Clear();
|
||||
|
||||
_lobby.CanEditName = true;
|
||||
}
|
||||
|
||||
public override void OnServerDisconnect(QSBNetworkConnection connection) // Called on the server when any client disconnects
|
||||
{
|
||||
base.OnServerDisconnect(connection);
|
||||
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>();
|
||||
if (identity.ClientAuthorityOwner == connection)
|
||||
@ -246,9 +232,6 @@ namespace QSB
|
||||
identity.RemoveClientAuthority(connection);
|
||||
}
|
||||
}
|
||||
|
||||
player.HudMarker?.Remove();
|
||||
CleanupConnection(connection);
|
||||
}
|
||||
|
||||
public override void OnStopServer()
|
||||
@ -258,63 +241,15 @@ namespace QSB
|
||||
Destroy(GetComponent<RespawnOnDeath>());
|
||||
Destroy(GetComponent<PreventShipDestruction>());
|
||||
QSBEventManager.Reset();
|
||||
DebugLog.ToConsole("[S] Server stopped!", MessageType.Info);
|
||||
DebugLog.ToConsole("Server stopped!", MessageType.Info);
|
||||
QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove());
|
||||
QSBNetworkServer.connections.ToList().ForEach(CleanupConnection);
|
||||
|
||||
WorldRegistry.RemoveObjects<QSBOrbSlot>();
|
||||
WorldRegistry.RemoveObjects<QSBElevator>();
|
||||
WorldRegistry.RemoveObjects<QSBGeyser>();
|
||||
WorldRegistry.RemoveObjects<QSBSector>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBOrbSlot>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBElevator>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBGeyser>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBSector>();
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -31,7 +31,7 @@ namespace QSB
|
||||
}
|
||||
}
|
||||
|
||||
private static bool InUniverse(OWScene scene)
|
||||
=> scene == OWScene.SolarSystem || scene == OWScene.EyeOfTheUniverse;
|
||||
private static bool InUniverse(OWScene scene) =>
|
||||
scene == OWScene.SolarSystem || scene == OWScene.EyeOfTheUniverse;
|
||||
}
|
||||
}
|
@ -17,14 +17,14 @@ namespace QSB.SectorSync
|
||||
Sector.Name.Ship
|
||||
};
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
QSBSceneManager.OnUniverseSceneLoaded += (OWScene scene) => RebuildSectors();
|
||||
DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success);
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
public void OnDestroy()
|
||||
{
|
||||
QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => RebuildSectors();
|
||||
}
|
||||
@ -32,20 +32,20 @@ namespace QSB.SectorSync
|
||||
public void RebuildSectors()
|
||||
{
|
||||
DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning);
|
||||
WorldRegistry.RemoveObjects<QSBSector>();
|
||||
QSBWorldSync.RemoveWorldObjects<QSBSector>();
|
||||
var sectors = Resources.FindObjectsOfTypeAll<Sector>().ToList();
|
||||
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);
|
||||
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))
|
||||
.OrderBy(sector => Vector3.Distance(sector.Position, trans.position))
|
||||
.First();
|
||||
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
@ -21,7 +21,8 @@ namespace QSB.SectorSync
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@ -41,9 +42,7 @@ namespace QSB.SectorSync
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
|
||||
namespace QSB.TimeSync.Events
|
||||
{
|
||||
@ -7,7 +7,6 @@ namespace QSB.TimeSync.Events
|
||||
public override EventType Type => EventType.ServerTime;
|
||||
|
||||
public override void SetupListener() => GlobalMessenger<float, int>.AddListener(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));
|
||||
@ -19,9 +18,7 @@ namespace QSB.TimeSync.Events
|
||||
LoopCount = count
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ServerTimeMessage message)
|
||||
{
|
||||
public override void OnReceiveRemote(bool server, ServerTimeMessage message) =>
|
||||
WakeUpSync.LocalInstance.OnClientReceiveMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
@ -5,9 +5,9 @@ namespace QSB.TimeSync
|
||||
{
|
||||
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
|
||||
if (IsServer)
|
||||
|
@ -2,8 +2,8 @@
|
||||
{
|
||||
public enum TimeSyncType
|
||||
{
|
||||
None,
|
||||
Pausing,
|
||||
Fastforwarding
|
||||
None = 0,
|
||||
Pausing = 1,
|
||||
Fastforwarding = 2
|
||||
}
|
||||
}
|
@ -15,7 +15,7 @@ namespace QSB.TimeSync
|
||||
private bool _isSetUp;
|
||||
private TimeSyncType _currentType;
|
||||
|
||||
private void Awake()
|
||||
public void Awake()
|
||||
{
|
||||
Instance = this;
|
||||
enabled = false;
|
||||
@ -32,7 +32,7 @@ namespace QSB.TimeSync
|
||||
_canvas.enabled = false;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
public void OnDestroy()
|
||||
{
|
||||
QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoad;
|
||||
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)
|
||||
{
|
||||
@ -75,7 +77,7 @@ namespace QSB.TimeSync
|
||||
switch (_currentType)
|
||||
{
|
||||
case TimeSyncType.Fastforwarding:
|
||||
text = $"{minutes.ToString("D2")}:{seconds.ToString("D2")}"
|
||||
text = $"{minutes:D2}:{seconds:D2}"
|
||||
+ Environment.NewLine
|
||||
+ "Fast-forwarding to match server time...";
|
||||
break;
|
||||
|
@ -1,4 +1,5 @@
|
||||
using OWML.ModHelper.Events;
|
||||
using QSB.Patches;
|
||||
|
||||
namespace QSB.TimeSync
|
||||
{
|
||||
@ -17,7 +18,7 @@ namespace QSB.TimeSync
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
QSB.Helper.HarmonyHelper.AddPrefix<PlayerCameraEffectController>("OnStartOfTimeLoop", typeof(WakeUpPatches), nameof(OnStartOfTimeLoopPrefix));
|
||||
QSBCore.Helper.HarmonyHelper.AddPrefix<PlayerCameraEffectController>("OnStartOfTimeLoop", typeof(WakeUpPatches), nameof(OnStartOfTimeLoopPrefix));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
using QSB.DeathSync;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.TimeSync.Events;
|
||||
using QuantumUNET;
|
||||
using UnityEngine;
|
||||
@ -32,7 +32,7 @@ namespace QSB.TimeSync
|
||||
LocalInstance = this;
|
||||
}
|
||||
|
||||
private void Start()
|
||||
public void Start()
|
||||
{
|
||||
if (!IsLocalPlayer)
|
||||
{
|
||||
@ -53,11 +53,11 @@ namespace QSB.TimeSync
|
||||
{
|
||||
if (QSBNetworkServer.active)
|
||||
{
|
||||
QSB.HasWokenUp = true;
|
||||
QSBCore.HasWokenUp = true;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
public void OnDestroy()
|
||||
{
|
||||
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
|
||||
GlobalMessenger.RemoveListener(EventNames.RestartTimeLoop, OnLoopStart);
|
||||
@ -66,7 +66,7 @@ namespace QSB.TimeSync
|
||||
|
||||
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
|
||||
{
|
||||
QSB.HasWokenUp = (scene == OWScene.EyeOfTheUniverse);
|
||||
QSBCore.HasWokenUp = (scene == OWScene.EyeOfTheUniverse);
|
||||
if (isInUniverse)
|
||||
{
|
||||
Init();
|
||||
@ -164,7 +164,7 @@ namespace QSB.TimeSync
|
||||
EnableInput();
|
||||
}
|
||||
_isFirstFastForward = false;
|
||||
QSB.HasWokenUp = true;
|
||||
QSBCore.HasWokenUp = true;
|
||||
Physics.SyncTransforms();
|
||||
SpinnerUI.Hide();
|
||||
TimeSyncUI.Stop();
|
||||
@ -184,7 +184,7 @@ namespace QSB.TimeSync
|
||||
OWInput.ChangeInputMode(InputMode.Character);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (IsServer)
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
|
||||
}
|
||||
|
||||
private void HandleTurnOn() => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleTurnOff() => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.UpdateState(State.Flashlight, 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
|
||||
}
|
||||
|
||||
private void HandleLaunch(SurveyorProbe probe) => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleRetrieve(SurveyorProbe probe) => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.UpdateState(State.ProbeActive, 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
|
||||
}
|
||||
|
||||
private void HandleEquip(ProbeLauncher var) => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleUnequip(ProbeLauncher var) => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.UpdateState(State.ProbeLauncher, 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
|
||||
}
|
||||
|
||||
private void HandleEquip(Signalscope var) => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleUnequip() => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.UpdateState(State.Signalscope, 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
@ -21,7 +21,6 @@ namespace QSB.Tools.Events
|
||||
}
|
||||
|
||||
private void HandleEquip() => SendEvent(CreateMessage(true));
|
||||
|
||||
private void HandleUnequip() => SendEvent(CreateMessage(false));
|
||||
|
||||
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
|
||||
@ -30,16 +29,14 @@ namespace QSB.Tools.Events
|
||||
ToggleValue = value
|
||||
};
|
||||
|
||||
public override void OnReceiveRemote(ToggleMessage message)
|
||||
public override void OnReceiveRemote(bool server, ToggleMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
player.UpdateState(State.Translator, 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -59,7 +59,7 @@ namespace QSB.Tools
|
||||
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"));
|
||||
flashlightRoot.SetActive(false);
|
||||
@ -72,11 +72,9 @@ namespace QSB.Tools
|
||||
flashlightRoot.transform.parent = cameraBody;
|
||||
flashlightRoot.transform.localPosition = FlashlightOffset;
|
||||
flashlightRoot.SetActive(true);
|
||||
|
||||
return flashlightRoot;
|
||||
}
|
||||
|
||||
private static GameObject CreateSignalscope(Transform cameraBody)
|
||||
private static void CreateSignalscope(Transform cameraBody)
|
||||
{
|
||||
var signalscopeRoot = Object.Instantiate(GameObject.Find("Signalscope"));
|
||||
signalscopeRoot.SetActive(false);
|
||||
@ -101,11 +99,9 @@ namespace QSB.Tools
|
||||
signalscopeRoot.transform.localPosition = Vector3.zero;
|
||||
signalscopeRoot.transform.localScale = SignalscopeScale;
|
||||
signalscopeRoot.SetActive(true);
|
||||
|
||||
return signalscopeRoot;
|
||||
}
|
||||
|
||||
private static GameObject CreateTranslator(Transform cameraBody)
|
||||
private static void CreateTranslator(Transform cameraBody)
|
||||
{
|
||||
var original = GameObject.Find("NomaiTranslatorProp");
|
||||
|
||||
@ -141,12 +137,10 @@ namespace QSB.Tools
|
||||
translatorRoot.transform.parent = cameraBody;
|
||||
translatorRoot.transform.localPosition = Vector3.zero;
|
||||
translatorRoot.transform.localScale = TranslatorScale;
|
||||
QSB.Helper.Events.Unity.FireOnNextUpdate(() => translatorRoot.SetActive(true));
|
||||
|
||||
return translatorRoot;
|
||||
QSBCore.Helper.Events.Unity.FireOnNextUpdate(() => translatorRoot.SetActive(true));
|
||||
}
|
||||
|
||||
private static GameObject CreateProbeLauncher(Transform cameraBody)
|
||||
private static void CreateProbeLauncher(Transform cameraBody)
|
||||
{
|
||||
var launcherRoot = new GameObject("ProbeLauncher");
|
||||
var modelOrig = GameObject.Find("PlayerCamera/ProbeLauncher/Props_HEA_ProbeLauncher");
|
||||
@ -182,13 +176,9 @@ namespace QSB.Tools
|
||||
launcherRoot.transform.parent = cameraBody;
|
||||
launcherRoot.transform.localPosition = ProbeLauncherOffset;
|
||||
launcherRoot.SetActive(true);
|
||||
|
||||
return launcherRoot;
|
||||
}
|
||||
|
||||
private static MeshRenderer GetRenderer(GameObject root, string gameObjectName)
|
||||
{
|
||||
return root.GetComponentsInChildren<MeshRenderer>(true).First(x => x.name == gameObjectName);
|
||||
}
|
||||
private static MeshRenderer GetRenderer(GameObject root, string gameObjectName) =>
|
||||
root.GetComponentsInChildren<MeshRenderer>(true).First(x => x.name == gameObjectName);
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@ -14,7 +14,7 @@ namespace QSB.Tools
|
||||
private Vector3 _baseForward;
|
||||
private Quaternion _baseRotation;
|
||||
|
||||
private void Start()
|
||||
public void Start()
|
||||
{
|
||||
_baseForward = _basePivot.forward;
|
||||
_baseRotation = _basePivot.rotation;
|
||||
@ -78,9 +78,9 @@ namespace QSB.Tools
|
||||
_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 b = lhs * _baseRotation;
|
||||
_baseRotation = Quaternion.Slerp(_baseRotation, b, 6f * Time.deltaTime);
|
||||
|
@ -9,22 +9,10 @@ namespace QSB.Tools
|
||||
{
|
||||
if (state)
|
||||
{
|
||||
Activate();
|
||||
gameObject.SetActive(true);
|
||||
gameObject.Show();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Deactivate();
|
||||
}
|
||||
}
|
||||
|
||||
private void Activate()
|
||||
{
|
||||
gameObject.SetActive(true);
|
||||
gameObject.Show();
|
||||
}
|
||||
|
||||
private void Deactivate()
|
||||
{
|
||||
gameObject.Hide();
|
||||
}
|
||||
}
|
||||
|
@ -31,26 +31,17 @@ namespace QSB.Tools
|
||||
set => _arrivalDegrees = value;
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
ToolGameObject?.SetActive(true);
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
ToolGameObject?.SetActive(false);
|
||||
}
|
||||
public void OnEnable() => ToolGameObject?.SetActive(true);
|
||||
public void OnDisable() => ToolGameObject?.SetActive(false);
|
||||
|
||||
public void ChangeEquipState(bool equipState)
|
||||
{
|
||||
if (equipState)
|
||||
{
|
||||
EquipTool();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
UnequipTool();
|
||||
}
|
||||
UnequipTool();
|
||||
}
|
||||
}
|
||||
}
|
@ -2,8 +2,8 @@
|
||||
{
|
||||
public enum ToolType
|
||||
{
|
||||
Signalscope,
|
||||
ProbeLauncher,
|
||||
Translator
|
||||
Signalscope = 0,
|
||||
ProbeLauncher = 1,
|
||||
Translator = 2
|
||||
}
|
||||
}
|
@ -9,7 +9,7 @@ namespace QSB.TransformSync
|
||||
public NomaiInterfaceOrb AttachedOrb { 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 _isReady;
|
||||
@ -18,20 +18,20 @@ namespace QSB.TransformSync
|
||||
public override void OnStartClient()
|
||||
{
|
||||
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()
|
||||
{
|
||||
AttachedOrb = WorldRegistry.OldOrbList[Index];
|
||||
AttachedOrb = QSBWorldSync.OldOrbList[Index];
|
||||
_isReady = true;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
public void OnDestroy()
|
||||
{
|
||||
WorldRegistry.OrbSyncList.Remove(this);
|
||||
QSBWorldSync.OrbSyncList.Remove(this);
|
||||
}
|
||||
|
||||
protected void Init()
|
||||
@ -41,7 +41,7 @@ namespace QSB.TransformSync
|
||||
_isInitialized = true;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (!_isInitialized && _isReady)
|
||||
{
|
||||
|
@ -1,5 +1,4 @@
|
||||
using OWML.Common;
|
||||
using QSB.EventsCore;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.Tools;
|
||||
using QSB.Utility;
|
||||
@ -9,14 +8,6 @@ namespace QSB.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()
|
||||
{
|
||||
var body = Locator.GetPlayerCamera().gameObject.transform;
|
||||
|
@ -8,20 +8,10 @@ namespace QSB.TransformSync
|
||||
{
|
||||
public class PlayerProbeSync : TransformSync
|
||||
{
|
||||
public static PlayerProbeSync LocalInstance { get; private set; }
|
||||
|
||||
private Transform _disabledSocket;
|
||||
|
||||
public override void OnStartLocalPlayer()
|
||||
{
|
||||
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
|
||||
LocalInstance = this;
|
||||
}
|
||||
|
||||
private Transform GetProbe()
|
||||
{
|
||||
return Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry");
|
||||
}
|
||||
private Transform GetProbe() =>
|
||||
Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry");
|
||||
|
||||
protected override Transform InitLocalTransform()
|
||||
{
|
||||
@ -50,16 +40,13 @@ namespace QSB.TransformSync
|
||||
|
||||
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;
|
||||
|
||||
return body;
|
||||
}
|
||||
|
||||
private void SetSocket(Transform socket)
|
||||
{
|
||||
_disabledSocket = socket;
|
||||
}
|
||||
private void SetSocket(Transform socket) => _disabledSocket = socket;
|
||||
|
||||
protected override void UpdateTransform()
|
||||
{
|
||||
|
@ -1,8 +1,6 @@
|
||||
using OWML.Common;
|
||||
using QSB.Animation;
|
||||
using QSB.Animation;
|
||||
using QSB.Instruments;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.TransformSync
|
||||
@ -11,22 +9,20 @@ namespace QSB.TransformSync
|
||||
{
|
||||
public static PlayerTransformSync LocalInstance { get; private set; }
|
||||
|
||||
static PlayerTransformSync()
|
||||
{
|
||||
DebugLog.DebugWrite("Constructor", MessageType.Info);
|
||||
AnimControllerPatch.Init();
|
||||
}
|
||||
static PlayerTransformSync() => AnimControllerPatch.Init();
|
||||
|
||||
public override void OnStartLocalPlayer()
|
||||
{
|
||||
DebugLog.DebugWrite("OnStartLocalPlayer", MessageType.Info);
|
||||
public override void OnStartLocalPlayer() =>
|
||||
LocalInstance = this;
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
Player.HudMarker?.Remove();
|
||||
QSBPlayerManager.RemovePlayer(PlayerId);
|
||||
}
|
||||
|
||||
private Transform GetPlayerModel()
|
||||
{
|
||||
return Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");
|
||||
}
|
||||
private Transform GetPlayerModel() =>
|
||||
Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2");
|
||||
|
||||
protected override Transform InitLocalTransform()
|
||||
{
|
||||
|
@ -1,29 +1,14 @@
|
||||
using OWML.Common;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using QSB.Player;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.TransformSync
|
||||
{
|
||||
public class ShipTransformSync : TransformSync
|
||||
{
|
||||
public static ShipTransformSync LocalInstance { get; private set; }
|
||||
private Transform GetShipModel() => Locator.GetShipTransform();
|
||||
|
||||
public override void OnStartLocalPlayer()
|
||||
{
|
||||
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 InitLocalTransform() =>
|
||||
GetShipModel().Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior");
|
||||
|
||||
protected override Transform InitRemoteTransform()
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using QSB.Player;
|
||||
using QSB.SectorSync;
|
||||
using QSB.Utility;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.TransformSync
|
||||
@ -11,7 +12,6 @@ namespace QSB.TransformSync
|
||||
public abstract bool IsReady { get; }
|
||||
|
||||
protected abstract Transform InitLocalTransform();
|
||||
|
||||
protected abstract Transform InitRemoteTransform();
|
||||
|
||||
public Transform SyncedTransform { get; private set; }
|
||||
@ -23,33 +23,38 @@ namespace QSB.TransformSync
|
||||
private Quaternion _rotationSmoothVelocity;
|
||||
private bool _isVisible;
|
||||
|
||||
protected virtual void Awake()
|
||||
protected override void Start()
|
||||
{
|
||||
DebugLog.DebugWrite($"Awake of {GetType().Name}", MessageType.Info);
|
||||
QSBPlayerManager.PlayerSyncObjects.Add(this);
|
||||
base.Start();
|
||||
var lowestBound = QSBPlayerManager.GetSyncObjects<PlayerTransformSync>().Where(x => x.NetId.Value <= NetId.Value).OrderBy(x => x.NetId.Value).Last();
|
||||
NetIdentity.SetRootIdentity(lowestBound.NetIdentity);
|
||||
|
||||
DontDestroyOnLoad(gameObject);
|
||||
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;
|
||||
}
|
||||
|
||||
protected virtual void OnDestroy()
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
if (!HasAuthority && SyncedTransform != null)
|
||||
{
|
||||
Destroy(SyncedTransform.gameObject);
|
||||
}
|
||||
QSBSceneManager.OnSceneLoaded -= OnSceneLoaded;
|
||||
}
|
||||
|
||||
private void OnSceneLoaded(OWScene scene, bool isInUniverse)
|
||||
{
|
||||
private void OnSceneLoaded(OWScene scene, bool isInUniverse) =>
|
||||
_isInitialized = false;
|
||||
}
|
||||
|
||||
protected void Init()
|
||||
{
|
||||
DebugLog.DebugWrite($"Init of {AttachedNetId} ({Player.PlayerId}.{GetType().Name})");
|
||||
SyncedTransform = HasAuthority ? InitLocalTransform() : InitRemoteTransform();
|
||||
SetReferenceSector(QSBSectorManager.Instance.GetClosestSector(SyncedTransform));
|
||||
_isInitialized = true;
|
||||
_isVisible = true;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (!_isInitialized && IsReady)
|
||||
{
|
||||
|
@ -24,9 +24,9 @@ namespace QSB.Utility
|
||||
bridgeVolume.AddObjectToVolume(Locator.GetPlayerCameraDetector());
|
||||
}
|
||||
|
||||
private void Update()
|
||||
public void Update()
|
||||
{
|
||||
if (!QSB.DebugMode)
|
||||
if (!QSBCore.DebugMode)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -40,7 +40,7 @@ namespace QSB.Utility
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.Keypad3))
|
||||
{
|
||||
LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToWhite, 1f, true);
|
||||
LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToWhite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ namespace QSB.Utility
|
||||
{
|
||||
// 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
|
||||
var console = (ModSocketOutput)QSB.Helper.Console;
|
||||
var console = (ModSocketOutput)QSBCore.Helper.Console;
|
||||
var method = console.GetType()
|
||||
.GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
|
||||
.Last(x => x.Name == "WriteLine");
|
||||
@ -37,7 +37,7 @@ namespace QSB.Utility
|
||||
|
||||
public static void DebugWrite(string message, MessageType type = MessageType.Message)
|
||||
{
|
||||
if (QSB.DebugMode)
|
||||
if (QSBCore.DebugMode)
|
||||
{
|
||||
ToConsole(message, type);
|
||||
}
|
||||
|
@ -25,9 +25,7 @@ namespace QSB.Utility
|
||||
return copy;
|
||||
}
|
||||
|
||||
public static Transform InstantiateInactive(this Transform original)
|
||||
{
|
||||
return original.gameObject.InstantiateInactive().transform;
|
||||
}
|
||||
public static Transform InstantiateInactive(this Transform original) =>
|
||||
original.gameObject.InstantiateInactive().transform;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
85
QSB/WorldSync/QSBWorldSync.cs
Normal file
85
QSB/WorldSync/QSBWorldSync.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -21,6 +21,8 @@ namespace QuantumUNET.Components
|
||||
public short PlayerControllerId { get; private set; } = -1;
|
||||
public QSBNetworkConnection ConnectionToServer { 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
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
if (!m_AssetId.IsValid() || m_AssetId.Equals(newAssetId))
|
||||
@ -961,11 +979,13 @@ namespace QuantumUNET.Components
|
||||
private bool m_LocalPlayerAuthority;
|
||||
|
||||
private bool m_IsServer;
|
||||
|
||||
private QSBNetworkBehaviour[] m_NetworkBehaviours;
|
||||
|
||||
private HashSet<int> m_ObserverConnections;
|
||||
|
||||
private List<QSBNetworkConnection> m_Observers;
|
||||
|
||||
private bool m_Reset = false;
|
||||
|
||||
private static uint s_NextNetworkId = 1U;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user