using System; using System.Linq; using FishNet.Connection; using FishNet.Managing; using FishNet.Object; using FishNet.Object.Synchronizing; using FishNet.Serializing; using FishNet.Serializing.Generated; using FishNet.Transporting; using Obvious.Soap; using Sirenix.Utilities; using UFS3; using UnityEngine; public class MultiplayerFishingSetControler : NetworkBehaviour { private GameObject networkObjectParent; [SerializeField] private ItemDatabase itemDatabase; [SerializeField] private LineRenderer lineRenderer; [SerializeField] private float lineThickness = 0.0007f; [SerializeField] [Range(0.5f, 30f)] [Tooltip("Low value => more smoothing, High value => less delay")] private float posRotLerpSpeed = 5f; [SerializeField] private ScriptableListGameObject distanceSourceObjects; private FishingSetController fishingSetController; private MultiplayerAvatarControler multiplayerAvatarControler; private float lineLengthPrevious; private Rod spawnedRod; private Reel spawnedReel; private GameObject spawnedBobber; private Hook spawnedHook; private GameObject spawnedLure; private GameObject spawnedBait; private RodIK rodIK; public readonly SyncVar fishingMethodType = new SyncVar(); public readonly SyncVar rodID = new SyncVar(-1); public readonly SyncVar reelID = new SyncVar(-1); public readonly SyncVar lineID = new SyncVar(-1); public readonly SyncVar bobberID = new SyncVar(-1); public readonly SyncVar hookID = new SyncVar(-1); public readonly SyncVar lureID = new SyncVar(-1); public readonly SyncVar baitID = new SyncVar(-1); public readonly SyncVar bobberPosition = new SyncVar(); public readonly SyncVar bobberRotation = new SyncVar(); public readonly SyncVar baitPosition = new SyncVar(); public readonly SyncVar baitRotation = new SyncVar(); public readonly SyncVar ikWeight = new SyncVar(); public readonly SyncVar reelSpeed = new SyncVar(); private bool NetworkInitialize___EarlyMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted; private bool NetworkInitialize___LateMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted; public Transform NetworkObjectParent { get { if (networkObjectParent == null) { networkObjectParent = GameObject.Find("NetworkObjectParent"); if ((object)networkObjectParent == null) { networkObjectParent = new GameObject("NetworkObjectParent"); } } return networkObjectParent.transform; } } public Reel SpawnedReel => spawnedReel; public static event Action OnStartLocal; public override void OnStartClient() { if (base.IsOwner) { base.OnStartClient(); MultiplayerFishingSetControler.OnStartLocal?.Invoke(this); } } public override void OnStopClient() { base.OnStopClient(); CleanupRemoteEquipment(); } public void Init(FishingSetController fishingSetController) { if (base.IsOwner) { this.fishingSetController = fishingSetController; } } public void Deinit() { if (base.IsOwner) { DespawnRPC(); } } private void Update() { if (base.IsOwner) { UpdateLocal(); } else { UpdateRemote(); } } private void UpdateLocal() { if (fishingSetController == null) { return; } FishingSetData fishingSetData = fishingSetController.FishingSetData; if (!(fishingSetData == null)) { UpdateEquipmentSyncVars(fishingSetData.SetType, (fishingSetData.Rod != null) ? fishingSetData.Rod.ID : (-1), (fishingSetData.Reel != null) ? fishingSetData.Reel.ID : (-1), (fishingSetData.Line != null) ? fishingSetData.Line.ID : (-1), (fishingSetData.Bobber != null) ? fishingSetData.Bobber.ID : (-1), (fishingSetData.Hook != null) ? fishingSetData.Hook.ID : (-1), (fishingSetData.Lure != null) ? fishingSetData.Lure.ID : (-1), (fishingSetData.Bait != null) ? fishingSetData.Bait.ID : (-1)); if (fishingSetData.SetType == FishingMethodType.Spinning) { UpdateBobberAndBaitSyncVars(Vector3.zero, Quaternion.identity, fishingSetController.AttachedLure.transform.position, fishingSetController.AttachedLure.transform.rotation); } else if (fishingSetData.SetType == FishingMethodType.Float) { UpdateBobberAndBaitSyncVars(fishingSetController.attachedBobber.transform.position, fishingSetController.attachedBobber.transform.rotation, fishingSetController.AttachedHook.transform.position, fishingSetController.AttachedHook.transform.rotation); } float val = fishingSetController.AttachedLine.LineLength - lineLengthPrevious; lineLengthPrevious = fishingSetController.AttachedLine.LineLength; val = Math.Min(val, 0f); UpdateRodAndReelSyncVars(fishingSetController.Tension / fishingSetController.AttachedRod.RodPower, val); } } private void UpdateRemote() { UpdateRemoteRodPosition(); UpdateRemoteEquipment(); UpdateRemoteBaitPosition(); UpdateRemoteRodBending(); UpdateRemoteReelSpeed(); UpdateRemoteFishingLine(); } private void UpdateRemoteRodPosition() { if ((object)multiplayerAvatarControler == null) { multiplayerAvatarControler = base.Owner.Objects.FirstOrDefault((NetworkObject element) => element.GetComponent() != null)?.GetComponent(); } if (!(multiplayerAvatarControler == null)) { base.transform.SetPositionAndRotation(multiplayerAvatarControler.RodParent.transform.position, multiplayerAvatarControler.RodParent.transform.rotation); } } private void UpdateRemoteBaitPosition() { if (fishingMethodType.Value == FishingMethodType.Spinning) { spawnedLure?.transform.SetLocalPositionAndRotation(Vector3.Lerp(spawnedLure.transform.position, baitPosition.Value, Time.deltaTime * posRotLerpSpeed), Quaternion.Lerp(spawnedLure.transform.rotation, baitRotation.Value, Time.deltaTime * posRotLerpSpeed)); } else if (fishingMethodType.Value == FishingMethodType.Float) { spawnedBobber?.transform.SetPositionAndRotation(Vector3.Lerp(spawnedBobber.transform.position, bobberPosition.Value, Time.deltaTime * posRotLerpSpeed), Quaternion.Lerp(spawnedBobber.transform.rotation, bobberRotation.Value, Time.deltaTime * posRotLerpSpeed)); spawnedHook?.transform.SetPositionAndRotation(Vector3.Lerp(spawnedHook.transform.position, baitPosition.Value, Time.deltaTime * posRotLerpSpeed), Quaternion.Lerp(spawnedHook.transform.rotation, baitRotation.Value, Time.deltaTime * posRotLerpSpeed)); } } private void UpdateRemoteEquipment() { if (!(spawnedRod == null)) { return; } bool flag = false; if (rodID.Value != -1 && reelID.Value != -1 && lineID.Value != -1) { if (fishingMethodType.Value == FishingMethodType.Spinning) { if (lureID.Value != -1) { flag = true; } } else if (fishingMethodType.Value == FishingMethodType.Float && bobberID.Value != -1 && hookID.Value != -1 && baitID.Value != -1) { flag = true; } } if (!flag) { return; } RodData rodData = itemDatabase.GetItemById(rodID.Value) as RodData; ReelData reelData = itemDatabase.GetItemById(reelID.Value) as ReelData; if (rodData != null && reelData != null) { spawnedRod = UnityEngine.Object.Instantiate(rodData.GetPrefab, base.transform).GetComponent(); spawnedRod.Initialize(rodData); rodIK = spawnedRod.GetComponent(); spawnedReel = UnityEngine.Object.Instantiate(reelData.GetPrefab, base.transform).GetComponent(); spawnedReel.Initialize(reelData); spawnedRod.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); spawnedRod.AttachReel(spawnedReel.transform); if (fishingMethodType.Value == FishingMethodType.Spinning) { LureData lureData = itemDatabase.GetItemById(lureID.Value) as LureData; spawnedLure = UnityEngine.Object.Instantiate(lureData.GetPrefab, NetworkObjectParent); spawnedLure.transform.SetPositionAndRotation(baitPosition.Value, baitRotation.Value); RemoveNonMultiplayerComponents(new GameObject[1] { spawnedLure }); } else if (fishingMethodType.Value == FishingMethodType.Float) { BobberData bobberData = itemDatabase.GetItemById(bobberID.Value) as BobberData; HookData hookData = itemDatabase.GetItemById(hookID.Value) as HookData; BaitData baitData = itemDatabase.GetItemById(baitID.Value) as BaitData; spawnedBobber = UnityEngine.Object.Instantiate(bobberData.GetPrefab, NetworkObjectParent); spawnedBobber.transform.SetPositionAndRotation(bobberPosition.Value, bobberRotation.Value); spawnedHook = UnityEngine.Object.Instantiate(hookData.GetPrefab, NetworkObjectParent).GetComponent(); spawnedHook.transform.SetPositionAndRotation(baitPosition.Value, baitRotation.Value); spawnedBait = UnityEngine.Object.Instantiate(baitData.GetPrefab, NetworkObjectParent); spawnedBait.transform.SetParent(spawnedHook.baitPlace); spawnedBait.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); RemoveNonMultiplayerComponents(new GameObject[3] { spawnedBobber, spawnedHook.gameObject, spawnedBait }); } } if (spawnedLure != null) { distanceSourceObjects.Add(spawnedLure); } if (spawnedHook != null) { distanceSourceObjects.Add(spawnedHook.gameObject); } static void RemoveNonMultiplayerComponents(GameObject[] gameObjects) { if (gameObjects != null && gameObjects.Length != 0) { foreach (GameObject gameObject in gameObjects) { if (!(gameObject == null)) { gameObject.GetComponentsInChildren(includeInactive: true).ForEach(delegate(Collider element) { UnityEngine.Object.Destroy(element); }); } } } } } private void UpdateRemoteRodBending() { if (!(spawnedRod == null)) { rodIK.SetIkWeight(ikWeight.Value); if (fishingMethodType.Value == FishingMethodType.Spinning) { rodIK.SetIKTarget(spawnedLure.transform); } else if (fishingMethodType.Value == FishingMethodType.Float) { rodIK.SetIKTarget(spawnedHook.transform); } } } private void UpdateRemoteReelSpeed() { if (!(spawnedRod == null)) { spawnedReel.SpinReel(reelSpeed.Value); } } private void UpdateRemoteFishingLine() { if (!(spawnedRod == null)) { int num = spawnedRod.RodGuides.Guides.Count + ((fishingMethodType.Value == FishingMethodType.Spinning) ? 2 : 3); if (lineRenderer.positionCount != num) { lineRenderer.positionCount = num; lineRenderer.startWidth = lineThickness; lineRenderer.endWidth = lineThickness; } if (fishingMethodType.Value == FishingMethodType.Spinning) { lineRenderer.SetPosition(0, spawnedLure.transform.position); } else if (fishingMethodType.Value == FishingMethodType.Float) { lineRenderer.SetPosition(0, spawnedHook.transform.position); lineRenderer.SetPosition(1, spawnedBobber.transform.position); } for (int i = 0; i < spawnedRod.RodGuides.Guides.Count; i++) { lineRenderer.SetPosition(i + ((fishingMethodType.Value == FishingMethodType.Spinning) ? 1 : 2), spawnedRod.RodGuides.Guides[i].position); } lineRenderer.SetPosition(num - 1, spawnedReel.RopeAnchorOnRoller.position); } } private void CleanupRemoteEquipment() { if (spawnedLure != null) { distanceSourceObjects.Remove(spawnedLure); } if (spawnedHook != null) { distanceSourceObjects.Remove(spawnedHook.gameObject); } if (spawnedRod != null) { UnityEngine.Object.Destroy(spawnedRod.gameObject); spawnedRod = null; } if (spawnedReel != null) { UnityEngine.Object.Destroy(spawnedReel.gameObject); spawnedReel = null; } if (spawnedBobber != null) { UnityEngine.Object.Destroy(spawnedBobber.gameObject); spawnedBobber = null; } if (spawnedHook != null) { UnityEngine.Object.Destroy(spawnedHook.gameObject); spawnedHook = null; } if (spawnedLure != null) { UnityEngine.Object.Destroy(spawnedLure.gameObject); spawnedLure = null; } if (spawnedBait != null) { UnityEngine.Object.Destroy(spawnedBait.gameObject); spawnedBait = null; } } [ServerRpc] public void UpdateEquipmentSyncVars(FishingMethodType fishingMethodType, int rodID, int reelID, int lineID, int bobberID, int hookID, int lureID, int baitID) { RpcWriter___Server_UpdateEquipmentSyncVars_4106814919(fishingMethodType, rodID, reelID, lineID, bobberID, hookID, lureID, baitID); } [ServerRpc] public void UpdateBobberAndBaitSyncVars(Vector3 bobberPosition, Quaternion bobberRotation, Vector3 baitPosition, Quaternion baitRotation) { RpcWriter___Server_UpdateBobberAndBaitSyncVars_2669797829(bobberPosition, bobberRotation, baitPosition, baitRotation); } [ServerRpc] public void UpdateRodAndReelSyncVars(float ikWeight, float reelSpeed) { RpcWriter___Server_UpdateRodAndReelSyncVars_1138564871(ikWeight, reelSpeed); } [ServerRpc] public void DespawnRPC() { RpcWriter___Server_DespawnRPC_2166136261(); } public override void NetworkInitialize___Early() { if (!NetworkInitialize___EarlyMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted) { NetworkInitialize___EarlyMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted = true; base.NetworkInitialize___Early(); reelSpeed.InitializeEarly(this, 13u, isSyncObject: false); ikWeight.InitializeEarly(this, 12u, isSyncObject: false); baitRotation.InitializeEarly(this, 11u, isSyncObject: false); baitPosition.InitializeEarly(this, 10u, isSyncObject: false); bobberRotation.InitializeEarly(this, 9u, isSyncObject: false); bobberPosition.InitializeEarly(this, 8u, isSyncObject: false); baitID.InitializeEarly(this, 7u, isSyncObject: false); lureID.InitializeEarly(this, 6u, isSyncObject: false); hookID.InitializeEarly(this, 5u, isSyncObject: false); bobberID.InitializeEarly(this, 4u, isSyncObject: false); lineID.InitializeEarly(this, 3u, isSyncObject: false); reelID.InitializeEarly(this, 2u, isSyncObject: false); rodID.InitializeEarly(this, 1u, isSyncObject: false); fishingMethodType.InitializeEarly(this, 0u, isSyncObject: false); RegisterServerRpc(0u, RpcReader___Server_UpdateEquipmentSyncVars_4106814919); RegisterServerRpc(1u, RpcReader___Server_UpdateBobberAndBaitSyncVars_2669797829); RegisterServerRpc(2u, RpcReader___Server_UpdateRodAndReelSyncVars_1138564871); RegisterServerRpc(3u, RpcReader___Server_DespawnRPC_2166136261); } } public override void NetworkInitialize___Late() { if (!NetworkInitialize___LateMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted) { NetworkInitialize___LateMultiplayerFishingSetControlerAssembly_002DCSharp_002Edll_Excuted = true; base.NetworkInitialize___Late(); reelSpeed.InitializeLate(); ikWeight.InitializeLate(); baitRotation.InitializeLate(); baitPosition.InitializeLate(); bobberRotation.InitializeLate(); bobberPosition.InitializeLate(); baitID.InitializeLate(); lureID.InitializeLate(); hookID.InitializeLate(); bobberID.InitializeLate(); lineID.InitializeLate(); reelID.InitializeLate(); rodID.InitializeLate(); fishingMethodType.InitializeLate(); } } public override void NetworkInitializeIfDisabled() { NetworkInitialize___Early(); NetworkInitialize___Late(); } private void RpcWriter___Server_UpdateEquipmentSyncVars_4106814919(FishingMethodType fishingMethodType, int rodID, int reelID, int lineID, int bobberID, int hookID, int lureID, int baitID) { if (!base.IsClientInitialized) { NetworkManager networkManager = base.NetworkManager; networkManager.LogWarning("Cannot complete action because client is not active. This may also occur if the object is not yet initialized, has deinitialized, or if it does not contain a NetworkObject component."); return; } if (!base.IsOwner) { NetworkManager networkManager2 = base.NetworkManager; networkManager2.LogWarning("Cannot complete action because you are not the owner of this object. ."); return; } Channel channel = Channel.Reliable; PooledWriter pooledWriter = WriterPool.Retrieve(); // GeneratedWriters___Internal.GWrite___FishingMethodTypeFishNet_002ESerializing_002EGenerated(pooledWriter, fishingMethodType); pooledWriter.WriteInt32(rodID); pooledWriter.WriteInt32(reelID); pooledWriter.WriteInt32(lineID); pooledWriter.WriteInt32(bobberID); pooledWriter.WriteInt32(hookID); pooledWriter.WriteInt32(lureID); pooledWriter.WriteInt32(baitID); SendServerRpc(0u, pooledWriter, channel, DataOrderType.Default); pooledWriter.Store(); } public void RpcLogic___UpdateEquipmentSyncVars_4106814919(FishingMethodType P_0, int P_1, int P_2, int P_3, int P_4, int P_5, int P_6, int P_7) { fishingMethodType.Value = P_0; rodID.Value = P_1; reelID.Value = P_2; lineID.Value = P_3; bobberID.Value = P_4; hookID.Value = P_5; lureID.Value = P_6; baitID.Value = P_7; } private void RpcReader___Server_UpdateEquipmentSyncVars_4106814919(PooledReader PooledReader0, Channel channel, NetworkConnection conn) { // FishingMethodType fishingMethodType = GeneratedReaders___Internal.GRead___FishingMethodTypeFishNet_002ESerializing_002EGenerateds(PooledReader0); int num = PooledReader0.ReadInt32(); int num2 = PooledReader0.ReadInt32(); int num3 = PooledReader0.ReadInt32(); int num4 = PooledReader0.ReadInt32(); int num5 = PooledReader0.ReadInt32(); int num6 = PooledReader0.ReadInt32(); int num7 = PooledReader0.ReadInt32(); if (base.IsServerInitialized && OwnerMatches(conn)) { // RpcLogic___UpdateEquipmentSyncVars_4106814919(fishingMethodType, num, num2, num3, num4, num5, num6, num7); } } private void RpcWriter___Server_UpdateBobberAndBaitSyncVars_2669797829(Vector3 bobberPosition, Quaternion bobberRotation, Vector3 baitPosition, Quaternion baitRotation) { if (!base.IsClientInitialized) { NetworkManager networkManager = base.NetworkManager; networkManager.LogWarning("Cannot complete action because client is not active. This may also occur if the object is not yet initialized, has deinitialized, or if it does not contain a NetworkObject component."); return; } if (!base.IsOwner) { NetworkManager networkManager2 = base.NetworkManager; networkManager2.LogWarning("Cannot complete action because you are not the owner of this object. ."); return; } Channel channel = Channel.Reliable; PooledWriter pooledWriter = WriterPool.Retrieve(); pooledWriter.WriteVector3(bobberPosition); pooledWriter.WriteQuaternion32(bobberRotation); pooledWriter.WriteVector3(baitPosition); pooledWriter.WriteQuaternion32(baitRotation); SendServerRpc(1u, pooledWriter, channel, DataOrderType.Default); pooledWriter.Store(); } public void RpcLogic___UpdateBobberAndBaitSyncVars_2669797829(Vector3 P_0, Quaternion P_1, Vector3 P_2, Quaternion P_3) { bobberPosition.Value = P_0; bobberRotation.Value = P_1; baitPosition.Value = P_2; baitRotation.Value = P_3; } private void RpcReader___Server_UpdateBobberAndBaitSyncVars_2669797829(PooledReader PooledReader0, Channel channel, NetworkConnection conn) { Vector3 vector = PooledReader0.ReadVector3(); Quaternion quaternion = PooledReader0.ReadQuaternion32(); Vector3 vector2 = PooledReader0.ReadVector3(); Quaternion quaternion2 = PooledReader0.ReadQuaternion32(); if (base.IsServerInitialized && OwnerMatches(conn)) { RpcLogic___UpdateBobberAndBaitSyncVars_2669797829(vector, quaternion, vector2, quaternion2); } } private void RpcWriter___Server_UpdateRodAndReelSyncVars_1138564871(float ikWeight, float reelSpeed) { if (!base.IsClientInitialized) { NetworkManager networkManager = base.NetworkManager; networkManager.LogWarning("Cannot complete action because client is not active. This may also occur if the object is not yet initialized, has deinitialized, or if it does not contain a NetworkObject component."); return; } if (!base.IsOwner) { NetworkManager networkManager2 = base.NetworkManager; networkManager2.LogWarning("Cannot complete action because you are not the owner of this object. ."); return; } Channel channel = Channel.Reliable; PooledWriter pooledWriter = WriterPool.Retrieve(); pooledWriter.WriteSingle(ikWeight); pooledWriter.WriteSingle(reelSpeed); SendServerRpc(2u, pooledWriter, channel, DataOrderType.Default); pooledWriter.Store(); } public void RpcLogic___UpdateRodAndReelSyncVars_1138564871(float P_0, float P_1) { ikWeight.Value = P_0; reelSpeed.Value = P_1; } private void RpcReader___Server_UpdateRodAndReelSyncVars_1138564871(PooledReader PooledReader0, Channel channel, NetworkConnection conn) { float num = PooledReader0.ReadSingle(); float num2 = PooledReader0.ReadSingle(); if (base.IsServerInitialized && OwnerMatches(conn)) { RpcLogic___UpdateRodAndReelSyncVars_1138564871(num, num2); } } private void RpcWriter___Server_DespawnRPC_2166136261() { if (!base.IsClientInitialized) { NetworkManager networkManager = base.NetworkManager; networkManager.LogWarning("Cannot complete action because client is not active. This may also occur if the object is not yet initialized, has deinitialized, or if it does not contain a NetworkObject component."); return; } if (!base.IsOwner) { NetworkManager networkManager2 = base.NetworkManager; networkManager2.LogWarning("Cannot complete action because you are not the owner of this object. ."); return; } Channel channel = Channel.Reliable; PooledWriter pooledWriter = WriterPool.Retrieve(); SendServerRpc(3u, pooledWriter, channel, DataOrderType.Default); pooledWriter.Store(); } public void RpcLogic___DespawnRPC_2166136261() { Despawn(); } private void RpcReader___Server_DespawnRPC_2166136261(PooledReader PooledReader0, Channel channel, NetworkConnection conn) { if (base.IsServerInitialized && OwnerMatches(conn)) { RpcLogic___DespawnRPC_2166136261(); } } public virtual void Awake() { NetworkInitialize___Early(); NetworkInitialize___Late(); } }