Files
UltimateFishing2020/Assets/Scripts/Assembly-CSharp/MultiplayerRodSupportEntity.cs
2026-03-04 10:03:45 +08:00

313 lines
10 KiB
C#

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<GameObject> 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<BiteSignalizer>();
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<RodSupport>();
if ((bool)componentInChildren)
{
handlerRod_remote = componentInChildren.handlerRod;
handlerRodRenderer_remote = componentInChildren.handlerRodRenderer;
}
RodSupport[] componentsInChildren = gameObject.GetComponentsInChildren<RodSupport>(includeInactive: true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
componentsInChildren[i].getRodPointer.ForEach(delegate(GameObject element)
{
UnityEngine.Object.Destroy(element);
});
}
componentsInChildren = gameObject.GetComponentsInChildren<RodSupport>(includeInactive: true);
for (int i = 0; i < componentsInChildren.Length; i++)
{
UnityEngine.Object.Destroy(componentsInChildren[i]);
}
RodSupportCheckGround[] componentsInChildren2 = gameObject.GetComponentsInChildren<RodSupportCheckGround>(includeInactive: true);
for (int i = 0; i < componentsInChildren2.Length; i++)
{
UnityEngine.Object.Destroy(componentsInChildren2[i]);
}
ObiRigidbody[] componentsInChildren3 = gameObject.GetComponentsInChildren<ObiRigidbody>(includeInactive: true);
for (int i = 0; i < componentsInChildren3.Length; i++)
{
UnityEngine.Object.Destroy(componentsInChildren3[i]);
}
Rigidbody[] componentsInChildren4 = gameObject.GetComponentsInChildren<Rigidbody>(includeInactive: true);
for (int i = 0; i < componentsInChildren4.Length; i++)
{
UnityEngine.Object.Destroy(componentsInChildren4[i]);
}
Collider[] componentsInChildren5 = gameObject.GetComponentsInChildren<Collider>(includeInactive: true);
for (int i = 0; i < componentsInChildren5.Length; i++)
{
UnityEngine.Object.Destroy(componentsInChildren5[i]);
}
Outline[] componentsInChildren6 = gameObject.GetComponentsInChildren<Outline>(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<BiteSignalizer>();
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();
}
}
}