add visible holograms for other clients

This commit is contained in:
Mister_Nebula 2021-03-13 18:37:42 +00:00
parent 79974356bb
commit 6c395f4bb7
8 changed files with 132 additions and 26 deletions

View File

@ -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()
{

View File

@ -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)

View File

@ -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";
}
}

View File

@ -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,

View File

@ -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
}
}

View File

@ -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;
}
}

View 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);
}
}
}

View File

@ -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" />