using Obvious.Soap; using SoapCustomVariable; using UnityEngine; public class MultiplayerFishControllerSpawner : MonoBehaviour { [SerializeField] private ScriptableEventNetworkObjectSpawn OnNetworkObjectSpawn; [SerializeField] private GameObjectVariable currentFightFishObject; [SerializeField] private ScriptableEventFishData OnFishCollect; [SerializeField] private ScriptableEventFishData OnFishThrow; [SerializeField] private FSMVariable playerState; [SerializeField] private float despawnDelayAfterThrow = 4f; private MultiplayerFishController networkedFishInFight; private void CurrentFightFishObject_OnValueChanged(GameObject fish) { if ((bool)fish) { SpawnNetworkedFishInFigh(); } else { DespawnNetworkedFishInFight(); } } private void PlayerState_OnValueChanged(State state) { if (!IsPlayerStateWithFish(state)) { DespawnNetworkedFishInFight(); } } private void MultiplayerManager_OnInSession() { SpawnNetworkedFishInFigh(); } private void MultiplayerFishController_OnStartLocal(MultiplayerFishController multiplayerFishController) { DespawnNetworkedFishInFight(); networkedFishInFight = multiplayerFishController; if (currentFightFishObject.Value != null && currentFightFishObject.Value.TryGetComponent(out var component)) { networkedFishInFight.Init(component); } else { DespawnNetworkedFishInFight(); } } private void OnFishThrow_OnRaised(FishData fishData) { DespawnNetworkedFishInFight(despawnDelayAfterThrow); } private void OnFishCollect_OnRaised(FishData fishData) { DespawnNetworkedFishInFight(); } private void OnEnable() { currentFightFishObject.OnValueChanged += CurrentFightFishObject_OnValueChanged; playerState.OnValueChanged += PlayerState_OnValueChanged; MultiplayerManager.OnInSession += MultiplayerManager_OnInSession; MultiplayerFishController.OnStartLocal += MultiplayerFishController_OnStartLocal; OnFishCollect.OnRaised += OnFishCollect_OnRaised; OnFishThrow.OnRaised += OnFishThrow_OnRaised; } private void OnDisable() { currentFightFishObject.OnValueChanged -= CurrentFightFishObject_OnValueChanged; playerState.OnValueChanged -= PlayerState_OnValueChanged; MultiplayerManager.OnInSession -= MultiplayerManager_OnInSession; MultiplayerFishController.OnStartLocal -= MultiplayerFishController_OnStartLocal; OnFishCollect.OnRaised -= OnFishCollect_OnRaised; OnFishThrow.OnRaised -= OnFishThrow_OnRaised; } private void DespawnNetworkedFishInFight(float delay = 0f) { if ((bool)networkedFishInFight) { networkedFishInFight.Deinit(delay); networkedFishInFight = null; } } private void SpawnNetworkedFishInFigh() { DespawnNetworkedFishInFight(); if (currentFightFishObject.Value != null) { OnNetworkObjectSpawn.Raise(new NetworkObjectSpawn("MultiplayerFishController", currentFightFishObject.Value.transform.position, currentFightFishObject.Value.transform.rotation)); } } private bool IsPlayerStateWithFish(State state) { if (state != State.fight && state != State.fishView && state != State.collectFish) { return state == State.throwFish; } return true; } }