887 lines
27 KiB
C#
887 lines
27 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Linq;
|
|
using DigitalRuby.ThunderAndLightning;
|
|
using GameNetcodeStuff;
|
|
using Unity.Netcode;
|
|
using UnityEngine;
|
|
|
|
public class PatcherTool : GrabbableObject
|
|
{
|
|
[Space(15f)]
|
|
public float gunAnomalyDamage = 1f;
|
|
|
|
public bool isShocking;
|
|
|
|
public IShockableWithGun shockedTargetScript;
|
|
|
|
[Space(15f)]
|
|
public Light flashlightBulb;
|
|
|
|
public Light flashlightBulbGlow;
|
|
|
|
public AudioSource mainAudio;
|
|
|
|
public AudioSource shockAudio;
|
|
|
|
public AudioSource gunAudio;
|
|
|
|
public AudioClip[] activateClips;
|
|
|
|
public AudioClip[] beginShockClips;
|
|
|
|
public AudioClip[] overheatClips;
|
|
|
|
public AudioClip[] finishShockClips;
|
|
|
|
public AudioClip outOfBatteriesClip;
|
|
|
|
public AudioClip detectAnomaly;
|
|
|
|
public AudioClip scanAnomaly;
|
|
|
|
public Material bulbLight;
|
|
|
|
public Material bulbDark;
|
|
|
|
public Animator effectAnimator;
|
|
|
|
public Animator gunAnimator;
|
|
|
|
public ParticleSystem overheatParticle;
|
|
|
|
private Coroutine scanGunCoroutine;
|
|
|
|
private Coroutine beginShockCoroutine;
|
|
|
|
public Transform aimDirection;
|
|
|
|
private int anomalyMask = 524296;
|
|
|
|
private int roomMask = 256;
|
|
|
|
private RaycastHit hit;
|
|
|
|
private Ray ray;
|
|
|
|
public GameObject lightningObject;
|
|
|
|
public Transform lightningDest;
|
|
|
|
public Transform lightningBend1;
|
|
|
|
public Transform lightningBend2;
|
|
|
|
private Vector3 shockVectorMidpoint;
|
|
|
|
[Header("Shock difficulty variables")]
|
|
public float bendStrengthCap = 3f;
|
|
|
|
public float endStrengthCap = 4.25f;
|
|
|
|
private float currentEndStrengthCap;
|
|
|
|
public float bendChangeSpeedMultiplier = 10f;
|
|
|
|
public float endChangeSpeedMultiplier = 17f;
|
|
|
|
private float currentEndChangeSpeedMultiplier;
|
|
|
|
public float pullStrength;
|
|
|
|
public float endPullStrength = 4.25f;
|
|
|
|
private float currentEndPullStrength;
|
|
|
|
public float maxChangePerFrame = 0.15f;
|
|
|
|
public float endChangePerFrame = 2.5f;
|
|
|
|
private float currentEndChangePerFrame;
|
|
|
|
[HideInInspector]
|
|
public float bendMultiplier;
|
|
|
|
[HideInInspector]
|
|
private float bendRandomizerShift;
|
|
|
|
[HideInInspector]
|
|
private Vector3 bendVector;
|
|
|
|
public float gunOverheat;
|
|
|
|
[HideInInspector]
|
|
private bool sentStopShockingRPC;
|
|
|
|
[HideInInspector]
|
|
private bool wasShockingPreviousFrame;
|
|
|
|
private LightningSplineScript lightningScript;
|
|
|
|
private System.Random gunRandom;
|
|
|
|
private int timesUsed;
|
|
|
|
private bool lightningVisible;
|
|
|
|
private float minigameChecksInterval;
|
|
|
|
private float timeSpentShocking;
|
|
|
|
private float makeAudibleNoiseTimer;
|
|
|
|
public static int finishedShockMinigame;
|
|
|
|
private RaycastHit[] raycastEnemies;
|
|
|
|
private bool isScanning;
|
|
|
|
private float currentDifficultyMultiplier;
|
|
|
|
private PlayerControllerB previousPlayerHeldBy;
|
|
|
|
public override void Start()
|
|
{
|
|
base.Start();
|
|
raycastEnemies = new RaycastHit[12];
|
|
}
|
|
|
|
public override void OnDestroy()
|
|
{
|
|
base.OnDestroy();
|
|
if (lightningDest != null && lightningDest.gameObject != null)
|
|
{
|
|
UnityEngine.Object.Destroy(lightningDest.gameObject);
|
|
}
|
|
}
|
|
|
|
public override void ItemActivate(bool used, bool buttonDown = true)
|
|
{
|
|
base.ItemActivate(used, buttonDown);
|
|
gunOverheat = 0f;
|
|
if (playerHeldBy == null)
|
|
{
|
|
return;
|
|
}
|
|
if (scanGunCoroutine != null)
|
|
{
|
|
StopCoroutine(scanGunCoroutine);
|
|
scanGunCoroutine = null;
|
|
}
|
|
if (beginShockCoroutine != null)
|
|
{
|
|
StopCoroutine(beginShockCoroutine);
|
|
beginShockCoroutine = null;
|
|
}
|
|
if (isShocking)
|
|
{
|
|
Debug.Log("Stop shocking gun");
|
|
StopShockingAnomalyOnClient(failed: true);
|
|
}
|
|
else if (isScanning)
|
|
{
|
|
SwitchFlashlight(on: false);
|
|
gunAudio.Stop();
|
|
currentUseCooldown = 0.5f;
|
|
if (scanGunCoroutine != null)
|
|
{
|
|
StopCoroutine(scanGunCoroutine);
|
|
scanGunCoroutine = null;
|
|
}
|
|
isScanning = false;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Start scanning gun");
|
|
isScanning = true;
|
|
sentStopShockingRPC = false;
|
|
scanGunCoroutine = StartCoroutine(ScanGun());
|
|
currentUseCooldown = 0.5f;
|
|
Debug.Log("Use patcher tool");
|
|
PlayRandomAudio(mainAudio, activateClips);
|
|
SwitchFlashlight(on: true);
|
|
}
|
|
}
|
|
|
|
private void PlayRandomAudio(AudioSource audioSource, AudioClip[] audioClips)
|
|
{
|
|
if (audioClips.Length != 0)
|
|
{
|
|
audioSource.PlayOneShot(audioClips[UnityEngine.Random.Range(0, audioClips.Length)]);
|
|
}
|
|
}
|
|
|
|
private bool GunMeetsConditionsToShock(PlayerControllerB playerUsingGun, Vector3 targetPosition, float maxAngle = 80f)
|
|
{
|
|
Debug.Log($"Target position: {targetPosition}");
|
|
Vector3 position = playerUsingGun.gameplayCamera.transform.position;
|
|
Vector3 vector = position;
|
|
vector.y = targetPosition.y;
|
|
if (Vector3.Angle(playerUsingGun.transform.forward, targetPosition - position) > maxAngle)
|
|
{
|
|
return false;
|
|
}
|
|
if (gunOverheat > 2f || Vector3.Distance(position, targetPosition) < 0.7f || Vector3.Distance(position, targetPosition) > 13f || Physics.Linecast(position, targetPosition, StartOfRound.Instance.collidersAndRoomMask, QueryTriggerInteraction.Ignore))
|
|
{
|
|
if (Physics.Linecast(position, targetPosition, out var hitInfo, StartOfRound.Instance.collidersAndRoomMask, QueryTriggerInteraction.Ignore))
|
|
{
|
|
Debug.Log(hitInfo.transform.name);
|
|
Debug.Log(hitInfo.transform.gameObject.name);
|
|
Debug.DrawLine(position, targetPosition, Color.green, 25f);
|
|
}
|
|
Debug.Log($"Gun not meeting conditions to zap; {gunOverheat > 2f}; {Vector3.Distance(position, targetPosition) < 0.7f}; {Physics.Linecast(position, targetPosition, StartOfRound.Instance.collidersAndRoomMask, QueryTriggerInteraction.Ignore)}");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public override void LateUpdate()
|
|
{
|
|
base.LateUpdate();
|
|
if (!lightningVisible)
|
|
{
|
|
return;
|
|
}
|
|
if (isShocking && shockedTargetScript != null && playerHeldBy != null && !playerHeldBy.isPlayerDead && !insertedBattery.empty)
|
|
{
|
|
timeSpentShocking += Time.deltaTime / 8f;
|
|
if (makeAudibleNoiseTimer <= 0f)
|
|
{
|
|
makeAudibleNoiseTimer = 0.8f;
|
|
RoundManager.Instance.PlayAudibleNoise(base.transform.position, 20f, 0.92f, 0, isInShipRoom && StartOfRound.Instance.hangarDoorsClosed, 11);
|
|
}
|
|
else
|
|
{
|
|
makeAudibleNoiseTimer -= Time.deltaTime;
|
|
}
|
|
Vector3 shockablePosition = shockedTargetScript.GetShockablePosition();
|
|
lightningDest.position = shockablePosition + new Vector3(UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f), UnityEngine.Random.Range(-0.3f, 0.3f));
|
|
shockVectorMidpoint = Vector3.Normalize(shockedTargetScript.GetShockableTransform().position - aimDirection.position);
|
|
bendVector = playerHeldBy.transform.right * bendMultiplier;
|
|
lightningBend1.position = aimDirection.position + 0.3f * shockVectorMidpoint + bendVector;
|
|
lightningBend2.position = aimDirection.position + 0.6f * shockVectorMidpoint + bendVector;
|
|
if (bendRandomizerShift < 0f)
|
|
{
|
|
float num = Mathf.Clamp(RandomFloatInRange(gunRandom, -1f + Mathf.Round(bendRandomizerShift), 1f) * (bendChangeSpeedMultiplier * Time.deltaTime), 0f - maxChangePerFrame, maxChangePerFrame);
|
|
bendMultiplier = Mathf.Clamp(bendMultiplier + num, 0f - bendStrengthCap, bendStrengthCap);
|
|
}
|
|
else
|
|
{
|
|
float num2 = Mathf.Clamp(RandomFloatInRange(gunRandom, -1f, 1f + Mathf.Round(bendRandomizerShift)) * (bendChangeSpeedMultiplier * Time.deltaTime), 0f - maxChangePerFrame, maxChangePerFrame);
|
|
bendMultiplier = Mathf.Clamp(bendMultiplier + num2, 0f - bendStrengthCap, bendStrengthCap);
|
|
}
|
|
ShiftBendRandomizer();
|
|
AdjustDifficultyValues();
|
|
if (!base.IsOwner)
|
|
{
|
|
return;
|
|
}
|
|
wasShockingPreviousFrame = true;
|
|
float num3 = Mathf.Abs(Mathf.Clamp(bendMultiplier * 0.5f, -0.5f, 0.5f) - playerHeldBy.shockMinigamePullPosition * 2f);
|
|
playerHeldBy.turnCompass.Rotate(Vector3.up * 100f * bendMultiplier * pullStrength * Time.deltaTime);
|
|
RoundManager.Instance.tempTransform.eulerAngles = new Vector3(0f, playerHeldBy.gameplayCamera.transform.eulerAngles.y, playerHeldBy.gameplayCamera.transform.eulerAngles.z);
|
|
if (Vector3.Angle(RoundManager.Instance.tempTransform.forward, new Vector3(lightningDest.position.x, playerHeldBy.gameplayCamera.transform.position.y, lightningDest.position.z) - playerHeldBy.gameplayCamera.transform.position) > 90f)
|
|
{
|
|
gunOverheat += Time.deltaTime * 10f;
|
|
}
|
|
if (bendMultiplier < -0.3f)
|
|
{
|
|
if (playerHeldBy.shockMinigamePullPosition < 0f)
|
|
{
|
|
gunOverheat = Mathf.Clamp(gunOverheat - Time.deltaTime * 3f, 0f, 10f);
|
|
}
|
|
else
|
|
{
|
|
gunOverheat += Time.deltaTime * (num3 * 2f);
|
|
}
|
|
HUDManager.Instance.SetTutorialArrow(2);
|
|
}
|
|
else if (bendMultiplier > 0.3f)
|
|
{
|
|
if (playerHeldBy.shockMinigamePullPosition > 0f)
|
|
{
|
|
gunOverheat = Mathf.Clamp(gunOverheat - Time.deltaTime * 3f, 0f, 10f);
|
|
}
|
|
else
|
|
{
|
|
gunOverheat += Time.deltaTime * (num3 * 2f);
|
|
}
|
|
HUDManager.Instance.SetTutorialArrow(1);
|
|
}
|
|
else
|
|
{
|
|
HUDManager.Instance.SetTutorialArrow(0);
|
|
}
|
|
minigameChecksInterval -= Time.deltaTime;
|
|
if (minigameChecksInterval <= 0f)
|
|
{
|
|
minigameChecksInterval = 0.15f;
|
|
if (shockedTargetScript == null || !GunMeetsConditionsToShock(playerHeldBy, shockablePosition))
|
|
{
|
|
StopShockingAnomalyOnClient(failed: true);
|
|
return;
|
|
}
|
|
}
|
|
if (gunOverheat > 0.75f)
|
|
{
|
|
gunAudio.volume = Mathf.Lerp(gunAudio.volume, 1f, 13f * Time.deltaTime);
|
|
gunAnimator.SetBool("Overheating", value: true);
|
|
}
|
|
else
|
|
{
|
|
gunAudio.volume = Mathf.Lerp(gunAudio.volume, 0f, 7f * Time.deltaTime);
|
|
gunAnimator.SetBool("Overheating", value: false);
|
|
}
|
|
}
|
|
else if (wasShockingPreviousFrame)
|
|
{
|
|
wasShockingPreviousFrame = false;
|
|
timeSpentShocking = 0f;
|
|
if (base.IsOwner)
|
|
{
|
|
StopShockingAnomalyOnClient();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AdjustDifficultyValues()
|
|
{
|
|
bendStrengthCap = Mathf.Lerp(0.4f, currentEndStrengthCap, timeSpentShocking * currentDifficultyMultiplier);
|
|
bendChangeSpeedMultiplier = Mathf.Lerp(3.5f, currentEndChangeSpeedMultiplier, timeSpentShocking * currentDifficultyMultiplier);
|
|
pullStrength = Mathf.Lerp(0.4f, currentEndPullStrength, timeSpentShocking * currentDifficultyMultiplier);
|
|
maxChangePerFrame = Mathf.Lerp(0.13f, currentEndChangePerFrame, timeSpentShocking * currentDifficultyMultiplier);
|
|
lightningScript.Forkedness = Mathf.Lerp(0.11f, 0.45f, timeSpentShocking * currentDifficultyMultiplier);
|
|
lightningScript.ForkLengthMultiplier = Mathf.Lerp(0.11f, 1.1f, timeSpentShocking * currentDifficultyMultiplier);
|
|
lightningScript.ForkLengthVariance = Mathf.Lerp(0.08f, 4f, timeSpentShocking * currentDifficultyMultiplier);
|
|
shockAudio.volume = Mathf.Lerp(0.1f, 1f, timeSpentShocking * currentDifficultyMultiplier);
|
|
}
|
|
|
|
private void InitialDifficultyValues()
|
|
{
|
|
currentEndStrengthCap = SetCurrentDifficultyValue(endStrengthCap, 1.4f);
|
|
currentEndChangeSpeedMultiplier = SetCurrentDifficultyValue(endChangeSpeedMultiplier, 7f);
|
|
currentEndPullStrength = SetCurrentDifficultyValue(endPullStrength, 0.4f);
|
|
currentEndChangePerFrame = SetCurrentDifficultyValue(endChangePerFrame, 0.12f);
|
|
}
|
|
|
|
private float SetCurrentDifficultyValue(float max, float min)
|
|
{
|
|
return shockedTargetScript.GetDifficultyMultiplier() * (max - min) + min;
|
|
}
|
|
|
|
public void ShiftBendRandomizer()
|
|
{
|
|
if (bendMultiplier < 0f)
|
|
{
|
|
if (bendMultiplier < -0.5f)
|
|
{
|
|
bendRandomizerShift += 1f * Time.deltaTime;
|
|
}
|
|
else
|
|
{
|
|
bendRandomizerShift -= 1f * Time.deltaTime;
|
|
}
|
|
}
|
|
else if (bendMultiplier > 0.5f)
|
|
{
|
|
bendRandomizerShift -= 1f * Time.deltaTime;
|
|
}
|
|
else
|
|
{
|
|
bendRandomizerShift += 1f * Time.deltaTime;
|
|
}
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
StartCoroutine(waitForStartOfRoundInstance());
|
|
}
|
|
|
|
private IEnumerator waitForStartOfRoundInstance()
|
|
{
|
|
yield return new WaitUntil(() => StartOfRound.Instance != null && StartOfRound.Instance.CameraSwitchEvent != null && StartOfRound.Instance.activeCamera != null);
|
|
StartOfRound.Instance.CameraSwitchEvent.AddListener(OnSwitchCamera);
|
|
if (StartOfRound.Instance != null && StartOfRound.Instance.activeCamera != null)
|
|
{
|
|
lightningScript = lightningObject.GetComponent<LightningSplineScript>();
|
|
lightningScript.Camera = StartOfRound.Instance.activeCamera;
|
|
}
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
StartOfRound.Instance.CameraSwitchEvent.RemoveListener(OnSwitchCamera);
|
|
}
|
|
|
|
private void OnSwitchCamera()
|
|
{
|
|
lightningObject.GetComponent<LightningSplineScript>().Camera = StartOfRound.Instance.activeCamera;
|
|
}
|
|
|
|
private IEnumerator ScanGun()
|
|
{
|
|
effectAnimator.SetTrigger("Scan");
|
|
gunAudio.PlayOneShot(scanAnomaly);
|
|
lightningScript = lightningObject.GetComponent<LightningSplineScript>();
|
|
lightningDest.SetParent(null);
|
|
lightningBend1.SetParent(null);
|
|
lightningBend2.SetParent(null);
|
|
Debug.Log("Scan A");
|
|
for (int i = 0; i < 12; i++)
|
|
{
|
|
if (base.IsOwner)
|
|
{
|
|
Debug.Log("Scan B");
|
|
if (isPocketed)
|
|
{
|
|
yield break;
|
|
}
|
|
ray = new Ray(playerHeldBy.gameplayCamera.transform.position - playerHeldBy.gameplayCamera.transform.forward * 3f, playerHeldBy.gameplayCamera.transform.forward);
|
|
Debug.DrawRay(playerHeldBy.gameplayCamera.transform.position - playerHeldBy.gameplayCamera.transform.forward * 3f, playerHeldBy.gameplayCamera.transform.forward * 6f, Color.red, 5f);
|
|
int num = Physics.SphereCastNonAlloc(ray, 5f, raycastEnemies, 5f, anomalyMask, QueryTriggerInteraction.Collide);
|
|
raycastEnemies = raycastEnemies.OrderBy((RaycastHit x) => x.distance).ToArray();
|
|
for (int j = 0; j < num; j++)
|
|
{
|
|
if (j >= raycastEnemies.Length)
|
|
{
|
|
continue;
|
|
}
|
|
hit = raycastEnemies[j];
|
|
if (!(hit.transform == null) && hit.transform.gameObject.TryGetComponent<IShockableWithGun>(out var component) && component.CanBeShocked())
|
|
{
|
|
Vector3 shockablePosition = component.GetShockablePosition();
|
|
Debug.Log("Got shockable transform name : " + component.GetShockableTransform().gameObject.name);
|
|
if (GunMeetsConditionsToShock(playerHeldBy, shockablePosition, 60f))
|
|
{
|
|
gunAudio.Stop();
|
|
BeginShockingAnomalyOnClient(component);
|
|
yield break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
yield return new WaitForSeconds(0.125f);
|
|
}
|
|
Debug.Log("Zap gun light off!!!");
|
|
SwitchFlashlight(on: false);
|
|
isScanning = false;
|
|
}
|
|
|
|
public void BeginShockingAnomalyOnClient(IShockableWithGun shockableScript)
|
|
{
|
|
timesUsed++;
|
|
sentStopShockingRPC = false;
|
|
gunRandom = new System.Random(playerHeldBy.playersManager.randomMapSeed + timesUsed);
|
|
gunOverheat = 0f;
|
|
shockedTargetScript = shockableScript;
|
|
currentDifficultyMultiplier = shockableScript.GetDifficultyMultiplier();
|
|
InitialDifficultyValues();
|
|
bendMultiplier = 0f;
|
|
bendRandomizerShift = 0f;
|
|
if (beginShockCoroutine != null)
|
|
{
|
|
StopCoroutine(beginShockCoroutine);
|
|
}
|
|
beginShockCoroutine = StartCoroutine(beginShockGame(shockableScript));
|
|
}
|
|
|
|
private IEnumerator beginShockGame(IShockableWithGun shockableScript)
|
|
{
|
|
if (shockableScript == null || shockableScript.GetNetworkObject() == null)
|
|
{
|
|
Debug.LogError($"Zap gun: The shockable script was null when starting the minigame! ; {shockableScript == null}; {shockableScript.GetNetworkObject() == null}");
|
|
isScanning = false;
|
|
yield break;
|
|
}
|
|
effectAnimator.SetTrigger("Shock");
|
|
gunAudio.PlayOneShot(detectAnomaly);
|
|
isShocking = true;
|
|
isScanning = false;
|
|
playerHeldBy.inShockingMinigame = true;
|
|
Transform shockableTransform = shockableScript.GetShockableTransform();
|
|
playerHeldBy.shockingTarget = shockableTransform;
|
|
playerHeldBy.isCrouching = false;
|
|
playerHeldBy.playerBodyAnimator.SetBool("crouching", value: false);
|
|
playerHeldBy.turnCompass.LookAt(shockableTransform);
|
|
Vector3 zero = Vector3.zero;
|
|
zero.y = playerHeldBy.turnCompass.localEulerAngles.y;
|
|
playerHeldBy.turnCompass.localEulerAngles = zero;
|
|
yield return new WaitForSeconds(0.55f);
|
|
StartShockAudios();
|
|
isBeingUsed = true;
|
|
shockedTargetScript.ShockWithGun(playerHeldBy);
|
|
playerHeldBy.inSpecialInteractAnimation = true;
|
|
playerHeldBy.playerBodyAnimator.SetBool("HoldPatcherTool", value: true);
|
|
SwitchFlashlight(on: false);
|
|
gunAnimator.SetTrigger("Shock");
|
|
lightningObject.SetActive(value: true);
|
|
lightningVisible = true;
|
|
ShockPatcherToolServerRpc(shockableScript.GetNetworkObject());
|
|
}
|
|
|
|
private void StartShockAudios()
|
|
{
|
|
PlayRandomAudio(mainAudio, beginShockClips);
|
|
gunAudio.Play();
|
|
mainAudio.Play();
|
|
mainAudio.volume = 1f;
|
|
shockAudio.Play();
|
|
shockAudio.volume = 0f;
|
|
}
|
|
|
|
public void StopShockingAnomalyOnClient(bool failed = false)
|
|
{
|
|
if (scanGunCoroutine != null)
|
|
{
|
|
StopCoroutine(scanGunCoroutine);
|
|
scanGunCoroutine = null;
|
|
}
|
|
timeSpentShocking = 0f;
|
|
wasShockingPreviousFrame = false;
|
|
lightningVisible = false;
|
|
lightningObject.SetActive(value: false);
|
|
isBeingUsed = false;
|
|
SwitchFlashlight(on: false);
|
|
gunAnimator.SetBool("Overheating", value: false);
|
|
gunAnimator.SetBool("Shock", value: false);
|
|
if (shockedTargetScript != null)
|
|
{
|
|
shockedTargetScript.StopShockingWithGun();
|
|
}
|
|
gunOverheat = 0f;
|
|
gunAudio.Stop();
|
|
gunAudio.volume = 1f;
|
|
mainAudio.Stop();
|
|
shockAudio.Stop();
|
|
if (base.IsOwner && playerHeldBy != null && !sentStopShockingRPC)
|
|
{
|
|
HUDManager.Instance.SetTutorialArrow(0);
|
|
sentStopShockingRPC = true;
|
|
StopShockingServerRpc();
|
|
playerHeldBy.playerBodyAnimator.SetTrigger("Overheat");
|
|
Vector3 localEulerAngles = playerHeldBy.thisPlayerBody.localEulerAngles;
|
|
localEulerAngles.x = 0f;
|
|
localEulerAngles.z = 0f;
|
|
playerHeldBy.thisPlayerBody.localEulerAngles = localEulerAngles;
|
|
}
|
|
if (failed)
|
|
{
|
|
PlayRandomAudio(gunAudio, overheatClips);
|
|
overheatParticle.Play();
|
|
currentUseCooldown = 5f;
|
|
effectAnimator.SetTrigger("FailGame");
|
|
if (timeSpentShocking > 0.75f)
|
|
{
|
|
SetFinishedShockMinigameTutorial();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
currentUseCooldown = 0.25f;
|
|
effectAnimator.SetTrigger("FinishGame");
|
|
if (base.IsOwner)
|
|
{
|
|
playerHeldBy.playerBodyAnimator.SetTrigger("Overheat");
|
|
}
|
|
SetFinishedShockMinigameTutorial();
|
|
}
|
|
playerHeldBy.PlayQuickSpecialAnimation(3f);
|
|
PlayRandomAudio(mainAudio, finishShockClips);
|
|
if (base.IsOwner)
|
|
{
|
|
if (playerHeldBy != null)
|
|
{
|
|
playerHeldBy.playerBodyAnimator.SetBool("HoldPatcherTool", value: false);
|
|
StartCoroutine(stopShocking(playerHeldBy));
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Error: playerHeldBy is null for owner of zap gun when stopping shock, in client rpc");
|
|
}
|
|
return;
|
|
}
|
|
isShocking = false;
|
|
if (playerHeldBy != null)
|
|
{
|
|
playerHeldBy.inSpecialInteractAnimation = false;
|
|
playerHeldBy.inShockingMinigame = false;
|
|
}
|
|
}
|
|
|
|
private void SetFinishedShockMinigameTutorial()
|
|
{
|
|
if (HUDManager.Instance.setTutorialArrow)
|
|
{
|
|
finishedShockMinigame++;
|
|
if (finishedShockMinigame >= 2)
|
|
{
|
|
HUDManager.Instance.setTutorialArrow = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
private IEnumerator stopShocking(PlayerControllerB playerController)
|
|
{
|
|
yield return new WaitForSeconds(0.4f);
|
|
isShocking = false;
|
|
playerController.inSpecialInteractAnimation = false;
|
|
playerController.inShockingMinigame = false;
|
|
}
|
|
|
|
[ServerRpc(RequireOwnership = false)]
|
|
public void ShockPatcherToolServerRpc(NetworkObjectReference netObject)
|
|
{
|
|
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(2303694898u, serverRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in netObject, default(FastBufferWriter.ForNetworkSerializable));
|
|
__endSendServerRpc(ref bufferWriter, 2303694898u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ShockPatcherToolClientRpc(netObject);
|
|
Debug.Log("Patcher tool server rpc received");
|
|
}
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void ShockPatcherToolClientRpc(NetworkObjectReference netObject)
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(4275427213u, clientRpcParams, RpcDelivery.Reliable);
|
|
bufferWriter.WriteValueSafe(in netObject, default(FastBufferWriter.ForNetworkSerializable));
|
|
__endSendClientRpc(ref bufferWriter, 4275427213u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client || (!networkManager.IsClient && !networkManager.IsHost))
|
|
{
|
|
return;
|
|
}
|
|
Debug.Log("Shock patcher tool client rpc received");
|
|
if (base.IsOwner || previousPlayerHeldBy == GameNetworkManager.Instance.localPlayerController)
|
|
{
|
|
return;
|
|
}
|
|
Debug.Log("Running shock patcher tool function");
|
|
timesUsed++;
|
|
gunRandom = new System.Random(playerHeldBy.playersManager.randomMapSeed + timesUsed);
|
|
if (scanGunCoroutine != null)
|
|
{
|
|
StopCoroutine(scanGunCoroutine);
|
|
}
|
|
if (netObject.TryGet(out var networkObject))
|
|
{
|
|
isShocking = true;
|
|
isScanning = false;
|
|
shockedTargetScript = networkObject.gameObject.GetComponentInChildren<IShockableWithGun>();
|
|
if (shockedTargetScript != null)
|
|
{
|
|
shockedTargetScript.ShockWithGun(playerHeldBy);
|
|
StartShockAudios();
|
|
lightningObject.SetActive(value: true);
|
|
SwitchFlashlight(on: false);
|
|
gunAnimator.SetTrigger("UseGun");
|
|
effectAnimator.SetTrigger("Shock");
|
|
lightningVisible = true;
|
|
playerHeldBy.inShockingMinigame = true;
|
|
playerHeldBy.inSpecialInteractAnimation = true;
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Zap gun: Unable to get IShockableWithGun interface from networkobject on client rpc!");
|
|
}
|
|
}
|
|
}
|
|
|
|
[ServerRpc(RequireOwnership = false)]
|
|
public void StopShockingServerRpc()
|
|
{
|
|
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(3351579778u, serverRpcParams, RpcDelivery.Reliable);
|
|
__endSendServerRpc(ref bufferWriter, 3351579778u, serverRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
StopShockingClientRpc();
|
|
}
|
|
}
|
|
}
|
|
|
|
[ClientRpc]
|
|
public void StopShockingClientRpc()
|
|
{
|
|
NetworkManager networkManager = base.NetworkManager;
|
|
if ((object)networkManager == null || !networkManager.IsListening)
|
|
{
|
|
return;
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client && (networkManager.IsServer || networkManager.IsHost))
|
|
{
|
|
ClientRpcParams clientRpcParams = default(ClientRpcParams);
|
|
FastBufferWriter bufferWriter = __beginSendClientRpc(75402723u, clientRpcParams, RpcDelivery.Reliable);
|
|
__endSendClientRpc(ref bufferWriter, 75402723u, clientRpcParams, RpcDelivery.Reliable);
|
|
}
|
|
if (__rpc_exec_stage != __RpcExecStage.Client || (!networkManager.IsClient && !networkManager.IsHost))
|
|
{
|
|
return;
|
|
}
|
|
Debug.Log("Running client rpc stopping shock");
|
|
if (!(GameNetworkManager.Instance.localPlayerController == null) && !(NetworkManager.Singleton == null))
|
|
{
|
|
if (base.IsOwner || previousPlayerHeldBy == GameNetworkManager.Instance.localPlayerController)
|
|
{
|
|
Debug.Log($"{base.IsOwner} ; {previousPlayerHeldBy}");
|
|
}
|
|
StopShockingAnomalyOnClient();
|
|
}
|
|
}
|
|
|
|
public override void UseUpBatteries()
|
|
{
|
|
base.UseUpBatteries();
|
|
SwitchFlashlight(on: false);
|
|
gunAudio.PlayOneShot(outOfBatteriesClip, 1f);
|
|
}
|
|
|
|
public override void PocketItem()
|
|
{
|
|
isBeingUsed = false;
|
|
if (playerHeldBy != null)
|
|
{
|
|
DisablePatcherGun();
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Could not find what player was holding this item");
|
|
}
|
|
base.PocketItem();
|
|
}
|
|
|
|
public override void DiscardItem()
|
|
{
|
|
DisablePatcherGun();
|
|
base.DiscardItem();
|
|
}
|
|
|
|
private void DisablePatcherGun()
|
|
{
|
|
SwitchFlashlight(on: false);
|
|
if (scanGunCoroutine != null)
|
|
{
|
|
StopCoroutine(scanGunCoroutine);
|
|
scanGunCoroutine = null;
|
|
}
|
|
if (beginShockCoroutine != null)
|
|
{
|
|
StopCoroutine(beginShockCoroutine);
|
|
beginShockCoroutine = null;
|
|
}
|
|
if (playerHeldBy != null && isShocking)
|
|
{
|
|
StopShockingAnomalyOnClient(failed: true);
|
|
}
|
|
isBeingUsed = false;
|
|
wasShockingPreviousFrame = false;
|
|
}
|
|
|
|
public override void EquipItem()
|
|
{
|
|
base.EquipItem();
|
|
if (playerHeldBy != null)
|
|
{
|
|
previousPlayerHeldBy = playerHeldBy;
|
|
}
|
|
}
|
|
|
|
public void SwitchFlashlight(bool on)
|
|
{
|
|
flashlightBulb.enabled = on;
|
|
flashlightBulbGlow.enabled = on;
|
|
}
|
|
|
|
private float RandomFloatInRange(System.Random rand, float min, float max)
|
|
{
|
|
return (float)(rand.NextDouble() * (double)(max - min) + (double)min);
|
|
}
|
|
|
|
protected override void __initializeVariables()
|
|
{
|
|
base.__initializeVariables();
|
|
}
|
|
|
|
[RuntimeInitializeOnLoadMethod]
|
|
internal static void InitializeRPCS_PatcherTool()
|
|
{
|
|
NetworkManager.__rpc_func_table.Add(2303694898u, __rpc_handler_2303694898);
|
|
NetworkManager.__rpc_func_table.Add(4275427213u, __rpc_handler_4275427213);
|
|
NetworkManager.__rpc_func_table.Add(3351579778u, __rpc_handler_3351579778);
|
|
NetworkManager.__rpc_func_table.Add(75402723u, __rpc_handler_75402723);
|
|
}
|
|
|
|
private static void __rpc_handler_2303694898(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((PatcherTool)target).ShockPatcherToolServerRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_4275427213(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
reader.ReadValueSafe(out NetworkObjectReference value, default(FastBufferWriter.ForNetworkSerializable));
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((PatcherTool)target).ShockPatcherToolClientRpc(value);
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_3351579778(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
target.__rpc_exec_stage = __RpcExecStage.Server;
|
|
((PatcherTool)target).StopShockingServerRpc();
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
private static void __rpc_handler_75402723(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
|
|
{
|
|
NetworkManager networkManager = target.NetworkManager;
|
|
if ((object)networkManager != null && networkManager.IsListening)
|
|
{
|
|
target.__rpc_exec_stage = __RpcExecStage.Client;
|
|
((PatcherTool)target).StopShockingClientRpc();
|
|
target.__rpc_exec_stage = __RpcExecStage.None;
|
|
}
|
|
}
|
|
|
|
protected internal override string __getTypeName()
|
|
{
|
|
return "PatcherTool";
|
|
}
|
|
}
|