using System; using System.Collections.Generic; using System.Linq; using Obi; using Photon.Pun; using Sirenix.Utilities; using UnityEngine; public class MultiplayerRodSupportEntity : MonoBehaviourPun, IPunObservable { [Flags] public enum StateBits { signalizerInstalled_0 = 1, signalizerInstalled_1 = 2, signalizerInstalled_2 = 4, signalizerRodDropped_0 = 8, signalizerRodDropped_1 = 0x10, signalizerRodDropped_2 = 0x20, signalizerAlarm_0 = 0x40, signalizerAlarm_1 = 0x80, signalizerAlarm_2 = 0x100 } [SerializeField] private List supportVisuals; [SerializeField] private Collider collider; private RodSupport rodSupport; private int enableTimer = 60; private BiteSignalizer[] installedSignalizers_local = new BiteSignalizer[3]; private BiteSignalizer[] installedSignalizers_remote = new BiteSignalizer[3]; private GameObject[] handlerRod_remote; private GameObject[] handlerRodRenderer_remote; private StateBits stateBits; private byte supportType; public RodSupport RodSupport => rodSupport; public void Init(RodSupport rodSupport) { this.rodSupport = rodSupport; if (rodSupport.name.Contains("RodSupportType1")) { supportType = 0; } else if (rodSupport.name.Contains("RodSupportType3")) { supportType = 1; } } private void Start() { supportVisuals.ForEach(delegate(GameObject element) { element.SetActive(value: false); }); collider.gameObject.SetActive(value: false); SetNameAndParent(); CheckLocalSignalizers(); } private void Update() { if (base.photonView.IsMine) { UpdateLocal(); } else { UpdateRemote(); } } private void SetNameAndParent() { base.name = "MultiplayerEquipment_Actor_" + base.photonView.ControllerActorNr; } private void UpdateLocal() { if (!(rodSupport == null)) { base.transform.SetPositionAndRotation(rodSupport.transform.position, rodSupport.transform.rotation); bool value = false; bool value2 = false; bool value3 = false; bool value4 = false; bool value5 = false; bool value6 = false; if (installedSignalizers_local[0] != null) { value = installedSignalizers_local[0].isRodDroped; value4 = installedSignalizers_local[0].isSignalEmitted; } if (installedSignalizers_local[1] != null) { value2 = installedSignalizers_local[1].isRodDroped; value5 = installedSignalizers_local[1].isSignalEmitted; } if (installedSignalizers_local[2] != null) { value3 = installedSignalizers_local[2].isRodDroped; value6 = installedSignalizers_local[2].isSignalEmitted; } PackStateBits(null, null, null, value, value2, value3, value4, value5, value6); } } private void UpdateRemote() { if (enableTimer > 0) { enableTimer--; return; } UnpackStateBits(out var signalizerInstalled_, out var signalizerInstalled_2, out var signalizerInstalled_3, out var signalizerRodDropped_, out var signalizerRodDropped_2, out var signalizerRodDropped_3, out var signalizerAlarm_, out var signalizerAlarm_2, out var signalizerAlarm_3); if (!supportVisuals[supportType].activeSelf) { supportVisuals.ForEach(delegate(GameObject element) { element.SetActive(value: false); }); GameObject gameObject = supportVisuals[supportType]; StripForMultiplayer(gameObject); gameObject.SetActive(value: true); collider.gameObject.SetActive(value: true); } if (!supportVisuals[supportType].activeSelf || handlerRod_remote == null) { return; } for (int num = 0; num < 3; num++) { int num2 = num switch { 1 => signalizerInstalled_2 ? 1 : 0, 0 => signalizerInstalled_ ? 1 : 0, _ => signalizerInstalled_3 ? 1 : 0, }; bool isRodDroped = num switch { 1 => signalizerRodDropped_2, 0 => signalizerRodDropped_, _ => signalizerRodDropped_3, }; bool flag = num switch { 1 => signalizerAlarm_2, 0 => signalizerAlarm_, _ => signalizerAlarm_3, }; if (num2 != 0 && installedSignalizers_remote[num] == null && handlerRod_remote.Length > num) { GameManager.GameAccesories gameAccesories = GameManager.Instance.gameAccesories.FirstOrDefault((GameManager.GameAccesories element) => element.type == GameManager.GameAccesories.Type.Signalizers); if (gameAccesories != null) { installedSignalizers_remote[num] = UnityEngine.Object.Instantiate(gameAccesories.GetModelPrefab(), handlerRod_remote[num].transform, worldPositionStays: true).GetComponent(); installedSignalizers_remote[num].transform.localPosition = Vector3.zero; installedSignalizers_remote[num].transform.localEulerAngles = Vector3.zero; handlerRodRenderer_remote[num].SetActive(value: false); } } if (installedSignalizers_remote[num] != null) { installedSignalizers_remote[num].isRodDroped = isRodDroped; if (flag) { installedSignalizers_remote[num].PlaySignal(); } } } } private void StripForMultiplayer(GameObject gameObject) { if (gameObject == null) { return; } RodSupport componentInChildren = gameObject.GetComponentInChildren(); if ((bool)componentInChildren) { handlerRod_remote = componentInChildren.handlerRod; handlerRodRenderer_remote = componentInChildren.handlerRodRenderer; } RodSupport[] componentsInChildren = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren.Length; i++) { componentsInChildren[i].getRodPointer.ForEach(delegate(GameObject element) { UnityEngine.Object.Destroy(element); }); } componentsInChildren = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren[i]); } RodSupportCheckGround[] componentsInChildren2 = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren2.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren2[i]); } ObiRigidbody[] componentsInChildren3 = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren3.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren3[i]); } Rigidbody[] componentsInChildren4 = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren4.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren4[i]); } Collider[] componentsInChildren5 = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren5.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren5[i]); } Outline[] componentsInChildren6 = gameObject.GetComponentsInChildren(includeInactive: true); for (int i = 0; i < componentsInChildren6.Length; i++) { UnityEngine.Object.Destroy(componentsInChildren6[i]); } } private void PackStateBits(bool? signalizerInstalled_0 = null, bool? signalizerInstalled_1 = null, bool? signalizerInstalled_2 = null, bool? signalizerRodDropped_0 = null, bool? signalizerRodDropped_1 = null, bool? signalizerRodDropped_2 = null, bool? signalizerAlarm_0 = null, bool? signalizerAlarm_1 = null, bool? signalizerAlarm_2 = null) { UpdateBit(signalizerInstalled_0, StateBits.signalizerInstalled_0); UpdateBit(signalizerInstalled_1, StateBits.signalizerInstalled_1); UpdateBit(signalizerInstalled_2, StateBits.signalizerInstalled_2); UpdateBit(signalizerRodDropped_0, StateBits.signalizerRodDropped_0); UpdateBit(signalizerRodDropped_1, StateBits.signalizerRodDropped_1); UpdateBit(signalizerRodDropped_2, StateBits.signalizerRodDropped_2); UpdateBit(signalizerAlarm_0, StateBits.signalizerAlarm_0); UpdateBit(signalizerAlarm_1, StateBits.signalizerAlarm_1); UpdateBit(signalizerAlarm_2, StateBits.signalizerAlarm_2); void UpdateBit(bool? value, StateBits bit) { if (value.HasValue) { if (value.Value) { stateBits |= bit; } else { stateBits &= ~bit; } } } } private void UnpackStateBits(out bool signalizerInstalled_0, out bool signalizerInstalled_1, out bool signalizerInstalled_2, out bool signalizerRodDropped_0, out bool signalizerRodDropped_1, out bool signalizerRodDropped_2, out bool signalizerAlarm_0, out bool signalizerAlarm_1, out bool signalizerAlarm_2) { signalizerInstalled_0 = (stateBits & StateBits.signalizerInstalled_0) != 0; signalizerInstalled_1 = (stateBits & StateBits.signalizerInstalled_1) != 0; signalizerInstalled_2 = (stateBits & StateBits.signalizerInstalled_2) != 0; signalizerRodDropped_0 = (stateBits & StateBits.signalizerRodDropped_0) != 0; signalizerRodDropped_1 = (stateBits & StateBits.signalizerRodDropped_1) != 0; signalizerRodDropped_2 = (stateBits & StateBits.signalizerRodDropped_2) != 0; signalizerAlarm_0 = (stateBits & StateBits.signalizerAlarm_0) != 0; signalizerAlarm_1 = (stateBits & StateBits.signalizerAlarm_1) != 0; signalizerAlarm_2 = (stateBits & StateBits.signalizerAlarm_2) != 0; } private void CheckLocalSignalizers() { if (!base.photonView.IsMine) { return; } for (int i = 0; i < rodSupport.handlerRod.Length && i < installedSignalizers_local.Length; i++) { BiteSignalizer componentInChildren = rodSupport.handlerRod[i].GetComponentInChildren(); if (componentInChildren != null) { installedSignalizers_local[i] = componentInChildren; PackStateBits((i == 0) ? new bool?(true) : ((bool?)null), (i == 1) ? new bool?(true) : ((bool?)null), (i == 2) ? new bool?(true) : ((bool?)null)); } else { installedSignalizers_local[i] = null; PackStateBits((i == 0) ? new bool?(false) : ((bool?)null), (i == 1) ? new bool?(false) : ((bool?)null), (i == 2) ? new bool?(false) : ((bool?)null)); } } } public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.IsWriting) { stream.SendNext(stateBits); stream.SendNext(supportType); } else { stateBits = (StateBits)stream.ReceiveNext(); supportType = (byte)stream.ReceiveNext(); } } }