2023-12-22 22:51:17 +00:00
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 ) ] ) ;
}
}
2023-12-23 00:30:32 +00:00
private bool GunMeetsConditionsToShock ( PlayerControllerB playerUsingGun , Vector3 targetPosition , float maxAngle = 80f )
2023-12-22 22:51:17 +00:00
{
Debug . Log ( $"Target position: {targetPosition}" ) ;
Vector3 position = playerUsingGun . gameplayCamera . transform . position ;
2023-12-23 00:30:32 +00:00
Vector3 vector = position ;
vector . y = targetPosition . y ;
if ( Vector3 . Angle ( playerUsingGun . transform . forward , targetPosition - position ) > maxAngle )
{
return false ;
}
2023-12-22 22:51:17 +00:00
if ( gunOverheat > 2f | | Vector3 . Distance ( position , targetPosition ) < 0.7f | | Vector3 . Distance ( position , targetPosition ) > 13f | | Physics . Linecast ( position , targetPosition , StartOfRound . Instance . collidersAndRoomMask , QueryTriggerInteraction . Ignore ) )
{
2023-12-23 00:30:32 +00:00
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)}" ) ;
2023-12-22 22:51:17 +00:00
return false ;
}
return true ;
}
public override void LateUpdate ( )
{
base . LateUpdate ( ) ;
if ( ! lightningVisible )
{
return ;
}
2023-12-23 00:30:32 +00:00
if ( isShocking & & shockedTargetScript ! = null & & playerHeldBy ! = null & & ! playerHeldBy . isPlayerDead & & ! insertedBattery . empty )
2023-12-22 22:51:17 +00:00
{
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" ) ;
2023-12-23 00:30:32 +00:00
for ( int i = 0 ; i < 12 ; i + + )
2023-12-22 22:51:17 +00:00
{
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 ) ;
2023-12-23 00:30:32 +00:00
int num = Physics . SphereCastNonAlloc ( ray , 5f , raycastEnemies , 5f , anomalyMask , QueryTriggerInteraction . Collide ) ;
2023-12-22 22:51:17 +00:00
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 ) ;
2023-12-23 00:30:32 +00:00
if ( GunMeetsConditionsToShock ( playerHeldBy , shockablePosition , 60f ) )
2023-12-22 22:51:17 +00:00
{
gunAudio . Stop ( ) ;
BeginShockingAnomalyOnClient ( component ) ;
yield break ;
}
}
}
}
2023-12-23 00:30:32 +00:00
yield return new WaitForSeconds ( 0.125f ) ;
2023-12-22 22:51:17 +00:00
}
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 ( ) ;
2023-12-23 00:30:32 +00:00
isBeingUsed = true ;
2023-12-22 22:51:17 +00:00
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 ) ;
2023-12-23 00:30:32 +00:00
isBeingUsed = false ;
2023-12-22 22:51:17 +00:00
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 )
{
2023-12-23 00:30:32 +00:00
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 ;
2023-12-22 22:51:17 +00:00
}
2023-12-23 00:30:32 +00:00
isShocking = false ;
if ( playerHeldBy ! = null )
2023-12-22 22:51:17 +00:00
{
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 ( 2303694898 u , serverRpcParams , RpcDelivery . Reliable ) ;
bufferWriter . WriteValueSafe ( in netObject , default ( FastBufferWriter . ForNetworkSerializable ) ) ;
__endSendServerRpc ( ref bufferWriter , 2303694898 u , 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 ( 4275427213 u , clientRpcParams , RpcDelivery . Reliable ) ;
bufferWriter . WriteValueSafe ( in netObject , default ( FastBufferWriter . ForNetworkSerializable ) ) ;
__endSendClientRpc ( ref bufferWriter , 4275427213 u , 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 ( 3351579778 u , serverRpcParams , RpcDelivery . Reliable ) ;
__endSendServerRpc ( ref bufferWriter , 3351579778 u , 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 ( 75402723 u , clientRpcParams , RpcDelivery . Reliable ) ;
__endSendClientRpc ( ref bufferWriter , 75402723 u , clientRpcParams , RpcDelivery . Reliable ) ;
}
2023-12-23 00:55:14 +00:00
if ( __rpc_exec_stage = = __RpcExecStage . Client & & ( networkManager . IsClient | | networkManager . IsHost ) )
2023-12-23 00:30:32 +00:00
{
2023-12-23 00:55:14 +00:00
Debug . Log ( "Running client rpc stopping shock" ) ;
if ( ! ( GameNetworkManager . Instance . localPlayerController = = null ) & & ! ( NetworkManager . Singleton = = null ) & & ! base . IsOwner & & ! ( previousPlayerHeldBy = = GameNetworkManager . Instance . localPlayerController ) )
2023-12-22 22:51:17 +00:00
{
Debug . Log ( $"{base.IsOwner} ; {previousPlayerHeldBy}" ) ;
2023-12-23 00:55:14 +00:00
StopShockingAnomalyOnClient ( ) ;
2023-12-22 22:51:17 +00:00
}
}
}
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 ) ;
}
2023-12-23 00:30:32 +00:00
isBeingUsed = false ;
2023-12-22 22:51:17 +00:00
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 ( 2303694898 u , __rpc_handler_2303694898 ) ;
NetworkManager . __rpc_func_table . Add ( 4275427213 u , __rpc_handler_4275427213 ) ;
NetworkManager . __rpc_func_table . Add ( 3351579778 u , __rpc_handler_3351579778 ) ;
NetworkManager . __rpc_func_table . Add ( 75402723 u , __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" ;
}
}