mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-01-11 09:38:48 +00:00
123 lines
4.3 KiB
C#
123 lines
4.3 KiB
C#
using QSB.Events;
|
|
using QSB.Patches;
|
|
using QSB.Player;
|
|
using QSB.WorldSync;
|
|
using UnityEngine;
|
|
|
|
namespace QSB.Animation.Patches
|
|
{
|
|
internal class PlayerAnimationPatches : QSBPatch
|
|
{
|
|
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
|
|
|
|
public override void DoPatches() => QSBCore.HarmonyHelper.AddPrefix<PlayerAnimController>("LateUpdate", typeof(PlayerAnimationPatches), nameof(PlayerAnimController_LateUpdate));
|
|
public override void DoUnpatches() => QSBCore.HarmonyHelper.Unpatch<PlayerAnimController>("LateUpdate");
|
|
|
|
public static bool PlayerAnimController_LateUpdate(
|
|
PlayerAnimController __instance,
|
|
PlayerCharacterController ____playerController,
|
|
ThrusterModel ____playerJetpack,
|
|
ref float ____ungroundedTime,
|
|
Animator ____animator,
|
|
ref bool ____justBecameGrounded,
|
|
ref bool ____justTookFallDamage,
|
|
ref bool ____leftFootGrounded,
|
|
ref bool ____rightFootGrounded,
|
|
ref bool ____rightArmHidden,
|
|
GameObject[] ____rightArmObjects,
|
|
int ____defaultLayer,
|
|
int ____probeOnlyLayer)
|
|
{
|
|
var isGrounded = ____playerController.IsGrounded();
|
|
var isAttached = PlayerState.IsAttached();
|
|
var isInZeroG = PlayerState.InZeroG();
|
|
var isFlying = ____playerJetpack.GetLocalAcceleration().y > 0f;
|
|
var movementVector = Vector3.zero;
|
|
if (!isAttached)
|
|
{
|
|
movementVector = ____playerController.GetRelativeGroundVelocity();
|
|
}
|
|
if (Mathf.Abs(movementVector.x) < 0.05f)
|
|
{
|
|
movementVector.x = 0f;
|
|
}
|
|
if (Mathf.Abs(movementVector.z) < 0.05f)
|
|
{
|
|
movementVector.z = 0f;
|
|
}
|
|
if (isFlying)
|
|
{
|
|
____ungroundedTime = Time.time;
|
|
}
|
|
var freefallMagnitude = 0f;
|
|
var timeInFreefall = 0f;
|
|
var lastGroundBody = ____playerController.GetLastGroundBody();
|
|
if (!isGrounded && !isAttached && !isInZeroG && lastGroundBody != null)
|
|
{
|
|
freefallMagnitude = (____playerController.GetAttachedOWRigidbody(false).GetVelocity() - lastGroundBody.GetPointVelocity(____playerController.transform.position)).magnitude;
|
|
timeInFreefall = Time.time - ____ungroundedTime;
|
|
}
|
|
____animator.SetFloat("RunSpeedX", movementVector.x / 3f);
|
|
____animator.SetFloat("RunSpeedY", movementVector.z / 3f);
|
|
____animator.SetFloat("TurnSpeed", ____playerController.GetTurning());
|
|
____animator.SetBool("Grounded", isGrounded || isAttached || PlayerState.IsRecentlyDetached());
|
|
____animator.SetLayerWeight(1, ____playerController.GetJumpChargeFraction());
|
|
____animator.SetFloat("FreefallSpeed", freefallMagnitude / 15f * (timeInFreefall / 3f));
|
|
____animator.SetBool("InZeroG", isInZeroG || isFlying);
|
|
____animator.SetBool("UsingJetpack", isInZeroG && PlayerState.IsWearingSuit());
|
|
if (____justBecameGrounded)
|
|
{
|
|
var playerAnimationSync = QSBPlayerManager.LocalPlayer.AnimationSync;
|
|
if (____justTookFallDamage)
|
|
{
|
|
____animator.SetTrigger("LandHard");
|
|
QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "LandHard");
|
|
}
|
|
else
|
|
{
|
|
____animator.SetTrigger("Land");
|
|
QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "Land");
|
|
}
|
|
}
|
|
if (isGrounded)
|
|
{
|
|
var leftFootLift = ____animator.GetFloat("LeftFootLift");
|
|
if (!____leftFootGrounded && leftFootLift < 0.333f)
|
|
{
|
|
____leftFootGrounded = true;
|
|
QSBWorldSync.RaiseEvent(__instance, "OnLeftFootGrounded");
|
|
}
|
|
else if (____leftFootGrounded && leftFootLift > 0.666f)
|
|
{
|
|
____leftFootGrounded = false;
|
|
QSBWorldSync.RaiseEvent(__instance, "OnLeftFootLift");
|
|
}
|
|
var rightFootLift = ____animator.GetFloat("RightFootLift");
|
|
if (!____rightFootGrounded && rightFootLift < 0.333f)
|
|
{
|
|
____rightFootGrounded = true;
|
|
QSBWorldSync.RaiseEvent(__instance, "OnRightFootGrounded");
|
|
}
|
|
else if (____rightFootGrounded && rightFootLift > 0.666f)
|
|
{
|
|
____rightFootGrounded = false;
|
|
QSBWorldSync.RaiseEvent(__instance, "OnRightFootLift");
|
|
}
|
|
}
|
|
____justBecameGrounded = false;
|
|
____justTookFallDamage = false;
|
|
var usingTool = Locator.GetToolModeSwapper().GetToolMode() != ToolMode.None;
|
|
if ((usingTool && !____rightArmHidden) || (!usingTool && ____rightArmHidden))
|
|
{
|
|
____rightArmHidden = usingTool;
|
|
for (var i = 0; i < ____rightArmObjects.Length; i++)
|
|
{
|
|
____rightArmObjects[i].layer = (!____rightArmHidden) ? ____defaultLayer : ____probeOnlyLayer;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|