using GameNetcodeStuff; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; [RequireComponent(typeof(InteractTrigger))] public class DoorLock : NetworkBehaviour { private InteractTrigger doorTrigger; public float maxTimeLeft = 60f; public float lockPickTimeLeft = 60f; public bool isLocked; public bool isPickingLock; [Space(5f)] public DoorLock twinDoor; public Transform lockPickerPosition; public Transform lockPickerPosition2; private float enemyDoorMeter; private bool isDoorOpened; private NavMeshObstacle navMeshObstacle; public AudioClip pickingLockSFX; public AudioClip unlockSFX; public AudioSource doorLockSFX; private bool displayedLockTip; private bool localPlayerPickingLock; private int playersPickingDoor; private float playerPickingLockProgress; public void Awake() { doorTrigger = base.gameObject.GetComponent(); lockPickTimeLeft = maxTimeLeft; navMeshObstacle = GetComponent(); } public void OnHoldInteract() { if (isLocked && !displayedLockTip && HUDManager.Instance.holdFillAmount / doorTrigger.timeToHold > 0.3f) { displayedLockTip = true; HUDManager.Instance.DisplayTip("TIP:", "To get through locked doors efficiently, order a lock-picker from the ship terminal.", isWarning: false, useSave: true, "LCTip_Autopicker"); } } public void LockDoor(float timeToLockPick = 30f) { doorTrigger.interactable = false; doorTrigger.timeToHold = timeToLockPick; doorTrigger.hoverTip = "Locked (pickable)"; doorTrigger.holdTip = "Picking lock"; isLocked = true; navMeshObstacle.carving = true; navMeshObstacle.carveOnlyStationary = true; if (twinDoor != null) { twinDoor.doorTrigger.interactable = false; twinDoor.doorTrigger.timeToHold = 35f; twinDoor.doorTrigger.hoverTip = "Locked (pickable)"; twinDoor.doorTrigger.holdTip = "Picking lock"; twinDoor.isLocked = true; } } public void UnlockDoor() { doorLockSFX.Stop(); doorLockSFX.PlayOneShot(unlockSFX); navMeshObstacle.carving = false; if (isLocked) { doorTrigger.interactable = true; doorTrigger.hoverTip = "Use door : [LMB]"; doorTrigger.holdTip = ""; isPickingLock = false; isLocked = false; doorTrigger.timeToHoldSpeedMultiplier = 1f; navMeshObstacle.carving = false; Debug.Log("Unlocking door"); doorTrigger.timeToHold = 0.3f; } } public void UnlockDoorSyncWithServer() { if (isLocked) { UnlockDoor(); UnlockDoorServerRpc(); } } [ServerRpc(RequireOwnership = false)] public void UnlockDoorServerRpc() { 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(184554516u, serverRpcParams, RpcDelivery.Reliable); __endSendServerRpc(ref bufferWriter, 184554516u, serverRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost)) { UnlockDoorClientRpc(); } } } [ClientRpc] public void UnlockDoorClientRpc() { 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(1778576778u, clientRpcParams, RpcDelivery.Reliable); __endSendClientRpc(ref bufferWriter, 1778576778u, clientRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost)) { UnlockDoor(); } } } private void Update() { if (isLocked) { if (GameNetworkManager.Instance == null || GameNetworkManager.Instance.localPlayerController == null) { return; } if (GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer != null && GameNetworkManager.Instance.localPlayerController.currentlyHeldObjectServer.itemProperties.itemId == 14) { if (StartOfRound.Instance.localPlayerUsingController) { doorTrigger.disabledHoverTip = "Use key: [R-trigger]"; } else { doorTrigger.disabledHoverTip = "Use key: [ LMB ]"; } } else { doorTrigger.disabledHoverTip = "Locked"; } if (playersPickingDoor > 0) { playerPickingLockProgress = Mathf.Clamp(playerPickingLockProgress + (float)playersPickingDoor * 0.85f * Time.deltaTime, 1f, 3.5f); } doorTrigger.timeToHoldSpeedMultiplier = Mathf.Clamp((float)playersPickingDoor * 0.85f, 1f, 3.5f); } else { navMeshObstacle.carving = false; } if (isLocked && isPickingLock) { lockPickTimeLeft -= Time.deltaTime; doorTrigger.disabledHoverTip = $"Picking lock: {(int)lockPickTimeLeft} sec."; if (base.IsServer && lockPickTimeLeft < 0f) { UnlockDoor(); UnlockDoorServerRpc(); } } } private void OnTriggerStay(Collider other) { if (NetworkManager.Singleton == null || !base.IsServer || isLocked || isDoorOpened || !other.CompareTag("Enemy")) { return; } EnemyAICollisionDetect component = other.GetComponent(); if (!(component == null)) { enemyDoorMeter += Time.deltaTime * component.mainScript.openDoorSpeedMultiplier; if (enemyDoorMeter > 1f) { enemyDoorMeter = 0f; base.gameObject.GetComponent().TriggerAnimationNonPlayer(component.mainScript.useSecondaryAudiosOnAnimatedObjects, overrideBool: true); OpenDoorAsEnemyServerRpc(); } } } public void OpenOrCloseDoor(PlayerControllerB playerWhoTriggered) { AnimatedObjectTrigger component = base.gameObject.GetComponent(); component.TriggerAnimation(playerWhoTriggered); isDoorOpened = component.boolValue; navMeshObstacle.enabled = !component.boolValue; } public void SetDoorAsOpen(bool isOpen) { isDoorOpened = isOpen; navMeshObstacle.enabled = !isOpen; } public void OpenDoorAsEnemy() { isDoorOpened = true; navMeshObstacle.enabled = false; } [ServerRpc(RequireOwnership = false)] public void OpenDoorAsEnemyServerRpc() { 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(2046162111u, serverRpcParams, RpcDelivery.Reliable); __endSendServerRpc(ref bufferWriter, 2046162111u, serverRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost)) { OpenDoorAsEnemyClientRpc(); } } } [ClientRpc] public void OpenDoorAsEnemyClientRpc() { 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(1188121580u, clientRpcParams, RpcDelivery.Reliable); __endSendClientRpc(ref bufferWriter, 1188121580u, clientRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost)) { OpenDoorAsEnemy(); } } } public void TryPickingLock() { if (isLocked) { HUDManager.Instance.holdFillAmount = playerPickingLockProgress; if (!localPlayerPickingLock) { localPlayerPickingLock = true; PlayerPickLockServerRpc(); } } } public void StopPickingLock() { if (localPlayerPickingLock) { localPlayerPickingLock = false; if (playersPickingDoor == 1) { playerPickingLockProgress = Mathf.Clamp(playerPickingLockProgress - 1f, 0f, 45f); } PlayerStopPickingLockServerRpc(); } } [ServerRpc(RequireOwnership = false)] public void PlayerStopPickingLockServerRpc() { 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(3458026102u, serverRpcParams, RpcDelivery.Reliable); __endSendServerRpc(ref bufferWriter, 3458026102u, serverRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost)) { PlayerStopPickingLockClientRpc(); } } } [ClientRpc] public void PlayerStopPickingLockClientRpc() { 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(3319502281u, clientRpcParams, RpcDelivery.Reliable); __endSendClientRpc(ref bufferWriter, 3319502281u, clientRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost)) { doorLockSFX.Stop(); playersPickingDoor = Mathf.Clamp(playersPickingDoor - 1, 0, 4); } } } [ServerRpc(RequireOwnership = false)] public void PlayerPickLockServerRpc() { 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(2269869251u, serverRpcParams, RpcDelivery.Reliable); __endSendServerRpc(ref bufferWriter, 2269869251u, serverRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Server && (networkManager.IsServer || networkManager.IsHost)) { PlayerPickLockClientRpc(); } } } [ClientRpc] public void PlayerPickLockClientRpc() { 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(1721192172u, clientRpcParams, RpcDelivery.Reliable); __endSendClientRpc(ref bufferWriter, 1721192172u, clientRpcParams, RpcDelivery.Reliable); } if (__rpc_exec_stage == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost)) { doorLockSFX.clip = pickingLockSFX; doorLockSFX.Play(); playersPickingDoor = Mathf.Clamp(playersPickingDoor + 1, 0, 4); } } } protected override void __initializeVariables() { base.__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_DoorLock() { NetworkManager.__rpc_func_table.Add(184554516u, __rpc_handler_184554516); NetworkManager.__rpc_func_table.Add(1778576778u, __rpc_handler_1778576778); NetworkManager.__rpc_func_table.Add(2046162111u, __rpc_handler_2046162111); NetworkManager.__rpc_func_table.Add(1188121580u, __rpc_handler_1188121580); NetworkManager.__rpc_func_table.Add(3458026102u, __rpc_handler_3458026102); NetworkManager.__rpc_func_table.Add(3319502281u, __rpc_handler_3319502281); NetworkManager.__rpc_func_table.Add(2269869251u, __rpc_handler_2269869251); NetworkManager.__rpc_func_table.Add(1721192172u, __rpc_handler_1721192172); } private static void __rpc_handler_184554516(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Server; ((DoorLock)target).UnlockDoorServerRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_1778576778(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Client; ((DoorLock)target).UnlockDoorClientRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_2046162111(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Server; ((DoorLock)target).OpenDoorAsEnemyServerRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_1188121580(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Client; ((DoorLock)target).OpenDoorAsEnemyClientRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_3458026102(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Server; ((DoorLock)target).PlayerStopPickingLockServerRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_3319502281(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Client; ((DoorLock)target).PlayerStopPickingLockClientRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_2269869251(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Server; ((DoorLock)target).PlayerPickLockServerRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } private static void __rpc_handler_1721192172(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { NetworkManager networkManager = target.NetworkManager; if ((object)networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = __RpcExecStage.Client; ((DoorLock)target).PlayerPickLockClientRpc(); target.__rpc_exec_stage = __RpcExecStage.None; } } protected internal override string __getTypeName() { return "DoorLock"; } }