313 lines
10 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|