cleanup + fixes

This commit is contained in:
Mister_Nebula 2020-09-06 09:07:31 +01:00
parent d3334e3a77
commit 7b65d7a54a
12 changed files with 133 additions and 37 deletions

View File

@ -16,6 +16,7 @@
public static string UnequipTranslator = "UnequipTranslator"; public static string UnequipTranslator = "UnequipTranslator";
public static string ExitShip = "ExitShip"; public static string ExitShip = "ExitShip";
public static string RestartTimeLoop = "RestartTimeLoop"; public static string RestartTimeLoop = "RestartTimeLoop";
public static string WakeUp = "WakeUp";
public static string QSBPlayerDeath = "QSBPlayerDeath"; public static string QSBPlayerDeath = "QSBPlayerDeath";
public static string QSBPlayerJoin = "QSBPlayerJoin"; public static string QSBPlayerJoin = "QSBPlayerJoin";

View File

@ -1,6 +1,6 @@
using QSB.Events; using QSB.Events;
using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using UnityEngine;
namespace QSB.OrbSync namespace QSB.OrbSync
{ {
@ -13,5 +13,42 @@ namespace QSB.OrbSync
GlobalMessenger<int>.FireEvent(EventNames.QSBOrbUser, WorldRegistry.OldOrbList.FindIndex(x => x == __instance)); GlobalMessenger<int>.FireEvent(EventNames.QSBOrbUser, WorldRegistry.OldOrbList.FindIndex(x => x == __instance));
} }
} }
public static bool CheckOrbCollision(ref bool __result, NomaiInterfaceSlot __instance, NomaiInterfaceOrb orb, bool ____ignoreDraggedOrbs, float ____radius, float ____exitRadius, ref NomaiInterfaceOrb ____occupyingOrb)
{
if (____ignoreDraggedOrbs && orb.IsBeingDragged())
{
__result = false;
return false;
}
var orbDistance = Vector3.Distance(orb.transform.position, __instance.transform.position);
var triggerRadius = (!orb.IsBeingDragged()) ? ____radius : ____exitRadius;
if (____occupyingOrb == null && orbDistance < ____radius)
{
____occupyingOrb = orb;
if (Time.timeSinceLevelLoad > 1f)
{
WorldRegistry.HandleSlotStateChange(__instance, orb, true);
WorldRegistry.RaiseEvent(__instance, "OnSlotActivated");
}
__result = true;
return false;
}
if (!(____occupyingOrb != null) || !(____occupyingOrb == orb))
{
__result = false;
return false;
}
if (orbDistance > triggerRadius)
{
WorldRegistry.HandleSlotStateChange(__instance, orb, false);
____occupyingOrb = null;
WorldRegistry.RaiseEvent(__instance, "OnSlotDeactivated");
__result = false;
return false;
}
__result = true;
return false;
}
} }
} }

View File

@ -11,6 +11,11 @@ namespace QSB.OrbSync
} }
private void OnSceneLoaded(OWScene scene, bool isInUniverse) private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{
QSB.Helper.Events.Unity.RunWhen(() => QSB.HasWokenUp, InitSlots);
}
private void InitSlots()
{ {
var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>(); var orbSlots = Resources.FindObjectsOfTypeAll<NomaiInterfaceSlot>();
for (var id = 0; id < orbSlots.Length; id++) for (var id = 0; id < orbSlots.Length; id++)

View File

@ -1,7 +1,6 @@
using QSB.Events; using QSB.Events;
using QSB.Messaging; using QSB.Messaging;
using QSB.TransformSync; using QSB.TransformSync;
using QSB.Utility;
using QSB.WorldSync; using QSB.WorldSync;
using System.Linq; using System.Linq;
using UnityEngine.Networking; using UnityEngine.Networking;
@ -28,12 +27,22 @@ namespace QSB.OrbSync
{ {
var fromPlayer = NetworkServer.connections var fromPlayer = NetworkServer.connections
.First(x => x.playerControllers[0].gameObject.GetComponent<PlayerTransformSync>().netId.Value == message.FromId); .First(x => x.playerControllers[0].gameObject.GetComponent<PlayerTransformSync>().netId.Value == message.FromId);
DebugLog.DebugWrite($"[S] Setting orb {message.ObjectId} to auth id {message.FromId}"); var orb = WorldRegistry.OrbSyncList
var orb = WorldRegistry.OrbList
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]); .First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]);
var orbIdentity = orb.GetComponent<NetworkIdentity>(); var orbIdentity = orb.GetComponent<NetworkIdentity>();
if (orbIdentity.clientAuthorityOwner != null)
{
orbIdentity.RemoveClientAuthority(orbIdentity.clientAuthorityOwner); orbIdentity.RemoveClientAuthority(orbIdentity.clientAuthorityOwner);
}
orbIdentity.AssignClientAuthority(fromPlayer); orbIdentity.AssignClientAuthority(fromPlayer);
orb.enabled = true;
}
public override void OnReceiveRemote(WorldObjectMessage message)
{
var orb = WorldRegistry.OrbSyncList
.First(x => x.AttachedOrb == WorldRegistry.OldOrbList[message.ObjectId]);
orb.enabled = true;
} }
public override void OnReceiveLocal(WorldObjectMessage message) public override void OnReceiveLocal(WorldObjectMessage message)

View File

@ -1,43 +1,40 @@
using QSB.Events; using QSB.Events;
using QSB.WorldSync; using QSB.WorldSync;
using System;
using System.Linq;
using System.Reflection;
namespace QSB.OrbSync namespace QSB.OrbSync
{ {
public class QSBOrbSlot : WorldObject public class QSBOrbSlot : WorldObject
{ {
private NomaiInterfaceSlot _interfaceSlot; public NomaiInterfaceSlot InterfaceSlot { get; private set; }
private bool _initialized;
public void Init(NomaiInterfaceSlot slot, int id) public void Init(NomaiInterfaceSlot slot, int id)
{ {
ObjectId = id; ObjectId = id;
_interfaceSlot = slot; InterfaceSlot = slot;
_interfaceSlot.OnSlotActivated += (slotInstance) => HandleEvent(true); _initialized = true;
_interfaceSlot.OnSlotDeactivated += (slotInstance) => HandleEvent(false);
} }
private void HandleEvent(bool state) => GlobalMessenger<int, bool>.FireEvent(EventNames.QSBOrbSlot, ObjectId, state); public void HandleEvent(bool state)
{
if (QSB.HasWokenUp)
{
GlobalMessenger<int, bool>.FireEvent(EventNames.QSBOrbSlot, ObjectId, state);
}
}
public void SetState(bool state) public void SetState(bool state)
{ {
if (state) if (!_initialized)
{ {
RaiseEvent(_interfaceSlot, "OnSlotActivated");
return; return;
} }
RaiseEvent(_interfaceSlot, "OnSlotDeactivated"); if (state)
}
private static void RaiseEvent(object instance, string eventName)
{ {
var type = instance.GetType(); WorldRegistry.RaiseEvent(InterfaceSlot, "OnSlotActivated");
var staticFlags = BindingFlags.Instance | BindingFlags.NonPublic; return;
var fieldInfo = type.GetField(eventName, staticFlags); }
var multDelegate = fieldInfo.GetValue(instance) as MulticastDelegate; WorldRegistry.RaiseEvent(InterfaceSlot, "OnSlotDeactivated");
var delegateList = multDelegate.GetInvocationList().ToList();
delegateList.ForEach(x => x.DynamicInvoke(instance));
} }
} }
} }

View File

@ -19,6 +19,7 @@ namespace QSB
public static int Port { get; private set; } public static int Port { get; private set; }
public static bool DebugMode { get; private set; } public static bool DebugMode { get; private set; }
public static AssetBundle NetworkAssetBundle { get; private set; } public static AssetBundle NetworkAssetBundle { get; private set; }
public static bool HasWokenUp { get; set; }
private void Awake() private void Awake()
{ {

View File

@ -1,4 +1,5 @@
using OWML.Common; using OWML.Common;
using OWML.ModHelper.Events;
using QSB.Animation; using QSB.Animation;
using QSB.DeathSync; using QSB.DeathSync;
using QSB.Events; using QSB.Events;
@ -18,6 +19,7 @@ namespace QSB
public class QSBNetworkManager : NetworkManager public class QSBNetworkManager : NetworkManager
{ {
private const int MaxConnections = 128; private const int MaxConnections = 128;
private const int MaxBufferedPackets = 64;
public static QSBNetworkManager Instance { get; private set; } public static QSBNetworkManager Instance { get; private set; }
@ -85,6 +87,7 @@ namespace QSB
customConfig = true; customConfig = true;
connectionConfig.AddChannel(QosType.Reliable); connectionConfig.AddChannel(QosType.Reliable);
connectionConfig.AddChannel(QosType.Unreliable); connectionConfig.AddChannel(QosType.Unreliable);
((NetworkManager)this).SetValue("m_MaxBufferedPackets", MaxBufferedPackets);
channels.Add(QosType.Reliable); channels.Add(QosType.Reliable);
channels.Add(QosType.Unreliable); channels.Add(QosType.Unreliable);
} }
@ -118,6 +121,7 @@ namespace QSB
} }
QSB.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(OrbPatches.StartDragCallEvent)); QSB.Helper.HarmonyHelper.AddPostfix<NomaiInterfaceOrb>("StartDragFromPosition", typeof(OrbPatches), nameof(OrbPatches.StartDragCallEvent));
QSB.Helper.HarmonyHelper.AddPrefix<NomaiInterfaceSlot>("CheckOrbCollision", typeof(OrbPatches), nameof(OrbPatches.CheckOrbCollision));
_lobby.CanEditName = false; _lobby.CanEditName = false;

View File

@ -49,6 +49,15 @@ namespace QSB.TimeSync
} }
GlobalMessenger.AddListener(EventNames.RestartTimeLoop, OnLoopStart); GlobalMessenger.AddListener(EventNames.RestartTimeLoop, OnLoopStart);
GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp);
}
private void OnWakeUp()
{
if (NetworkServer.active)
{
QSB.HasWokenUp = true;
}
} }
private void OnDestroy() private void OnDestroy()
@ -59,6 +68,7 @@ namespace QSB.TimeSync
private void OnSceneLoaded(OWScene scene, bool isInUniverse) private void OnSceneLoaded(OWScene scene, bool isInUniverse)
{ {
QSB.HasWokenUp = false;
if (isInUniverse) if (isInUniverse)
{ {
Init(); Init();
@ -165,6 +175,7 @@ namespace QSB.TimeSync
EnableInput(); EnableInput();
} }
_isFirstFastForward = false; _isFirstFastForward = false;
QSB.HasWokenUp = true;
Physics.SyncTransforms(); Physics.SyncTransforms();
SpinnerUI.Hide(); SpinnerUI.Hide();
DebugLog.DebugWrite("ResetTimeScale - Request state!"); DebugLog.DebugWrite("ResetTimeScale - Request state!");

View File

@ -7,16 +7,17 @@ namespace QSB.TransformSync
public class NomaiOrbTransformSync : NetworkBehaviour public class NomaiOrbTransformSync : NetworkBehaviour
{ {
public NomaiInterfaceOrb AttachedOrb { get; private set; } public NomaiInterfaceOrb AttachedOrb { get; private set; }
private int Index => WorldRegistry.OrbList.FindIndex(x => x == this); private int Index => WorldRegistry.OrbSyncList.FindIndex(x => x == this);
public Transform OrbTransform { get; private set; } public Transform OrbTransform { get; private set; }
private bool _isInitialized; private bool _isInitialized;
private bool _isReady; private bool _isReady;
private Transform OrbParent; private Transform OrbParent;
private int _updateCount;
public override void OnStartClient() public override void OnStartClient()
{ {
WorldRegistry.OrbList.Add(this); WorldRegistry.OrbSyncList.Add(this);
QSB.Helper.Events.Unity.RunWhen(() => WorldRegistry.OldOrbList.Count != 0, OnReady); QSB.Helper.Events.Unity.RunWhen(() => WorldRegistry.OldOrbList.Count != 0, OnReady);
} }
@ -71,6 +72,15 @@ namespace QSB.TransformSync
} }
OrbTransform.position = OrbParent.TransformPoint(transform.position); OrbTransform.position = OrbParent.TransformPoint(transform.position);
OrbTransform.rotation = OrbParent.InverseTransformRotation(OrbTransform.rotation); OrbTransform.rotation = OrbParent.InverseTransformRotation(OrbTransform.rotation);
if (transform.localPosition == Vector3.zero)
{
_updateCount++;
}
if (_updateCount >= 5)
{
enabled = false;
_updateCount = 0;
}
} }
} }
} }

View File

@ -1,7 +1,4 @@
using OWML.Common; using OWML.Common;
using System;
using System.Collections.Generic;
using System.Linq;
namespace QSB.Utility namespace QSB.Utility
{ {

View File

@ -1,7 +1,4 @@
using System; namespace QSB.Utility
using System.Collections.Generic;
namespace QSB.Utility
{ {
// Stolen from here : https://stackoverflow.com/questions/3261451/using-a-bitmask-in-c-sharp // Stolen from here : https://stackoverflow.com/questions/3261451/using-a-bitmask-in-c-sharp

View File

@ -1,13 +1,16 @@
using QSB.TransformSync; using QSB.OrbSync;
using QSB.TransformSync;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
namespace QSB.WorldSync namespace QSB.WorldSync
{ {
public static class WorldRegistry public static class WorldRegistry
{ {
private static readonly List<WorldObject> _worldObjects = new List<WorldObject>(); private static readonly List<WorldObject> _worldObjects = new List<WorldObject>();
public static List<NomaiOrbTransformSync> OrbList = new List<NomaiOrbTransformSync>(); public static List<NomaiOrbTransformSync> OrbSyncList = new List<NomaiOrbTransformSync>();
public static List<NomaiInterfaceOrb> OldOrbList = new List<NomaiInterfaceOrb>(); public static List<NomaiInterfaceOrb> OldOrbList = new List<NomaiInterfaceOrb>();
public static void AddObject(WorldObject worldObject) public static void AddObject(WorldObject worldObject)
@ -28,5 +31,29 @@ namespace QSB.WorldSync
{ {
return GetObjects<T>().FirstOrDefault(x => x.ObjectId == id); return GetObjects<T>().FirstOrDefault(x => x.ObjectId == id);
} }
public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state)
{
var qsbSlot = GetObjects<QSBOrbSlot>().First(x => x.InterfaceSlot == slot);
var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb);
if (orbSync.hasAuthority)
{
qsbSlot.HandleEvent(state);
}
}
public static void RaiseEvent(object instance, string eventName)
{
var type = instance.GetType();
var staticFlags = BindingFlags.Instance | BindingFlags.NonPublic;
var fieldInfo = type.GetField(eventName, staticFlags);
var multDelegate = fieldInfo.GetValue(instance) as MulticastDelegate;
if (multDelegate == null)
{
return;
}
var delegateList = multDelegate.GetInvocationList().ToList();
delegateList.ForEach(x => x.DynamicInvoke(instance));
}
} }
} }