This commit is contained in:
_nebula 2025-02-13 14:06:39 +00:00
parent 9960fff0eb
commit 1ff5ad1236
10 changed files with 168 additions and 32 deletions

View File

@ -15,6 +15,14 @@ namespace QSB.Animation.Player;
[UsedInUnityProject]
public class AnimationSync : PlayerSyncObject
{
public static int DropHeldItem = Animator.StringToHash("DropHeldItem");
public static int HoldLantern = Animator.StringToHash("HoldLantern");
public static int HoldSharedStone = Animator.StringToHash("HoldSharedStone");
public static int HoldScroll = Animator.StringToHash("HoldScroll");
public static int HoldWarpCore = Animator.StringToHash("HoldWarpCore");
public static int HoldAdvWarpCore = Animator.StringToHash("HoldAdvWarpCore");
public static int HoldItem = Animator.StringToHash("HoldItem");
private RuntimeAnimatorController _suitedAnimController;
private AnimatorOverrideController _unsuitedAnimController;
private GameObject _suitedGraphics;
@ -209,4 +217,20 @@ public class AnimationSync : PlayerSyncObject
Mirror.RebuildFloatParams();
NetworkAnimator.Invoke("Awake");
}
public void PickUpItem(int animHash)
{
VisibleAnimator.SetTrigger(animHash);
VisibleAnimator.SetLayerWeight(2, 1);
InvisibleAnimator.SetTrigger(animHash);
InvisibleAnimator.SetLayerWeight(2, 1);
}
public void DropItem()
{
VisibleAnimator.SetTrigger(DropHeldItem);
VisibleAnimator.SetLayerWeight(2, 1);
InvisibleAnimator.SetTrigger(DropHeldItem);
InvisibleAnimator.SetLayerWeight(2, 1);
}
}

View File

@ -15,7 +15,7 @@ public class AnimatorMirror : MonoBehaviour
private Animator _to;
private NetworkAnimator _networkAnimator;
private readonly Dictionary<string, AnimFloatParam> _floatParams = new();
private readonly Dictionary<int, AnimFloatParam> _floatParams = new();
/// <summary>
/// Initializes the Animator Mirror
@ -82,36 +82,38 @@ public class AnimatorMirror : MonoBehaviour
switch (fromParam.type)
{
case AnimatorControllerParameterType.Float:
_floatParams[fromParam.name].Target = _from.GetFloat(fromParam.name);
_floatParams[fromParam.nameHash].Target = _from.GetFloat(fromParam.nameHash);
break;
case AnimatorControllerParameterType.Int:
_to.SetInteger(fromParam.name, _from.GetInteger(fromParam.name));
_to.SetInteger(fromParam.nameHash, _from.GetInteger(fromParam.nameHash));
break;
case AnimatorControllerParameterType.Bool:
_to.SetBool(fromParam.name, _from.GetBool(fromParam.name));
_to.SetBool(fromParam.nameHash, _from.GetBool(fromParam.nameHash));
break;
case AnimatorControllerParameterType.Trigger:
if (_from.GetBool(fromParam.name) && !_to.GetBool(fromParam.name))
if (_from.GetBool(fromParam.nameHash) && !_to.GetBool(fromParam.nameHash))
{
if (_networkAnimator != null)
{
_networkAnimator.SetTrigger(fromParam.name);
DebugLog.DebugWrite($"Set {fromParam.name} on netanim");
_networkAnimator.SetTrigger(fromParam.nameHash);
}
_to.SetTrigger(fromParam.name);
_to.SetTrigger(fromParam.nameHash);
}
if (!_from.GetBool(fromParam.name) && _to.GetBool(fromParam.name))
if (!_from.GetBool(fromParam.nameHash) && _to.GetBool(fromParam.nameHash))
{
if (_networkAnimator != null)
{
_networkAnimator.ResetTrigger(fromParam.name);
DebugLog.DebugWrite($"Reset {fromParam.name} on netanim");
_networkAnimator.ResetTrigger(fromParam.nameHash);
}
_to.ResetTrigger(fromParam.name);
_to.ResetTrigger(fromParam.nameHash);
}
break;
@ -142,7 +144,7 @@ public class AnimatorMirror : MonoBehaviour
_floatParams.Clear();
foreach (var param in _from.parameters.Where(p => p.type == AnimatorControllerParameterType.Float))
{
_floatParams.Add(param.name, new AnimFloatParam());
_floatParams.Add(param.nameHash, new AnimFloatParam());
}
}
}

View File

@ -0,0 +1,63 @@
using HarmonyLib;
using QSB.Patches;
namespace QSB.Animation.Player.Patches;
[HarmonyPatch(typeof(PlayerAnimController))]
public class PlayerAnimControllerPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnModStart;
/*
* These patches preserve layer weights between animatorcontroller changes.
* No idea if this is intended Unity behaviour,
* but when changing the controller the layer weights get
* reset back to 0 - even if their default is not 0.
*/
[HarmonyPrefix]
[HarmonyPatch(nameof(PlayerAnimController.OnPutOnSuit))]
public static bool OnPutOnSuit(PlayerAnimController __instance)
{
var layerCount = __instance._animator.layerCount;
var layerWeights = new float[layerCount];
for (var i = 0; i < layerCount; i++)
{
layerWeights[i] = __instance._animator.GetLayerWeight(i);
}
__instance._animator.runtimeAnimatorController = __instance._baseAnimController;
__instance._unsuitedGroup.SetActive(false);
__instance._suitedGroup.SetActive(!PlayerState.InMapView());
for (var i = 0; i < layerCount; i++)
{
__instance._animator.SetLayerWeight(i, layerWeights[i]);
}
return false;
}
[HarmonyPrefix]
[HarmonyPatch(nameof(PlayerAnimController.OnRemoveSuit))]
public static bool OnRemoveSuit(PlayerAnimController __instance)
{
var layerCount = __instance._animator.layerCount;
var layerWeights = new float[layerCount];
for (var i = 0; i < layerCount; i++)
{
layerWeights[i] = __instance._animator.GetLayerWeight(i);
}
__instance._animator.runtimeAnimatorController = __instance._unsuitedAnimOverride;
__instance._unsuitedGroup.SetActive(!PlayerState.InMapView());
__instance._suitedGroup.SetActive(false);
for (var i = 0; i < layerCount; i++)
{
__instance._animator.SetLayerWeight(i, layerWeights[i]);
}
return false;
}
}

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,5 @@
using QSB.CampfireSync.WorldObjects;
using QSB.Animation.Player;
using QSB.CampfireSync.WorldObjects;
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Player;
@ -23,7 +24,7 @@ public class BurnSlideReelMessage : QSBWorldObjectMessage<QSBSlideReelItem, int>
campfire._burnedSlideReelSocket,
campfire._sector, null);
fromPlayer.HeldItem = null;
fromPlayer.AnimationSync.VisibleAnimator.SetTrigger("DropHeldItem");
fromPlayer.AnimationSync.DropItem();
WorldObject.AttachedObject.Burn();
campfire.SetDropSlideReelMode(false);
campfire._hasBurnedSlideReel = true;

View File

@ -1,4 +1,5 @@
using QSB.ItemSync.WorldObjects;
using QSB.Animation.Player;
using QSB.ItemSync.WorldObjects;
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Player;
@ -69,6 +70,6 @@ public class DropItemMessage : QSBWorldObjectMessage<IQSBItem,
var player = QSBPlayerManager.GetPlayer(From);
player.HeldItem = null;
player.AnimationSync.VisibleAnimator.SetTrigger("DropHeldItem");
player.AnimationSync.DropItem();
}
}

View File

@ -1,4 +1,5 @@
using QSB.ItemSync.WorldObjects.Items;
using QSB.Animation.Player;
using QSB.ItemSync.WorldObjects.Items;
using QSB.Messaging;
using QSB.Player;
using QSB.Utility;
@ -39,27 +40,27 @@ public class MoveToCarryMessage : QSBWorldObjectMessage<IQSBItem, uint>
switch (itemType)
{
case ItemType.Scroll:
player.AnimationSync.VisibleAnimator.SetTrigger("HoldScroll");
player.AnimationSync.PickUpItem(AnimationSync.HoldScroll);
break;
case ItemType.WarpCore:
if (((QSBWarpCoreItem)WorldObject).IsVesselCoreType())
{
player.AnimationSync.VisibleAnimator.SetTrigger("HoldAdvWarpCore");
player.AnimationSync.PickUpItem(AnimationSync.HoldAdvWarpCore);
}
else
{
player.AnimationSync.VisibleAnimator.SetTrigger("HoldWarpCore");
player.AnimationSync.PickUpItem(AnimationSync.HoldWarpCore);
}
break;
case ItemType.SharedStone:
player.AnimationSync.VisibleAnimator.SetTrigger("HoldSharedStone");
player.AnimationSync.PickUpItem(AnimationSync.HoldSharedStone);
break;
case ItemType.ConversationStone:
player.AnimationSync.VisibleAnimator.SetTrigger("HoldItem");
player.AnimationSync.PickUpItem(AnimationSync.HoldItem);
break;
case ItemType.Lantern:
player.AnimationSync.VisibleAnimator.SetTrigger("HoldLantern");
player.AnimationSync.PickUpItem(AnimationSync.HoldLantern);
break;
case ItemType.SlideReel:
case ItemType.DreamLantern:

View File

@ -1,4 +1,5 @@
using QSB.ItemSync.WorldObjects.Items;
using QSB.Animation.Player;
using QSB.ItemSync.WorldObjects.Items;
using QSB.ItemSync.WorldObjects.Sockets;
using QSB.Messaging;
using QSB.Player;
@ -29,7 +30,7 @@ public class SocketItemMessage : QSBWorldObjectMessage<IQSBItem, (SocketMessageT
var player = QSBPlayerManager.GetPlayer(From);
player.HeldItem = null;
player.AnimationSync.VisibleAnimator.SetTrigger("DropHeldItem");
player.AnimationSync.DropItem();
return;
}
case SocketMessageType.StartUnsocket:

View File

@ -13,6 +13,7 @@ using System;
using System.Linq;
using QSB.Menus;
using UnityEngine;
using Newtonsoft.Json.Linq;
namespace QSB.Utility;
@ -186,31 +187,73 @@ public class DebugGUI : MonoBehaviour, IAddComponentOnStart
WriteLine(2, $"Ready : {player.IsReady}");
WriteLine(2, $"Suited Up : {player.SuitedUp}");
WriteLine(2, $"In Suited Up State : {player.AnimationSync?.InSuitedUpState}");
WriteLine(2, $"InDreamWorld : {player.InDreamWorld}");
//WriteLine(2, $"InDreamWorld : {player.InDreamWorld}");
if (player.IsReady && QSBWorldSync.AllObjectsReady)
{
WriteLine(2, $"Illuminated : {player.LightSensor?.IsIlluminated()}");
var singleLightSensor = (SingleLightSensor)player.LightSensor;
// will be null for remote player light sensors
if (singleLightSensor?._lightSources != null)
/*if (singleLightSensor?._lightSources != null)
{
foreach (var item in singleLightSensor._lightSources)
{
WriteLine(2, $"- {item.GetLightSourceType()}");
}
}
}*/
var networkTransform = player.TransformSync;
var referenceSector = networkTransform.ReferenceSector;
var referenceTransform = networkTransform.ReferenceTransform;
WriteLine(2, $" - Ref. Sector : {(referenceSector == null ? "NULL" : referenceSector.Name)}", referenceSector == null ? Color.red : Color.white);
WriteLine(2, $" - Ref. Transform : {(referenceTransform == null ? "NULL" : referenceTransform.name)}", referenceTransform == null ? Color.red : Color.white);
WriteLine(2, $" - Local Position : {player.Body.transform.localPosition}");
WriteLine(2, $" - Position : {player.Body.transform.position}");
//WriteLine(2, $" - Ref. Sector : {(referenceSector == null ? "NULL" : referenceSector.Name)}", referenceSector == null ? Color.red : Color.white);
//WriteLine(2, $" - Ref. Transform : {(referenceTransform == null ? "NULL" : referenceTransform.name)}", referenceTransform == null ? Color.red : Color.white);
//WriteLine(2, $" - Local Position : {player.Body.transform.localPosition}");
//WriteLine(2, $" - Position : {player.Body.transform.position}");
WriteLine(2, $" - Entangled Object: {(player.EntangledObject == null ? "NULL" : player.EntangledObject.Name)}");
//WriteLine(2, $" - Entangled Object: {(player.EntangledObject == null ? "NULL" : player.EntangledObject.Name)}");
var visibleAnimator = player.AnimationSync.VisibleAnimator;
var invisibleAnimator = player.AnimationSync.InvisibleAnimator;
foreach (var param in visibleAnimator.parameters)
{
object value = null;
switch (param.type)
{
case AnimatorControllerParameterType.Bool:
value = visibleAnimator.GetBool(param.nameHash);
break;
case AnimatorControllerParameterType.Float:
value = visibleAnimator.GetFloat(param.nameHash);
break;
case AnimatorControllerParameterType.Int:
value = visibleAnimator.GetInteger(param.nameHash);
break;
case AnimatorControllerParameterType.Trigger:
value = visibleAnimator.GetBool(param.nameHash);
break;
}
//WriteLine(2, $" - {param.name} | {param.type} | {value}");
}
WriteLine(2, $" - VISIBLE ANIMATOR");
for (var i = 0; i < visibleAnimator.layerCount; i++)
{
var layerName = visibleAnimator.GetLayerName(i);
var weight = visibleAnimator.GetLayerWeight(i);
WriteLine(2, $" - {layerName} : {weight}");
//var currentState = visibleAnimator.GetCurrentAnimatorStateInfo(i);
//WriteLine(2, $" - Hash: {currentState.fullPathHash}");
//WriteLine(2, $" - Speed: {currentState.speed}");
WriteLine(2, $" - Clips:");
foreach (var item in visibleAnimator.GetCurrentAnimatorClipInfo(i))
{
WriteLine(2, $" - Clip name: {item.clip.name}");
//WriteLine(2, $" - Weight: {item.weight}");
}
}
}
}