Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/MultiplayerFishControllerSpawner.cs
2026-03-04 09:37:33 +08:00

123 lines
3.1 KiB
C#

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<FishController>(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;
}
}