LethalCompany/Lethal Company/ExportedProject/Assets/Scripts/Assembly-CSharp/JetpackItem.cs

327 lines
8.7 KiB
C#
Raw Normal View History

2023-12-22 22:51:17 +00:00
using GameNetcodeStuff;
using Unity.Netcode;
using UnityEngine;
public class JetpackItem : GrabbableObject
{
public Transform backPart;
public Vector3 backPartRotationOffset;
public Vector3 backPartPositionOffset;
private float jetpackPower;
private bool jetpackActivated;
private Vector3 forces;
private bool jetpackActivatedPreviousFrame;
public GameObject fireEffect;
public AudioSource jetpackAudio;
public AudioSource jetpackBeepsAudio;
public AudioClip startJetpackSFX;
public AudioClip jetpackSustainSFX;
public AudioClip jetpackBrokenSFX;
public AudioClip jetpackWarningBeepSFX;
public AudioClip jetpackLowBatteriesSFX;
public ParticleSystem smokeTrailParticle;
private PlayerControllerB previousPlayerHeldBy;
private bool jetpackBroken;
private bool jetpackPlayingWarningBeep;
private bool jetpackPlayingLowBatteryBeep;
private float noiseInterval;
private RaycastHit rayHit;
public override void ItemActivate(bool used, bool buttonDown = true)
{
base.ItemActivate(used, buttonDown);
if (buttonDown)
{
ActivateJetpack();
}
else
{
DeactivateJetpack();
}
}
private void DeactivateJetpack()
{
if (previousPlayerHeldBy.jetpackControls)
{
previousPlayerHeldBy.disablingJetpackControls = true;
}
jetpackActivated = false;
jetpackActivatedPreviousFrame = false;
jetpackPlayingLowBatteryBeep = false;
jetpackPlayingWarningBeep = false;
jetpackBeepsAudio.Stop();
jetpackAudio.Stop();
smokeTrailParticle.Stop(withChildren: true, ParticleSystemStopBehavior.StopEmitting);
if (!jetpackBroken)
{
JetpackEffect(enable: false);
}
}
private void ActivateJetpack()
{
if (jetpackBroken)
{
jetpackAudio.PlayOneShot(jetpackBrokenSFX);
return;
}
if (!jetpackActivatedPreviousFrame)
{
playerHeldBy.jetpackTurnCompass.rotation = playerHeldBy.transform.rotation;
JetpackEffect(enable: true);
jetpackActivatedPreviousFrame = true;
}
playerHeldBy.disablingJetpackControls = false;
playerHeldBy.jetpackControls = true;
jetpackActivated = true;
playerHeldBy.syncFullRotation = playerHeldBy.transform.eulerAngles;
}
private void JetpackEffect(bool enable)
{
fireEffect.SetActive(enable);
if (enable)
{
if (!jetpackActivatedPreviousFrame)
{
jetpackAudio.PlayOneShot(startJetpackSFX);
}
smokeTrailParticle.Play();
jetpackAudio.clip = jetpackSustainSFX;
jetpackAudio.Play();
Debug.Log($"Is jetpack audio playing?: {jetpackAudio.isPlaying}");
}
else
{
smokeTrailParticle.Stop(withChildren: true, ParticleSystemStopBehavior.StopEmitting);
jetpackAudio.Stop();
}
if (Vector3.Distance(GameNetworkManager.Instance.localPlayerController.transform.position, base.transform.position) < 10f)
{
HUDManager.Instance.ShakeCamera(ScreenShakeType.Big);
}
}
public override void UseUpBatteries()
{
DeactivateJetpack();
}
public override void DiscardItem()
{
Debug.Log($"Owner of jetpack?: {base.IsOwner}");
Debug.Log($"Is dead?: {playerHeldBy.isPlayerDead}");
if (base.IsOwner && playerHeldBy.isPlayerDead && !jetpackBroken && playerHeldBy.jetpackControls)
{
ExplodeJetpackServerRpc();
}
JetpackEffect(enable: false);
DeactivateJetpack();
jetpackPower = 0f;
base.DiscardItem();
}
[ServerRpc(RequireOwnership = false)]
public void ExplodeJetpackServerRpc()
{
NetworkManager networkManager = base.NetworkManager;
if ((object)networkManager != null && networkManager.IsListening)
{
if (__rpc_exec_stage != __RpcExecStage.Server && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams serverRpcParams = default(ServerRpcParams);
FastBufferWriter bufferWriter = __beginSendServerRpc(3663112878u, serverRpcParams, RpcDelivery.Reliable);
__endSendServerRpc(ref bufferWriter, 3663112878u, serverRpcParams, RpcDelivery.Reliable);
}
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
{
ExplodeJetpackClientRpc();
}
}
}
[ClientRpc]
public void ExplodeJetpackClientRpc()
{
NetworkManager networkManager = base.NetworkManager;
if ((object)networkManager != null && networkManager.IsListening)
{
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams clientRpcParams = default(ClientRpcParams);
FastBufferWriter bufferWriter = __beginSendClientRpc(2295726646u, clientRpcParams, RpcDelivery.Reliable);
__endSendClientRpc(ref bufferWriter, 2295726646u, clientRpcParams, RpcDelivery.Reliable);
}
if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost) && !jetpackBroken)
{
jetpackBroken = true;
itemUsedUp = true;
Debug.Log("Spawning explosion");
Landmine.SpawnExplosion(base.transform.position, spawnExplosionEffect: true, 5f, 7f);
}
}
}
public override void EquipItem()
{
base.EquipItem();
previousPlayerHeldBy = playerHeldBy;
}
public override void Update()
{
base.Update();
if (GameNetworkManager.Instance == null || GameNetworkManager.Instance.localPlayerController == null)
{
return;
}
SetJetpackAudios();
2023-12-23 00:05:55 +00:00
if (playerHeldBy == null || !base.IsOwner || playerHeldBy != GameNetworkManager.Instance.localPlayerController)
2023-12-22 22:51:17 +00:00
{
return;
}
if (jetpackActivated)
{
jetpackPower = Mathf.Clamp(jetpackPower + Time.deltaTime * 10f, 0f, 500f);
}
else
{
jetpackPower = Mathf.Clamp(jetpackPower - Time.deltaTime * 75f, 0f, 1000f);
if (playerHeldBy.thisController.isGrounded)
{
jetpackPower = 0f;
}
}
forces = Vector3.Lerp(forces, Vector3.ClampMagnitude(playerHeldBy.transform.up * jetpackPower, 400f), Time.deltaTime);
if (!playerHeldBy.jetpackControls)
{
forces = Vector3.zero;
}
if (!playerHeldBy.isPlayerDead && Physics.Raycast(playerHeldBy.transform.position, forces, out rayHit, 25f, StartOfRound.Instance.allPlayersCollideWithMask) && forces.magnitude - rayHit.distance > 50f && rayHit.distance < 4f)
{
playerHeldBy.KillPlayer(forces, spawnBody: true, CauseOfDeath.Gravity);
}
playerHeldBy.externalForces += forces;
}
private void SetJetpackAudios()
{
if (jetpackActivated)
{
if (noiseInterval >= 0.5f)
{
noiseInterval = 0f;
RoundManager.Instance.PlayAudibleNoise(base.transform.position, 25f, 0.85f, 0, playerHeldBy.isInHangarShipRoom && StartOfRound.Instance.hangarDoorsClosed, 41);
}
else
{
noiseInterval += Time.deltaTime;
}
if (insertedBattery.charge < 0.15f)
{
if (!jetpackPlayingLowBatteryBeep)
{
jetpackPlayingLowBatteryBeep = true;
jetpackBeepsAudio.clip = jetpackLowBatteriesSFX;
jetpackBeepsAudio.Play();
}
}
else if (Physics.CheckSphere(base.transform.position, 6f, StartOfRound.Instance.collidersAndRoomMaskAndDefault))
{
if (!jetpackPlayingWarningBeep && !jetpackPlayingLowBatteryBeep)
{
jetpackPlayingWarningBeep = true;
jetpackBeepsAudio.clip = jetpackWarningBeepSFX;
jetpackBeepsAudio.Play();
}
}
else
{
jetpackBeepsAudio.Stop();
}
}
else
{
jetpackPlayingWarningBeep = false;
jetpackPlayingLowBatteryBeep = false;
jetpackBeepsAudio.Stop();
}
}
public override void LateUpdate()
{
base.LateUpdate();
if (playerHeldBy != null && isHeld)
{
backPart.position = playerHeldBy.lowerSpine.position;
backPart.rotation = playerHeldBy.lowerSpine.rotation;
base.transform.Rotate(backPartRotationOffset);
backPart.position = playerHeldBy.lowerSpine.position;
Vector3 vector = backPartPositionOffset;
vector = playerHeldBy.lowerSpine.rotation * vector;
backPart.position += vector;
}
}
protected override void __initializeVariables()
{
base.__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_JetpackItem()
{
NetworkManager.__rpc_func_table.Add(3663112878u, __rpc_handler_3663112878);
NetworkManager.__rpc_func_table.Add(2295726646u, __rpc_handler_2295726646);
}
private static void __rpc_handler_3663112878(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
NetworkManager networkManager = target.NetworkManager;
if ((object)networkManager != null && networkManager.IsListening)
{
target.__rpc_exec_stage = __RpcExecStage.Server;
((JetpackItem)target).ExplodeJetpackServerRpc();
target.__rpc_exec_stage = __RpcExecStage.None;
}
}
private static void __rpc_handler_2295726646(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
NetworkManager networkManager = target.NetworkManager;
if ((object)networkManager != null && networkManager.IsListening)
{
target.__rpc_exec_stage = __RpcExecStage.Client;
((JetpackItem)target).ExplodeJetpackClientRpc();
target.__rpc_exec_stage = __RpcExecStage.None;
}
}
protected internal override string __getTypeName()
{
return "JetpackItem";
}
}