start of camera sync

This commit is contained in:
Mister_Nebula 2022-08-27 17:57:27 +01:00
parent 2b39f6b837
commit 57394f34e8
9 changed files with 159 additions and 8 deletions

View File

@ -478,4 +478,10 @@ public class QuantumPatches : QSBPatch
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(QuantumObject), nameof(QuantumObject.OnProbeSnapshot))]
public static bool OnProbeSnapshot()
{
return false;
}
}

View File

@ -126,6 +126,19 @@ internal class QuantumManager : WorldObjectManager
return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj);
}
public static void OnTakeProbeSnapshot(PlayerInfo player, ProbeCamera.ID cameraId)
{
DebugLog.DebugWrite($"{player} took a probe snapshot with cameraid {cameraId}");
foreach (var quantumObject in QSBWorldSync.GetWorldObjects<IQSBQuantumObject>())
{
if (quantumObject.ControllingPlayer == QSBPlayerManager.LocalPlayerId)
{
quantumObject.OnTakeProbeSnapshot(player, cameraId);
}
}
}
#region debug shapes
private static GameObject _debugSphere, _debugCube, _debugCapsule;

View File

@ -1,4 +1,5 @@
using QSB.WorldSync;
using QSB.Player;
using QSB.WorldSync;
using System.Collections.Generic;
namespace QSB.QuantumSync.WorldObjects;
@ -12,4 +13,5 @@ public interface IQSBQuantumObject : IWorldObject
void SetIsQuantum(bool isQuantum);
VisibilityObject GetVisibilityObject();
void OnTakeProbeSnapshot(PlayerInfo player, ProbeCamera.ID cameraId);
}

View File

@ -3,6 +3,7 @@ using OWML.Common;
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync.Messages;
using QSB.Tools.ProbeTool;
using QSB.Utility;
using QSB.WorldSync;
using System.Collections.Generic;
@ -28,6 +29,8 @@ internal abstract class QSBQuantumObject<T> : WorldObject<T>, IQSBQuantumObject
public uint ControllingPlayer { get; set; }
public bool IsEnabled { get; private set; }
private List<PlayerInfo> _visibleToProbes = new();
public override void OnRemoval()
{
if (HostControls)
@ -174,6 +177,100 @@ internal abstract class QSBQuantumObject<T> : WorldObject<T>, IQSBQuantumObject
((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u));
});
public void OnTakeProbeSnapshot(PlayerInfo player, ProbeCamera.ID cameraId)
{
DebugLog.DebugWrite($"{AttachedObject.name} OnTakeProbeSnapshot playerId:{player.PlayerId} cameraId:{cameraId}");
if (player.IsLocalPlayer)
{
DebugLog.DebugWrite($"- is local player");
var probe = Locator.GetProbe();
ProbeCamera probeCamera = default;
switch (cameraId)
{
case ProbeCamera.ID.Forward:
probeCamera = probe.GetForwardCamera();
break;
case ProbeCamera.ID.Reverse:
probeCamera = probe.GetReverseCamera();
break;
case ProbeCamera.ID.Rotating:
probeCamera = probe.GetRotatingCamera();
break;
case ProbeCamera.ID.PreLaunch:
probeCamera = player.LocalProbeLauncher._preLaunchCamera;
break;
}
var distance = Vector3.Distance(AttachedObject.transform.position, probeCamera.transform.position);
DebugLog.DebugWrite($"- distance is {distance}");
if (distance < AttachedObject._maxSnapshotLockRange
&& AttachedObject.IsIlluminated()
&& !probeCamera.HasInterference()
&& AttachedObject.CheckVisibilityFromProbe(probeCamera.GetOWCamera()))
{
DebugLog.DebugWrite($"- Visible in probe snapshot for local player!");
if (!_visibleToProbes.Contains(player))
{
_visibleToProbes.Add(player);
}
AttachedObject._visibleInProbeSnapshot = _visibleToProbes.Any(x => x != null);
return;
}
else
{
DebugLog.DebugWrite($"- not visible :(");
}
}
else
{
DebugLog.DebugWrite($"- not local player");
var probe = player.Probe;
QSBProbeCamera probeCamera = default;
switch (cameraId)
{
case ProbeCamera.ID.Forward:
probeCamera = probe.GetForwardCamera();
break;
case ProbeCamera.ID.Reverse:
probeCamera = probe.GetReverseCamera();
break;
case ProbeCamera.ID.Rotating:
probeCamera = probe.GetRotatingCamera();
break;
case ProbeCamera.ID.PreLaunch:
//TODO : uhhhh yeah do this lol
probeCamera = null;
break;
}
var distance = Vector3.Distance(AttachedObject.transform.position, probeCamera.transform.position);
if (distance < AttachedObject._maxSnapshotLockRange
&& AttachedObject.IsIlluminated()
&& !probeCamera.HasInterference()
&& AttachedObject.CheckVisibilityFromProbe(probeCamera.GetOWCamera()))
{
DebugLog.DebugWrite($"Visible in probe snapshot for {player.PlayerId}!");
if (!_visibleToProbes.Contains(player))
{
_visibleToProbes.Add(player);
}
_visibleToProbes.Add(player);
AttachedObject._visibleInProbeSnapshot = _visibleToProbes.Any(x => x != null);
return;
}
}
if (_visibleToProbes.Contains(player))
{
DebugLog.DebugWrite($"NOT visible in probe snapshot for {player.PlayerId}!");
_visibleToProbes.Remove(player);
}
AttachedObject._visibleInProbeSnapshot = _visibleToProbes.Any(x => x != null);
}
public override void DisplayLines()
{
if (AttachedObject == null)

View File

@ -1,16 +1,22 @@
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync;
using QSB.WorldSync;
namespace QSB.Tools.ProbeLauncherTool.Messages;
internal class PlayerLauncherTakeSnapshotMessage : QSBMessage
internal class PlayerLauncherTakeSnapshotMessage : QSBMessage<ProbeCamera.ID>
{
public PlayerLauncherTakeSnapshotMessage(ProbeCamera.ID cameraId) : base(cameraId) { }
public override bool ShouldReceive => QSBWorldSync.AllObjectsReady;
public override void OnReceiveLocal() => QuantumManager.OnTakeProbeSnapshot(QSBPlayerManager.LocalPlayer, Data);
public override void OnReceiveRemote()
{
var player = QSBPlayerManager.GetPlayer(From);
player.ProbeLauncherTool.TakeSnapshot();
QuantumManager.OnTakeProbeSnapshot(player, Data);
}
}

View File

@ -1,4 +1,6 @@
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync;
using QSB.Tools.ProbeLauncherTool.WorldObjects;
using System;
using System.Collections.Generic;
@ -8,9 +10,11 @@ using System.Threading.Tasks;
namespace QSB.Tools.ProbeLauncherTool.Messages;
internal class TakeSnapshotMessage : QSBWorldObjectMessage<QSBProbeLauncher>
internal class TakeSnapshotMessage : QSBWorldObjectMessage<QSBProbeLauncher, ProbeCamera.ID>
{
public TakeSnapshotMessage() : base() { }
public TakeSnapshotMessage(ProbeCamera.ID cameraId) : base(cameraId) { }
public override void OnReceiveRemote() => WorldObject.TakeSnapshot();
public override void OnReceiveLocal() => QuantumManager.OnTakeProbeSnapshot(QSBPlayerManager.LocalPlayer, Data);
public override void OnReceiveRemote() => WorldObject.TakeSnapshot(QSBPlayerManager.GetPlayer(From), Data);
}

View File

@ -107,7 +107,7 @@ internal class LauncherPatches : QSBPatch
}
}
[HarmonyPostfix]
/*[HarmonyPostfix]
[HarmonyPatch(typeof(ProbeLauncherEffects), nameof(ProbeLauncherEffects.PlaySnapshotClip))]
public static void ProbeLauncherEffects_PlaySnapshotClip(ProbeLauncherEffects __instance)
{
@ -122,5 +122,24 @@ internal class LauncherPatches : QSBPatch
{
new PlayerLauncherTakeSnapshotMessage().Send();
}
}*/
[HarmonyPostfix]
[HarmonyPatch(typeof(ProbeLauncher), nameof(ProbeLauncher.TakeSnapshotWithCamera))]
public static void TakeSnapshotWithCamera(ProbeLauncher __instance, ProbeCamera camera)
{
DebugLog.DebugWrite($"TakeSnapshotWithCamera - cameraid:{camera.GetID()}");
if (__instance != QSBPlayerManager.LocalPlayer.LocalProbeLauncher)
{
DebugLog.DebugWrite($"- not local launcher");
__instance
?.GetWorldObject<QSBProbeLauncher>()
?.SendMessage(new TakeSnapshotMessage(camera.GetID()));
}
else
{
DebugLog.DebugWrite($"- local launcher");
new PlayerLauncherTakeSnapshotMessage(camera.GetID()).Send();
}
}
}

View File

@ -1,5 +1,7 @@
using Cysharp.Threading.Tasks;
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync;
using QSB.Tools.ProbeLauncherTool.Messages;
using QSB.WorldSync;
using System.Threading;
@ -66,9 +68,10 @@ public class QSBProbeLauncher : WorldObject<ProbeLauncher>
AttachedObject._effects.PlayChangeModeClip();
}
public void TakeSnapshot()
public void TakeSnapshot(PlayerInfo player, ProbeCamera.ID cameraId)
{
// Not using PlaySnapshotClip because that uses Locator.GetPlayerAudioController() instead of owAudioSource for some reason
AttachedObject._effects._owAudioSource.PlayOneShot(global::AudioType.ToolProbeTakePhoto, 1f);
QuantumManager.OnTakeProbeSnapshot(player, cameraId);
}
}

View File

@ -2,6 +2,7 @@
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Player;
using QSB.QuantumSync.WorldObjects;
using QSB.RespawnSync;
using QSB.ShipSync;
using QSB.Utility.Messages;
@ -15,7 +16,7 @@ namespace QSB.Utility;
public class DebugActions : MonoBehaviour, IAddComponentOnStart
{
public static Type WorldObjectSelection;
public static Type WorldObjectSelection = typeof(QSBSocketedQuantumObject);
private static void GoToVessel()
{