From 819a00b27b07110381caf08258be9161cc942444 Mon Sep 17 00:00:00 2001 From: NotAKidoS <37721153+NotAKidOnSteam@users.noreply.github.com> Date: Mon, 27 Feb 2023 23:57:18 -0600 Subject: [PATCH] cleanup --- AASBufferFix/AASBufferHelper.cs | 229 ++++++++++++++++---------------- AASBufferFix/HarmonyPatches.cs | 5 +- 2 files changed, 116 insertions(+), 118 deletions(-) diff --git a/AASBufferFix/AASBufferHelper.cs b/AASBufferFix/AASBufferHelper.cs index 6a0864d..aec0fbd 100644 --- a/AASBufferFix/AASBufferHelper.cs +++ b/AASBufferFix/AASBufferHelper.cs @@ -2,133 +2,132 @@ using ABI_RC.Core.Player; using UnityEngine; -namespace NAK.Melons.AASBufferFix +namespace NAK.Melons.AASBufferFix; + +public class AASBufferHelper : MonoBehaviour { - public class AASBufferHelper : MonoBehaviour + ///public bool DebuggingFlag = false; + + //public stuff + public bool GameHandlesAAS { get; private set; } + + //internal references + private PuppetMaster _puppetMaster; + + //outside aas buffers + private float[] _aasBufferFloat = new float[0]; + private int[] _aasBufferInt = new int[0]; + private byte[] _aasBufferByte = new byte[0]; + + //calculated footprints + private int _aasFootprint = -1; + private int _avatarFootprint = 0; + + private void Start() => _puppetMaster = GetComponent(); + + public void OnAvatarInstantiated(Animator animator) { - ///public bool DebuggingFlag = false; - - //public stuff - public bool GameHandlesAAS { get; private set; } - - //internal references - private PuppetMaster _puppetMaster; - - //outside aas buffers - private float[] _aasBufferFloat = new float[0]; - private int[] _aasBufferInt = new int[0]; - private byte[] _aasBufferByte = new byte[0]; - - //calculated footprints - private int _aasFootprint = -1; - private int _avatarFootprint = 0; - - private void Start() => _puppetMaster = GetComponent(); - - public void OnAvatarInstantiated(Animator animator) - { - //check if avatar uses Avatar Advanced Settings - ///SendDebug("[OnInit] Remote avatar initialized. Checking for AAS..."); - CVRAvatar avatar = animator.GetComponent(); - if (avatar != null && !avatar.avatarUsesAdvancedSettings) - { - GameHandlesAAS = true; - return; - } - - //check if AAS footprint is valid - ///SendDebug("[OnInit] Avatar uses AAS. Generating AAS footprint..."); - _avatarFootprint = Utils.GenerateAnimatorAASFootprint(animator); - if (_avatarFootprint == 1) - { - // we will let the game handle this by setting GameHandlesAAS to true - ///SendDebug("[OnInit] Avatar does not contain valid AAS. It is likely hidden or blocked."); - GameHandlesAAS = true; - return; - } - - ///SendDebug($"[OnInit] Avatar footprint is : {_avatarFootprint}"); - - //check if we received expected AAS while we loaded the avatar, and if so, apply it now - if (SyncDataMatchesExpected()) - { - ///SendDebug("[OnInit] Valid buffered AAS found. Applying buffer..."); - ApplyExternalAASBuffer(); - return; - } - - //we loaded avatar faster than wearer - ///SendDebug("[OnInit] Remote avatar initialized faster than wearer. Waiting on valid AAS..."); - } - - public void OnAvatarDestroyed() - { - GameHandlesAAS = false; - _aasFootprint = -1; - _avatarFootprint = 0; - } - - public void OnReceiveAAS(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) - { - // Calculate AAS footprint to compare against. - _aasFootprint = (settingsFloat.Length + 1) * (settingsInt.Length + 1) * (settingsByte.Length + 1); - - //if it matches, apply the settings and let game take over - if (SyncDataMatchesExpected()) - { - ///SendDebug("[OnSync] Avatar values matched and have been applied."); - ApplyExternalAAS(settingsFloat, settingsInt, settingsByte); - return; - } - - //avatar is still loading on our side, we must assume AAS data is correct and store it until we load - //there is also a chance it errored - //if (_avatarFootprint == 0) - //{ - // ///SendDebug("[OnSync] Avatar is still loading on our end."); - // StoreExternalAASBuffer(settingsFloat, settingsInt, settingsByte); - // return; - //} - - //avatar is loaded on our end, and is not blocked by filter - //this does run if it is manually hidden or distance hidden - - ///SendDebug("[OnSync] Avatar is loaded on our side and is not blocked. Comparing for expected values."); - ///SendDebug($"[OnSync] Avatar Footprint is : {_avatarFootprint}"); - - //if it did not match, that means the avatar we see on our side is different than what the remote user is wearing and syncing - ///SendDebug("[OnSync] Avatar loaded is different than wearer. The wearer is likely still loading the avatar!"); - StoreExternalAASBuffer(settingsFloat, settingsInt, settingsByte); - } - - private void ApplyExternalAASBuffer() + //check if avatar uses Avatar Advanced Settings + ///SendDebug("[OnInit] Remote avatar initialized. Checking for AAS..."); + CVRAvatar avatar = animator.GetComponent(); + if (avatar != null && !avatar.avatarUsesAdvancedSettings) { GameHandlesAAS = true; - _puppetMaster?.ApplyAdvancedAvatarSettings(_aasBufferFloat, _aasBufferInt, _aasBufferByte); + return; } - private void ApplyExternalAAS(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) + //check if AAS footprint is valid + ///SendDebug("[OnInit] Avatar uses AAS. Generating AAS footprint..."); + _avatarFootprint = Utils.GenerateAnimatorAASFootprint(animator); + if (_avatarFootprint == 1) { + // we will let the game handle this by setting GameHandlesAAS to true + ///SendDebug("[OnInit] Avatar does not contain valid AAS. It is likely hidden or blocked."); GameHandlesAAS = true; - _puppetMaster?.ApplyAdvancedAvatarSettings(settingsFloat, settingsInt, settingsByte); + return; } - private void StoreExternalAASBuffer(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) + ///SendDebug($"[OnInit] Avatar footprint is : {_avatarFootprint}"); + + //check if we received expected AAS while we loaded the avatar, and if so, apply it now + if (SyncDataMatchesExpected()) { - Array.Resize(ref _aasBufferFloat, settingsFloat.Length); - Array.Resize(ref _aasBufferInt, settingsInt.Length); - Array.Resize(ref _aasBufferByte, settingsByte.Length); - Array.Copy(settingsFloat, _aasBufferFloat, settingsFloat.Length); - Array.Copy(settingsInt, _aasBufferInt, settingsInt.Length); - Array.Copy(settingsByte, _aasBufferByte, settingsByte.Length); + ///SendDebug("[OnInit] Valid buffered AAS found. Applying buffer..."); + ApplyExternalAASBuffer(); + return; } - private bool SyncDataMatchesExpected() => _aasFootprint == _avatarFootprint; - - ///private void SendDebug(string message) - ///{ - /// if (!DebuggingFlag) return; - /// AASBufferFix.Logger.Msg(message); - ///} + //we loaded avatar faster than wearer + ///SendDebug("[OnInit] Remote avatar initialized faster than wearer. Waiting on valid AAS..."); } + + public void OnAvatarDestroyed() + { + GameHandlesAAS = false; + _aasFootprint = -1; + _avatarFootprint = 0; + } + + public void OnReceiveAAS(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) + { + // Calculate AAS footprint to compare against. + _aasFootprint = (settingsFloat.Length + 1) * (settingsInt.Length + 1) * (settingsByte.Length + 1); + + //if it matches, apply the settings and let game take over + if (SyncDataMatchesExpected()) + { + ///SendDebug("[OnSync] Avatar values matched and have been applied."); + ApplyExternalAAS(settingsFloat, settingsInt, settingsByte); + return; + } + + //avatar is still loading on our side, we must assume AAS data is correct and store it until we load + //there is also a chance it errored + //if (_avatarFootprint == 0) + //{ + // ///SendDebug("[OnSync] Avatar is still loading on our end."); + // StoreExternalAASBuffer(settingsFloat, settingsInt, settingsByte); + // return; + //} + + //avatar is loaded on our end, and is not blocked by filter + //this does run if it is manually hidden or distance hidden + + ///SendDebug("[OnSync] Avatar is loaded on our side and is not blocked. Comparing for expected values."); + ///SendDebug($"[OnSync] Avatar Footprint is : {_avatarFootprint}"); + + //if it did not match, that means the avatar we see on our side is different than what the remote user is wearing and syncing + ///SendDebug("[OnSync] Avatar loaded is different than wearer. The wearer is likely still loading the avatar!"); + StoreExternalAASBuffer(settingsFloat, settingsInt, settingsByte); + } + + private void ApplyExternalAASBuffer() + { + GameHandlesAAS = true; + _puppetMaster?.ApplyAdvancedAvatarSettings(_aasBufferFloat, _aasBufferInt, _aasBufferByte); + } + + private void ApplyExternalAAS(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) + { + GameHandlesAAS = true; + _puppetMaster?.ApplyAdvancedAvatarSettings(settingsFloat, settingsInt, settingsByte); + } + + private void StoreExternalAASBuffer(float[] settingsFloat, int[] settingsInt, byte[] settingsByte) + { + Array.Resize(ref _aasBufferFloat, settingsFloat.Length); + Array.Resize(ref _aasBufferInt, settingsInt.Length); + Array.Resize(ref _aasBufferByte, settingsByte.Length); + Array.Copy(settingsFloat, _aasBufferFloat, settingsFloat.Length); + Array.Copy(settingsInt, _aasBufferInt, settingsInt.Length); + Array.Copy(settingsByte, _aasBufferByte, settingsByte.Length); + } + + private bool SyncDataMatchesExpected() => _aasFootprint == _avatarFootprint; + + ///private void SendDebug(string message) + ///{ + /// if (!DebuggingFlag) return; + /// AASBufferFix.Logger.Msg(message); + ///} } \ No newline at end of file diff --git a/AASBufferFix/HarmonyPatches.cs b/AASBufferFix/HarmonyPatches.cs index c94feaf..ad559c2 100644 --- a/AASBufferFix/HarmonyPatches.cs +++ b/AASBufferFix/HarmonyPatches.cs @@ -13,7 +13,7 @@ internal class HarmonyPatches [HarmonyPatch(typeof(PuppetMaster), "Start")] private static void Postfix_PuppetMaster_Start(ref PuppetMaster __instance) { - AASBufferHelper externalBuffer = __instance.AddComponentIfMissing(); + __instance.AddComponentIfMissing(); } [HarmonyPostfix] @@ -63,7 +63,6 @@ internal class HarmonyPatches private static bool Prefix_PlayerSetup_SendAdvancedAvatarSettings(ref PlayerSetup __instance) { //dont sync wrong settings to remote users - if (__instance.avatarIsLoading) return false; - return true; + return !__instance.avatarIsLoading; } } \ No newline at end of file