This commit is contained in:
Mister_Nebula 2021-01-26 17:08:02 +00:00
parent 1b8878a1cf
commit ad5757e48c
6 changed files with 29 additions and 15 deletions

View File

@ -160,6 +160,7 @@
<Compile Include="QuantumSync\Events\QuantumAuthorityMessage.cs" />
<Compile Include="QuantumSync\Events\QuantumShuffleEvent.cs" />
<Compile Include="QuantumSync\Events\QuantumShuffleMessage.cs" />
<Compile Include="QuantumSync\IQSBQuantumObject.cs" />
<Compile Include="QuantumSync\Patches\ClientQuantumPatches.cs" />
<Compile Include="QuantumSync\Events\MultiStateChangeEvent.cs" />
<Compile Include="QuantumSync\Events\MultiStateChangeMessage.cs" />

View File

@ -1,4 +1,7 @@
using QSB.Events;
using QSB.Utility;
using QSB.WorldSync;
using System.Linq;
namespace QSB.QuantumSync.Events
{
@ -20,12 +23,18 @@ namespace QSB.QuantumSync.Events
public override void OnReceiveLocal(bool server, QuantumAuthorityMessage message)
{
DebugLog.DebugWrite($"Local set {message.ObjectId} to owner {message.AuthorityOwner}");
var objects = QSBWorldSync.GetWorldObjects<IQSBQuantumObject>();
var obj = objects.First(x => (x as IWorldObject).ObjectId == message.ObjectId);
obj.ControllingPlayer = message.AuthorityOwner;
}
public override void OnReceiveRemote(bool server, QuantumAuthorityMessage message)
{
var objects = QSBWorldSync.GetWorldObjects<IQSBQuantumObject>();
var obj = objects.First(x => (x as IWorldObject).ObjectId == message.ObjectId);
obj.ControllingPlayer = message.AuthorityOwner;
DebugLog.DebugWrite($"Set {message.ObjectId} to owner {message.AuthorityOwner}");
}
}
}

View File

@ -0,0 +1,7 @@
namespace QSB.QuantumSync
{
public interface IQSBQuantumObject
{
uint ControllingPlayer { get; set; }
}
}

View File

@ -18,7 +18,7 @@ namespace QSB.QuantumSync.WorldObjects
{
DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, AttachedObject.GetValue<int>("_stateIndex").ToString()).GetComponent<Text>();
}
base.Init(quantumObject, id);
base.Init(attachedObject, id);
}
public void ChangeState(int stateIndex)

View File

@ -6,29 +6,27 @@ using UnityEngine;
namespace QSB.QuantumSync.WorldObjects
{
internal abstract class QSBQuantumObject<T> : WorldObject<T> where T : UnityEngine.Object
internal abstract class QSBQuantumObject<T> : WorldObject<T>, IQSBQuantumObject where T : UnityEngine.Object
{
private const uint NoControllerValue = uint.MaxValue;
public uint ControllingPlayer = NoControllerValue;
public uint ControllingPlayer { get; set; }
public override void Init(T attachedObject, int id)
{
var tracker = (AttachedObject as GameObject).AddComponent<OnEnableDisableTracker>();
var tracker = (AttachedObject as Component).gameObject.AddComponent<OnEnableDisableTracker>();
tracker.OnEnableEvent += OnEnable;
tracker.OnDisableEvent += OnDisable;
DebugLog.DebugWrite($"Finish setup of {attachedObject.name}");
ControllingPlayer = 0;
}
private void OnEnable()
{
if (ControllingPlayer != uint.MaxValue && !QSBCore.IsServer)
if (ControllingPlayer != 0 && !QSBCore.IsServer)
{
// controlled by another player, dont care that we activate it (unless we're the server!)
return;
}
// no one is controlling this object right now (or we're the server, and we want to take ownership), request authority
GlobalMessenger<uint>.FireEvent(EventNames.QSBQuantumAuthority, QSBPlayerManager.LocalPlayerId);
GlobalMessenger<int, uint>.FireEvent(EventNames.QSBQuantumAuthority, ObjectId, QSBPlayerManager.LocalPlayerId);
}
private void OnDisable()
@ -39,7 +37,7 @@ namespace QSB.QuantumSync.WorldObjects
return;
}
// send event to other players that we're releasing authority
GlobalMessenger<uint>.FireEvent(EventNames.QSBQuantumAuthority, NoControllerValue);
GlobalMessenger<int, uint>.FireEvent(EventNames.QSBQuantumAuthority, ObjectId, 0);
}
}
}

View File

@ -1,16 +1,15 @@
using OWML.Utils;
using QSB.WorldSync;
using UnityEngine;
namespace QSB.QuantumSync.WorldObjects
{
internal class QSBQuantumShuffleObject : WorldObject<QuantumShuffleObject>
internal class QSBQuantumShuffleObject : QSBQuantumObject<QuantumShuffleObject>
{
public override void Init(QuantumShuffleObject shuffleObject, int id)
{
ObjectId = id;
AttachedObject = shuffleObject;
base.Init(quantumObject, id);
base.Init(shuffleObject, id);
}
public void ShuffleObjects(int[] indexArray)