192 lines
4.4 KiB
C#
192 lines
4.4 KiB
C#
using System;
|
|
using GameNetcodeStuff;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
public class RagdollGrabbableObject : GrabbableObject
|
|
{
|
|
public NetworkVariable<int> bodyID = new NetworkVariable<int>(0);
|
|
|
|
public DeadBodyInfo ragdoll;
|
|
|
|
private bool foundRagdollObject;
|
|
|
|
private bool bodySetToHold;
|
|
|
|
public bool testBody;
|
|
|
|
private bool setBodyInElevator;
|
|
|
|
private PlayerControllerB previousPlayerHeldBy;
|
|
|
|
private bool hasBeenPlaced;
|
|
|
|
public bool heldByEnemy;
|
|
|
|
private bool heldByEnemyThisFrame;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
if (HoarderBugAI.grabbableObjectsInMap != null && !HoarderBugAI.grabbableObjectsInMap.Contains(base.gameObject))
|
|
{
|
|
HoarderBugAI.grabbableObjectsInMap.Add(base.gameObject);
|
|
}
|
|
UnityEngine.Object.Destroy(radarIcon.gameObject);
|
|
}
|
|
|
|
public override void EquipItem()
|
|
{
|
|
base.EquipItem();
|
|
previousPlayerHeldBy = playerHeldBy;
|
|
hasBeenPlaced = false;
|
|
}
|
|
|
|
public override void OnPlaceObject()
|
|
{
|
|
base.OnPlaceObject();
|
|
hasBeenPlaced = true;
|
|
}
|
|
|
|
public override void OnDestroy()
|
|
{
|
|
base.OnDestroy();
|
|
if (foundRagdollObject && ragdoll != null)
|
|
{
|
|
UnityEngine.Object.Destroy(ragdoll.gameObject);
|
|
}
|
|
}
|
|
|
|
public override void Update()
|
|
{
|
|
base.Update();
|
|
if (NetworkManager.Singleton.ShutdownInProgress || bodyID.Value == -1)
|
|
{
|
|
return;
|
|
}
|
|
if (!foundRagdollObject)
|
|
{
|
|
if (testBody)
|
|
{
|
|
DeadBodyInfo[] array = UnityEngine.Object.FindObjectsOfType<DeadBodyInfo>();
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
if (array[i].playerObjectId == 0)
|
|
{
|
|
ragdoll = array[i];
|
|
break;
|
|
}
|
|
}
|
|
ragdoll.grabBodyObject = this;
|
|
parentObject = ragdoll.bodyParts[5].transform;
|
|
base.transform.SetParent(ragdoll.bodyParts[5].transform);
|
|
foundRagdollObject = true;
|
|
}
|
|
else
|
|
{
|
|
if (!(StartOfRound.Instance.allPlayerScripts[bodyID.Value].deadBody != null))
|
|
{
|
|
return;
|
|
}
|
|
ragdoll = StartOfRound.Instance.allPlayerScripts[bodyID.Value].deadBody;
|
|
ragdoll.grabBodyObject = this;
|
|
parentObject = ragdoll.bodyParts[5].transform;
|
|
base.transform.SetParent(ragdoll.bodyParts[5].transform);
|
|
foundRagdollObject = true;
|
|
}
|
|
}
|
|
if (ragdoll == null)
|
|
{
|
|
return;
|
|
}
|
|
if (isHeld || heldByEnemy || hasBeenPlaced)
|
|
{
|
|
if (hasBeenPlaced)
|
|
{
|
|
ragdoll.matchPositionExactly = false;
|
|
ragdoll.attachedLimb.isKinematic = false;
|
|
ragdoll.speedMultiplier = 45f;
|
|
ragdoll.maxVelocity = 0.75f;
|
|
}
|
|
if (!bodySetToHold)
|
|
{
|
|
if (heldByEnemy)
|
|
{
|
|
heldByEnemyThisFrame = true;
|
|
}
|
|
else
|
|
{
|
|
ragdoll.bodyBleedingHeavily = false;
|
|
}
|
|
grabbableToEnemies = false;
|
|
bodySetToHold = true;
|
|
ragdoll.gameObject.SetActive(value: true);
|
|
ragdoll.SetBodyPartsKinematic(setKinematic: false);
|
|
ragdoll.attachedTo = base.transform;
|
|
ragdoll.attachedLimb = ragdoll.bodyParts[5];
|
|
ragdoll.matchPositionExactly = true;
|
|
ragdoll.lerpBeforeMatchingPosition = true;
|
|
SetRagdollParentToMatchHoldingPlayer();
|
|
}
|
|
}
|
|
else if (bodySetToHold)
|
|
{
|
|
bodySetToHold = false;
|
|
grabbableToEnemies = true;
|
|
ragdoll.attachedTo = null;
|
|
parentObject = ragdoll.bodyParts[5].transform;
|
|
base.transform.SetParent(ragdoll.bodyParts[5].transform);
|
|
ragdoll.attachedLimb = null;
|
|
ragdoll.matchPositionExactly = false;
|
|
ragdoll.lerpBeforeMatchingPosition = false;
|
|
SetRagdollParentToMatchHoldingPlayer();
|
|
heldByEnemyThisFrame = false;
|
|
}
|
|
}
|
|
|
|
public override void GrabItemFromEnemy()
|
|
{
|
|
base.GrabItemFromEnemy();
|
|
heldByEnemy = true;
|
|
}
|
|
|
|
public override void DiscardItemFromEnemy()
|
|
{
|
|
base.GrabItemFromEnemy();
|
|
heldByEnemy = false;
|
|
}
|
|
|
|
private void SetRagdollParentToMatchHoldingPlayer()
|
|
{
|
|
if (!heldByEnemyThisFrame && previousPlayerHeldBy != null)
|
|
{
|
|
if (previousPlayerHeldBy.isInElevator && !setBodyInElevator)
|
|
{
|
|
setBodyInElevator = true;
|
|
ragdoll.transform.SetParent(StartOfRound.Instance.elevatorTransform);
|
|
}
|
|
else if (!previousPlayerHeldBy.isInElevator && setBodyInElevator)
|
|
{
|
|
setBodyInElevator = false;
|
|
ragdoll.transform.SetParent(null);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void __initializeVariables()
|
|
{
|
|
if (bodyID == null)
|
|
{
|
|
throw new Exception("RagdollGrabbableObject.bodyID cannot be null. All NetworkVariableBase instances must be initialized.");
|
|
}
|
|
bodyID.Initialize(this);
|
|
__nameNetworkVariable(bodyID, "bodyID");
|
|
NetworkVariableFields.Add(bodyID);
|
|
base.__initializeVariables();
|
|
}
|
|
|
|
protected internal override string __getTypeName()
|
|
{
|
|
return "RagdollGrabbableObject";
|
|
}
|
|
}
|