quantum shuffle

This commit is contained in:
Mister_Nebula 2021-01-01 10:17:35 +00:00
parent 53974485c9
commit baa61807f8
11 changed files with 124 additions and 3 deletions

View File

@ -40,6 +40,7 @@
public static string QSBRevealFact = "QSBRevealFact";
public static string QSBSocketStateChange = "QSBSocketStateChange";
public static string QSBMultiStateChange = "QSBMultiStateChange";
public static string QSBQuantumShuffle = "QSBQuantumShuffle";
public static string QSBIdentifyFrequency = "QSBIdentifyFrequency";
public static string QSBIdentifySignal = "QSBIdentifySignal";
public static string QSBTextTranslated = "QSBTextTranslated";

View File

@ -28,6 +28,7 @@
RevealFact,
SocketStateChange,
MultiStateChange,
QuantumShuffle,
IdentifyFrequency,
IdentifySignal,
TextTranslated

View File

@ -51,6 +51,7 @@ namespace QSB.Events
new SocketStateChangeEvent(),
new MultiStateChangeEvent(),
new SetAsTranslatedEvent(),
new QuantumShuffleEvent(),
// Conversation/dialogue/exploration
new ConversationEvent(),
new ConversationStartEndEvent(),

View File

@ -190,12 +190,15 @@
<Compile Include="Patches\QSBPatch.cs" />
<Compile Include="Patches\QSBPatchTypes.cs" />
<Compile Include="QSBSceneManager.cs" />
<Compile Include="QuantumSync\Events\QuantumShuffleEvent.cs" />
<Compile Include="QuantumSync\Events\QuantumShuffleMessage.cs" />
<Compile Include="QuantumSync\Patches\ClientQuantumStateChangePatches.cs" />
<Compile Include="QuantumSync\Events\MultiStateChangeEvent.cs" />
<Compile Include="QuantumSync\Events\MultiStateChangeMessage.cs" />
<Compile Include="QuantumSync\Events\SocketStateChangeEvent.cs" />
<Compile Include="QuantumSync\Events\SocketStateChangeMessage.cs" />
<Compile Include="QuantumSync\WorldObjects\QSBMultiStateQuantumObject.cs" />
<Compile Include="QuantumSync\WorldObjects\QSBQuantumShuffleObject.cs" />
<Compile Include="QuantumSync\WorldObjects\QSBSocketedQuantumObject.cs" />
<Compile Include="QuantumSync\WorldObjects\QSBQuantumSocket.cs" />
<Compile Include="QuantumSync\QuantumManager.cs" />

View File

@ -0,0 +1,40 @@
using OWML.Utils;
using QSB.Events;
using QSB.QuantumSync.WorldObjects;
using QSB.WorldSync;
using UnityEngine;
namespace QSB.QuantumSync.Events
{
public class QuantumShuffleEvent : QSBEvent<QuantumShuffleMessage>
{
public override QSB.Events.EventType Type => QSB.Events.EventType.QuantumShuffle;
public override void SetupListener() => GlobalMessenger<int, int[]>.AddListener(EventNames.QSBQuantumShuffle, Handler);
public override void CloseListener() => GlobalMessenger<int, int[]>.RemoveListener(EventNames.QSBQuantumShuffle, Handler);
private void Handler(int objid, int[] indexArray) => SendEvent(CreateMessage(objid, indexArray));
private QuantumShuffleMessage CreateMessage(int objid, int[] indexArray) => new QuantumShuffleMessage
{
AboutId = LocalPlayerId,
ObjectId = objid,
IndexArray = indexArray
};
public override void OnReceiveRemote(bool server, QuantumShuffleMessage message)
{
if (!QSBCore.HasWokenUp)
{
return;
}
var obj = QSBWorldSync.GetWorldObject<QSBQuantumShuffleObject>(message.ObjectId).AttachedObject;
var shuffledObjects = obj.GetValue<Transform[]>("_shuffledObjects");
var localPositions = obj.GetValue<Vector3[]>("_localPositions");
for (var i = 0; i < shuffledObjects.Length; i++)
{
shuffledObjects[i].localPosition = localPositions[message.IndexArray[i]];
}
}
}
}

View File

@ -0,0 +1,25 @@
using QSB.WorldSync.Events;
using QuantumUNET.Transport;
using System;
using System.Linq;
namespace QSB.QuantumSync.Events
{
public class QuantumShuffleMessage : WorldObjectMessage
{
public int[] IndexArray { get; set; }
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
IndexArray = Array.ConvertAll(reader.ReadBytesAndSize(), Convert.ToInt32);
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
var temp = IndexArray.Select(x => (byte)x).ToArray();
writer.WriteBytesAndSize(temp, temp.Length);
}
}
}

View File

@ -10,6 +10,7 @@ namespace QSB.QuantumSync.Patches
{
QSBCore.Helper.HarmonyHelper.AddPrefix<SocketedQuantumObject>("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch));
QSBCore.Helper.HarmonyHelper.AddPrefix<MultiStateQuantumObject>("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch));
QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShuffleObject>("ChangeQuantumState", typeof(ClientQuantumStateChangePatches), nameof(ReturnFalsePatch));
}
public static bool ReturnFalsePatch() => false;

View File

@ -3,6 +3,7 @@ using QSB.Patches;
using QSB.QuantumSync.WorldObjects;
using QSB.WorldSync;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
@ -16,6 +17,7 @@ namespace QSB.QuantumSync.Patches
{
QSBCore.Helper.HarmonyHelper.AddPostfix<SocketedQuantumObject>("MoveToSocket", typeof(ServerQuantumStateChangePatches), nameof(Socketed_MoveToSocket));
QSBCore.Helper.HarmonyHelper.AddPostfix<QuantumState>("SetVisible", typeof(ServerQuantumStateChangePatches), nameof(QuantumState_SetVisible));
QSBCore.Helper.HarmonyHelper.AddPrefix<QuantumShuffleObject>("ChangeQuantumState", typeof(ServerQuantumStateChangePatches), nameof(Shuffle_ChangeQuantumState));
}
public static void Socketed_MoveToSocket(SocketedQuantumObject __instance, QuantumSocket socket)
@ -23,7 +25,8 @@ namespace QSB.QuantumSync.Patches
var objId = QuantumManager.Instance.GetId(__instance);
var socketId = QuantumManager.Instance.GetId(socket);
GlobalMessenger<int, int, Quaternion>
.FireEvent(EventNames.QSBSocketStateChange,
.FireEvent(
EventNames.QSBSocketStateChange,
objId,
socketId,
__instance.transform.localRotation);
@ -34,9 +37,39 @@ namespace QSB.QuantumSync.Patches
var allMultiStates = QSBWorldSync.GetWorldObjects<QSBMultiStateQuantumObject>();
var owner = allMultiStates.First(x => x.QuantumStates.Contains(__instance));
GlobalMessenger<int, int>
.FireEvent(EventNames.QSBMultiStateChange,
.FireEvent(
EventNames.QSBMultiStateChange,
QuantumManager.Instance.GetId(owner.AttachedObject),
Array.IndexOf(owner.QuantumStates, __instance));
}
public static bool Shuffle_ChangeQuantumState(
QuantumShuffleObject __instance,
ref List<int> ____indexList,
ref Vector3[] ____localPositions,
ref Transform[] ____shuffledObjects,
ref bool __result)
{
____indexList.Clear();
____indexList = Enumerable.Range(0, ____localPositions.Length).ToList();
for (var i = 0; i < ____indexList.Count; ++i)
{
var random = UnityEngine.Random.Range(i, ____indexList.Count);
var temp = ____indexList[i];
____indexList[i] = ____indexList[random];
____indexList[random] = temp;
}
for (var j = 0; j < ____shuffledObjects.Length; j++)
{
____shuffledObjects[j].localPosition = ____localPositions[____indexList[j]];
}
GlobalMessenger<int, int[]>
.FireEvent(
EventNames.QSBQuantumShuffle,
QuantumManager.Instance.GetId(__instance),
____indexList.ToArray());
__result = true;
return false;
}
}
}

View File

@ -12,6 +12,7 @@ namespace QSB.QuantumSync
private List<SocketedQuantumObject> _socketedQuantumObjects;
private List<MultiStateQuantumObject> _multiStateQuantumObjects;
private List<QuantumSocket> _quantumSockets;
private List<QuantumShuffleObject> _quantumShuffleObjects;
public void Awake()
{
@ -26,10 +27,12 @@ namespace QSB.QuantumSync
_socketedQuantumObjects = QSBWorldSync.Init<QSBSocketedQuantumObject, SocketedQuantumObject>();
_multiStateQuantumObjects = QSBWorldSync.Init<QSBMultiStateQuantumObject, MultiStateQuantumObject>();
_quantumSockets = QSBWorldSync.Init<QSBQuantumSocket, QuantumSocket>();
_quantumShuffleObjects = QSBWorldSync.Init<QSBQuantumShuffleObject, QuantumShuffleObject>();
}
public int GetId(SocketedQuantumObject obj) => _socketedQuantumObjects.IndexOf(obj);
public int GetId(MultiStateQuantumObject obj) => _multiStateQuantumObjects.IndexOf(obj);
public int GetId(QuantumSocket obj) => _quantumSockets.IndexOf(obj);
public int GetId(QuantumShuffleObject obj) => _quantumShuffleObjects.IndexOf(obj);
}
}

View File

@ -0,0 +1,13 @@
using QSB.WorldSync;
namespace QSB.QuantumSync.WorldObjects
{
internal class QSBQuantumShuffleObject : WorldObject<QuantumShuffleObject>
{
public override void Init(QuantumShuffleObject shuffleObject, int id)
{
ObjectId = id;
AttachedObject = shuffleObject;
}
}
}

View File

@ -30,4 +30,4 @@ namespace QSB.TranslationSync.WorldObjects
.Select(ring => ring.GetEntryID());
}
}
}
}