mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-03-10 07:14:27 +00:00
add visible holograms for other clients
This commit is contained in:
parent
79974356bb
commit
6c395f4bb7
@ -30,6 +30,7 @@ namespace QSB.Animation
|
||||
|
||||
public AnimatorMirror Mirror { get; private set; }
|
||||
public AnimationType CurrentType { get; set; }
|
||||
public Animator VisibleAnimator => _bodyAnim;
|
||||
|
||||
protected void Awake()
|
||||
{
|
||||
|
@ -17,6 +17,18 @@ namespace QSB.Animation
|
||||
|
||||
public void Init(Animator from, Animator to)
|
||||
{
|
||||
if (from == null)
|
||||
{
|
||||
DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"from\".", MessageType.Error);
|
||||
}
|
||||
if (to == null)
|
||||
{
|
||||
DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"to\".", MessageType.Error);
|
||||
}
|
||||
if (to == null || from == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_from = from;
|
||||
_to = to;
|
||||
if (_from.runtimeAnimatorController == null)
|
||||
|
@ -55,5 +55,7 @@
|
||||
public static string QSBMoveToCarry = "QSBMoveToCarry";
|
||||
public static string QSBStartStatue = "QSBStartStatue";
|
||||
public static string QSBPlayerKick = "QSBPlayerKick";
|
||||
public static string QSBEnterPlatform = "QSBEnterPlatform";
|
||||
public static string QSBExitPlatform = "QSBExitPlatform";
|
||||
}
|
||||
}
|
@ -1,5 +1,7 @@
|
||||
using OWML.Common;
|
||||
using OWML.Utils;
|
||||
using QSB.Animation;
|
||||
using QSB.Events;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using System.Collections.Generic;
|
||||
@ -10,7 +12,7 @@ namespace QSB.ItemSync
|
||||
{
|
||||
internal class CustomNomaiRemoteCameraPlatform : NomaiShared
|
||||
{
|
||||
private static List<CustomNomaiRemoteCameraPlatform> s_platforms;
|
||||
public static List<CustomNomaiRemoteCameraPlatform> CustomPlatformList;
|
||||
private static MaterialPropertyBlock s_matPropBlock;
|
||||
private static int s_propID_Fade;
|
||||
private static int s_propID_HeightMaskScale;
|
||||
@ -137,6 +139,7 @@ namespace QSB.ItemSync
|
||||
private bool _anyoneStillOnPlatform;
|
||||
private bool _wasLocalInBounds;
|
||||
private CameraState _cameraState;
|
||||
private Dictionary<PlayerInfo, GameObject> _playerToHologram = new Dictionary<PlayerInfo, GameObject>();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
@ -177,11 +180,11 @@ namespace QSB.ItemSync
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (s_platforms == null)
|
||||
if (CustomPlatformList == null)
|
||||
{
|
||||
s_platforms = new List<CustomNomaiRemoteCameraPlatform>(32);
|
||||
CustomPlatformList = new List<CustomNomaiRemoteCameraPlatform>(32);
|
||||
}
|
||||
s_platforms.Add(this);
|
||||
CustomPlatformList.Add(this);
|
||||
_playerCamera = Locator.GetPlayerCamera();
|
||||
if (_socket != null)
|
||||
{
|
||||
@ -202,9 +205,9 @@ namespace QSB.ItemSync
|
||||
var socket2 = _socket;
|
||||
socket2.OnSocketableDonePlacing -= OnSocketableDonePlacing;
|
||||
}
|
||||
if (s_platforms != null)
|
||||
if (CustomPlatformList != null)
|
||||
{
|
||||
s_platforms.Remove(this);
|
||||
CustomPlatformList.Remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -228,6 +231,11 @@ namespace QSB.ItemSync
|
||||
{
|
||||
OnLeaveBounds();
|
||||
}
|
||||
|
||||
if (_anyoneStillOnPlatform)
|
||||
{
|
||||
UpdateHologramTransforms();
|
||||
}
|
||||
}
|
||||
if (_platformActive)
|
||||
{
|
||||
@ -261,7 +269,6 @@ namespace QSB.ItemSync
|
||||
_slavePlatform.UpdateRendererFade();
|
||||
SwitchToRemoteCamera();
|
||||
_hologramGroup.SetActive(true);
|
||||
UpdateHologramTransforms();
|
||||
_ambientAudioSource.FadeIn(3f, true, false, 1f);
|
||||
Locator.GetAudioMixer().MixRemoteCameraPlatform(_fadeInLength);
|
||||
_cameraState = CameraState.Connecting_FadeOut;
|
||||
@ -270,7 +277,6 @@ namespace QSB.ItemSync
|
||||
case CameraState.Connecting_FadeOut:
|
||||
_slavePlatform._transitionFade = Mathf.MoveTowards(_slavePlatform._transitionFade, 0f, Time.deltaTime / _fadeInLength);
|
||||
_slavePlatform.UpdateRendererFade();
|
||||
UpdateHologramTransforms();
|
||||
_slavePlatform._poolT = _poolT;
|
||||
_slavePlatform.UpdatePoolRenderer();
|
||||
if (_slavePlatform._transitionFade == 0f)
|
||||
@ -280,7 +286,6 @@ namespace QSB.ItemSync
|
||||
break;
|
||||
case CameraState.Connected:
|
||||
VerifySectorOccupancy();
|
||||
UpdateHologramTransforms();
|
||||
_slavePlatform._poolT = _poolT;
|
||||
_slavePlatform.UpdatePoolRenderer();
|
||||
break;
|
||||
@ -404,6 +409,18 @@ namespace QSB.ItemSync
|
||||
var playerTransform = Locator.GetPlayerTransform();
|
||||
_playerHologram.position = TransformPoint(playerTransform.position, this, _slavePlatform);
|
||||
_playerHologram.rotation = TransformRotation(playerTransform.rotation, this, _slavePlatform);
|
||||
|
||||
foreach (var item in _playerToHologram)
|
||||
{
|
||||
if (!item.Value.activeInHierarchy)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var hologram = item.Value.transform.GetChild(0);
|
||||
hologram.position = TransformPoint(item.Key.Body.transform.position, this, _slavePlatform);
|
||||
hologram.rotation = TransformRotation(item.Key.Body.transform.rotation, this, _slavePlatform);
|
||||
}
|
||||
|
||||
if (_sharedStone != null)
|
||||
{
|
||||
var transform = _sharedStone.transform;
|
||||
@ -482,6 +499,7 @@ namespace QSB.ItemSync
|
||||
|
||||
private void SwitchToRemoteCamera()
|
||||
{
|
||||
QSBEventManager.FireEvent(EventNames.QSBEnterPlatform, CustomPlatformList.IndexOf(this));
|
||||
GlobalMessenger.FireEvent("EnterNomaiRemoteCamera");
|
||||
_slavePlatform.RevealFactID();
|
||||
_slavePlatform._ownedCamera.Activate(this, _playerCamera);
|
||||
@ -541,6 +559,7 @@ namespace QSB.ItemSync
|
||||
{
|
||||
_slavePlatform._darkZone.RemovePlayerFromZone(true);
|
||||
}
|
||||
QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this));
|
||||
GlobalMessenger.FireEvent("ExitNomaiRemoteCamera");
|
||||
_slavePlatform._ownedCamera.Deactivate();
|
||||
_slavePlatform._ownedCamera.SetImageEffectFade(0f);
|
||||
@ -658,13 +677,13 @@ namespace QSB.ItemSync
|
||||
|
||||
public static CustomNomaiRemoteCameraPlatform GetPlatform(NomaiRemoteCameraPlatform.ID platformID)
|
||||
{
|
||||
if (s_platforms != null)
|
||||
if (CustomPlatformList != null)
|
||||
{
|
||||
for (var i = 0; i < s_platforms.Count; i++)
|
||||
for (var i = 0; i < CustomPlatformList.Count; i++)
|
||||
{
|
||||
if (s_platforms[i]._id == platformID)
|
||||
if (CustomPlatformList[i]._id == platformID)
|
||||
{
|
||||
return s_platforms[i];
|
||||
return CustomPlatformList[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -675,6 +694,41 @@ namespace QSB.ItemSync
|
||||
|
||||
public bool IsPlatformActive() => _platformActive;
|
||||
|
||||
public void OnRemotePlayerEnter(uint playerId)
|
||||
{
|
||||
if (playerId == QSBPlayerManager.LocalPlayerId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
var player = QSBPlayerManager.GetPlayer(playerId);
|
||||
if (_playerToHologram.ContainsKey(player))
|
||||
{
|
||||
_playerToHologram[player].SetActive(true);
|
||||
return;
|
||||
}
|
||||
var hologramCopy = Instantiate(_playerHologram);
|
||||
hologramCopy.parent = _playerHologram.parent;
|
||||
Destroy(hologramCopy.GetChild(0).GetComponent<PlayerAnimController>());
|
||||
var mirror = hologramCopy.gameObject.AddComponent<AnimatorMirror>();
|
||||
if (player.AnimationSync.VisibleAnimator == null)
|
||||
{
|
||||
DebugLog.ToConsole($"Warning - {playerId}'s VisibleAnimator is null!", MessageType.Error);
|
||||
}
|
||||
mirror.Init(player.AnimationSync.VisibleAnimator, hologramCopy.GetChild(0).gameObject.GetComponent<Animator>());
|
||||
_playerToHologram.Add(player, hologramCopy.gameObject);
|
||||
_hologramGroup.SetActive(true);
|
||||
hologramCopy.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
public void OnRemotePlayerExit(uint playerId)
|
||||
{
|
||||
if (playerId == QSBPlayerManager.LocalPlayerId)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_playerToHologram[QSBPlayerManager.GetPlayer(playerId)].SetActive(false);
|
||||
}
|
||||
|
||||
public enum CameraState
|
||||
{
|
||||
WaitingForPedestalContact,
|
||||
|
@ -1,10 +1,12 @@
|
||||
namespace QSB.QuantumSync
|
||||
namespace QSB.Player
|
||||
{
|
||||
public enum EnterLeaveType
|
||||
{
|
||||
EnterMoon = 0,
|
||||
ExitMoon = 1,
|
||||
EnterShrine = 2,
|
||||
ExitShrine = 3
|
||||
ExitShrine = 3,
|
||||
EnterPlatform = 4,
|
||||
ExitPlatform = 5
|
||||
}
|
||||
}
|
@ -1,11 +1,12 @@
|
||||
using QSB.Events;
|
||||
using QSB.ItemSync;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
|
||||
namespace QSB.QuantumSync.Events
|
||||
namespace QSB.Player.Events
|
||||
{
|
||||
internal class EnterLeaveEvent : QSBEvent<EnumMessage<EnterLeaveType>>
|
||||
internal class EnterLeaveEvent : QSBEvent<EnterLeaveMessage>
|
||||
{
|
||||
public override EventType Type => EventType.EnterLeave;
|
||||
|
||||
@ -15,6 +16,8 @@ namespace QSB.QuantumSync.Events
|
||||
GlobalMessenger.AddListener(EventNames.ExitQuantumMoon, () => Handler(EnterLeaveType.ExitMoon));
|
||||
GlobalMessenger.AddListener(EventNames.QSBEnterShrine, () => Handler(EnterLeaveType.EnterShrine));
|
||||
GlobalMessenger.AddListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine));
|
||||
GlobalMessenger<int>.AddListener(EventNames.QSBEnterPlatform, (int id) => Handler(EnterLeaveType.EnterPlatform, id));
|
||||
GlobalMessenger<int>.AddListener(EventNames.QSBExitPlatform, (int id) => Handler(EnterLeaveType.ExitPlatform, id));
|
||||
}
|
||||
|
||||
public override void CloseListener()
|
||||
@ -25,21 +28,22 @@ namespace QSB.QuantumSync.Events
|
||||
GlobalMessenger.RemoveListener(EventNames.QSBExitShrine, () => Handler(EnterLeaveType.ExitShrine));
|
||||
}
|
||||
|
||||
private void Handler(EnterLeaveType type) => SendEvent(CreateMessage(type));
|
||||
private void Handler(EnterLeaveType type, int objectId = -1) => SendEvent(CreateMessage(type, objectId));
|
||||
|
||||
private EnumMessage<EnterLeaveType> CreateMessage(EnterLeaveType type) => new EnumMessage<EnterLeaveType>
|
||||
private EnterLeaveMessage CreateMessage(EnterLeaveType type, int objectId) => new EnterLeaveMessage
|
||||
{
|
||||
AboutId = LocalPlayerId,
|
||||
Value = type
|
||||
Type = type,
|
||||
ObjectId = objectId
|
||||
};
|
||||
|
||||
public override void OnReceiveLocal(bool server, EnumMessage<EnterLeaveType> message)
|
||||
public override void OnReceiveLocal(bool server, EnterLeaveMessage message)
|
||||
=> OnReceiveRemote(server, message);
|
||||
|
||||
public override void OnReceiveRemote(bool server, EnumMessage<EnterLeaveType> message)
|
||||
public override void OnReceiveRemote(bool server, EnterLeaveMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.FromId);
|
||||
switch (message.Value)
|
||||
switch (message.Type)
|
||||
{
|
||||
case EnterLeaveType.EnterMoon:
|
||||
player.IsInMoon = true;
|
||||
@ -53,8 +57,16 @@ namespace QSB.QuantumSync.Events
|
||||
case EnterLeaveType.ExitShrine:
|
||||
player.IsInShrine = false;
|
||||
break;
|
||||
case EnterLeaveType.EnterPlatform:
|
||||
CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId]
|
||||
.OnRemotePlayerEnter(message.AboutId);
|
||||
break;
|
||||
case EnterLeaveType.ExitPlatform:
|
||||
CustomNomaiRemoteCameraPlatform.CustomPlatformList[message.ObjectId]
|
||||
.OnRemotePlayerExit(message.AboutId);
|
||||
break;
|
||||
default:
|
||||
DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.Value}", OWML.Common.MessageType.Warning);
|
||||
DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {message.Type}", OWML.Common.MessageType.Warning);
|
||||
break;
|
||||
}
|
||||
}
|
22
QSB/Player/Events/EnterLeaveMessage.cs
Normal file
22
QSB/Player/Events/EnterLeaveMessage.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using QSB.WorldSync.Events;
|
||||
using QuantumUNET.Transport;
|
||||
|
||||
namespace QSB.Player.Events
|
||||
{
|
||||
class EnterLeaveMessage : WorldObjectMessage
|
||||
{
|
||||
public EnterLeaveType Type { get; set; }
|
||||
|
||||
public override void Deserialize(QNetworkReader reader)
|
||||
{
|
||||
base.Deserialize(reader);
|
||||
Type = (EnterLeaveType)reader.ReadInt32();
|
||||
}
|
||||
|
||||
public override void Serialize(QNetworkWriter writer)
|
||||
{
|
||||
base.Serialize(writer);
|
||||
writer.Write((int)Type);
|
||||
}
|
||||
}
|
||||
}
|
@ -168,6 +168,7 @@
|
||||
<Compile Include="OrbSync\Events\OrbUserEvent.cs" />
|
||||
<Compile Include="OrbSync\WorldObjects\QSBOrbSlot.cs" />
|
||||
<Compile Include="Patches\QSBPatchManager.cs" />
|
||||
<Compile Include="Player\Events\EnterLeaveMessage.cs" />
|
||||
<Compile Include="Player\Events\PlayerEntangledEvent.cs" />
|
||||
<Compile Include="Player\Events\PlayerKickEvent.cs" />
|
||||
<Compile Include="Player\Events\ServerSendPlayerStatesEvent.cs" />
|
||||
@ -180,8 +181,8 @@
|
||||
<Compile Include="Patches\QSBPatch.cs" />
|
||||
<Compile Include="Patches\QSBPatchTypes.cs" />
|
||||
<Compile Include="QSBSceneManager.cs" />
|
||||
<Compile Include="QuantumSync\EnterLeaveType.cs" />
|
||||
<Compile Include="QuantumSync\Events\EnterLeaveEvent.cs" />
|
||||
<Compile Include="Player\EnterLeaveType.cs" />
|
||||
<Compile Include="Player\Events\EnterLeaveEvent.cs" />
|
||||
<Compile Include="QuantumSync\Events\MoonStateChangeEvent.cs" />
|
||||
<Compile Include="QuantumSync\Events\MoonStateChangeMessage.cs" />
|
||||
<Compile Include="QuantumSync\Events\QuantumAuthorityEvent.cs" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user