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

315 lines
8.0 KiB
C#

using System;
using ECM2;
using Obvious.Soap;
using SoapCustomVariable;
using UFS3;
using UnityEngine;
public class PlayerFishingGearController : MonoBehaviour
{
public ScriptableEventFishingSetData OnFishingSetNotArmed;
[SerializeField]
private ItemDataVariable currentRod;
[SerializeField]
private ScriptableEventItemData onUsePlacementItem;
[SerializeField]
private Transform rodRoot;
[SerializeField]
private FishingSetController equipedFishingSet;
[SerializeField]
private ScriptableEventFishingSetData onFishingSetEquip;
[SerializeField]
private HoldAction cutLineAction;
public ScriptableListGameObject distanceSourceObjects;
public ScriptableEventFishData OnFishCatch;
public ScriptableListFishingSetData FishingSetsList;
public IntVariable spinningLureState;
public IntVariable floatLureState;
public PlayerProfile PlayerProfile;
public FSMVariable PlayerState;
public BoolVariable IsEquipped;
public BoolVariable isQButtonPressed;
public FloatVariable LineUnwinded;
public FloatVariable LineTension;
public FloatVariable AttachmentDistance;
public FloatVariable DragSetting;
public FloatVariable MaxGearStrength;
public FloatVariable RodDamage;
public FloatVariable ReelDamage;
public FloatVariable LineDamage;
public FloatVariable RodTensionScale;
public FloatVariable ReelTensionScale;
public FloatVariable LineTensionScale;
public FloatVariable groundLength;
public Vector3Variable AttachmentPosition;
public GameObjectVariable bobberObject;
public ScriptableEventInt OnSlotItemButtonPressed;
public ScriptableEventNoParam onGearDamaged;
public ScriptableEventNoParam onRodInDamage;
public ScriptableEventNoParam onReelInDamage;
public ScriptableEventNoParam onLineInDamage;
private Character _character;
public FishingSetController EquipedFishingSet => equipedFishingSet;
public event Action<FishingSetController> OnFishingSetEquiped;
public event Action OnFishingSetUnequip;
public event Action OnLinePulled;
public event Action OnGearDestroyed;
private void Awake()
{
_character = GetComponent<Character>();
cutLineAction.OnComplete += CutLineActionOnOnComplete;
}
private void CutLineActionOnOnComplete()
{
EquipedFishingSet.CutLine();
cutLineAction.ResetHold();
}
private void OnEnable()
{
onFishingSetEquip.OnRaised += OnFishingSetEquip_OnRaised;
onUsePlacementItem.OnRaised += OnPlaceItem;
OnSlotItemButtonPressed.OnRaised += OnSlotItemButtonPressedOnOnRaised;
PlayerState.OnValueChanged += PlayerStateOnOnValueChanged;
}
private void OnDisable()
{
onFishingSetEquip.OnRaised -= OnFishingSetEquip_OnRaised;
onUsePlacementItem.OnRaised -= OnPlaceItem;
OnSlotItemButtonPressed.OnRaised -= OnSlotItemButtonPressedOnOnRaised;
PlayerState.OnValueChanged -= PlayerStateOnOnValueChanged;
}
private void PlayerStateOnOnValueChanged(State obj)
{
if (obj == State.vehicle)
{
Unequip();
}
}
private void OnSlotItemButtonPressedOnOnRaised(int slotID)
{
State value = PlayerState.Value;
if ((uint)value <= 1u || value == State.vehicleFishing)
{
int index = slotID - 1;
if (FishingSetsList.Count < slotID && FishingSetsList[index] == null)
{
Debug.LogError("There is no fishing set in this slot");
return;
}
if (FishingSetsList[index].IsSetArmed())
{
onFishingSetEquip.Raise(FishingSetsList[index]);
return;
}
Debug.Log("Fishing Set is not completed");
OnFishingSetNotArmed.Raise(FishingSetsList[index]);
}
}
private void RemoveItemsToEQ()
{
FishingSetData fishingSetData = equipedFishingSet.FishingSetData;
PlayerProfile.RemoveFishingSet(fishingSetData);
}
private void Unequip()
{
if (IsEquipped.Value)
{
IsEquipped.Value = false;
groundLength.Value = 0.5f;
distanceSourceObjects.Remove(equipedFishingSet.AttachedLure.gameObject);
UnityEngine.Object.Destroy(equipedFishingSet.AttachedLure.gameObject);
UnityEngine.Object.Destroy(equipedFishingSet.gameObject);
this.OnFishingSetUnequip?.Invoke();
}
}
private bool CheckIsAttachmentCollide()
{
return false;
}
private void OnFishingSetEquip_OnRaised(FishingSetData fishingSetData)
{
if (!_character.IsGrounded() || base.transform.position.y < -0.9f)
{
return;
}
if (equipedFishingSet != null)
{
Unequip();
return;
}
IsEquipped.Value = true;
FishingSetController fishingSetController = InventorManager.CreateFishingSet(rodRoot);
fishingSetController.Initialize(fishingSetData);
if ((bool)fishingSetController.attachedBobber)
{
bobberObject.Value = fishingSetController.attachedBobber.gameObject;
}
ReelDamage.Value = fishingSetData.Reel.Durabilty;
RodDamage.Value = fishingSetData.Rod.Durabilty;
LineDamage.Value = fishingSetData.Line.Durabilty;
equipedFishingSet = fishingSetController;
distanceSourceObjects.Add(equipedFishingSet.AttachedLure.gameObject);
fishingSetController.lureCastEnded = (Action)Delegate.Combine(fishingSetController.lureCastEnded, (Action)delegate
{
PlayerState.Value = State.fishing;
});
fishingSetController.OnTensionChanged += FishingSetOnOnTensionChanged;
fishingSetController.OnLinePulled += delegate
{
this.OnLinePulled?.Invoke();
};
fishingSetController.OnDragSettingChanged += delegate(float x)
{
DragSetting.Value = x;
};
fishingSetController.OnLineLengthChanged += delegate(float x)
{
LineUnwinded.Value = x;
};
fishingSetController.OnFishCatch += delegate(FishData x)
{
OnFishCatch.Raise(x);
};
fishingSetController.OnReelDamage += delegate(float x)
{
onReelInDamage.Raise();
ReelDamage.Value = x;
};
fishingSetController.OnRodDamage += delegate(float x)
{
onRodInDamage.Raise();
RodDamage.Value = x;
};
fishingSetController.OnLineDamage += delegate(float x)
{
onLineInDamage.Raise();
LineDamage.Value = x;
};
fishingSetController.OnGearDestroyed += delegate
{
Unequip();
RemoveItemsToEQ();
this.OnGearDestroyed?.Invoke();
onGearDamaged.Raise();
PlayerProfile.SaveData();
};
fishingSetController.ApplyVariables();
this.OnFishingSetEquiped?.Invoke(fishingSetController);
float[] obj = new float[3]
{
fishingSetData.Rod.strength,
fishingSetData.Reel.MaxDrag,
fishingSetData.Line.Strength
};
float num = float.PositiveInfinity;
float[] array = obj;
foreach (float num3 in array)
{
if (num > num3)
{
num = num3;
}
}
MaxGearStrength.Value = num;
}
private void FishingSetOnOnTensionChanged(float tensionValue)
{
LineTension.Value = tensionValue;
if (!(equipedFishingSet == null) && !(equipedFishingSet.FishingSetData.Rod == null))
{
float strength = equipedFishingSet.FishingSetData.Rod.strength;
float maxDrag = equipedFishingSet.FishingSetData.Reel.MaxDrag;
float strength2 = equipedFishingSet.FishingSetData.Line.Strength;
RodTensionScale.Value = Mathf.Clamp01(tensionValue / strength);
ReelTensionScale.Value = Mathf.Clamp01(tensionValue / maxDrag);
LineTensionScale.Value = Mathf.Clamp01(tensionValue / strength2);
}
}
private void Update()
{
if (!(equipedFishingSet == null))
{
float value = Vector3.Distance(equipedFishingSet.AttachedRod.RodTipBone.position, equipedFishingSet.AttachedLure.transform.position);
AttachmentDistance.Value = value;
FishingMethodType setType = equipedFishingSet.FishingSetData.SetType;
Lure attachedLure = equipedFishingSet.AttachedLure;
switch (setType)
{
case FishingMethodType.Spinning:
spinningLureState.Value = ((!attachedLure.isInWater) ? (-1) : 0);
break;
case FishingMethodType.Float:
floatLureState.Value = ((!attachedLure.isInWater) ? (-1) : 0);
break;
default:
throw new ArgumentOutOfRangeException();
}
State value2 = PlayerState.Value;
if ((value2 == State.fishing || value2 == State.fight) && isQButtonPressed.Value)
{
cutLineAction.Hold();
}
}
}
private void OnPlaceItem(BaseItemData obj)
{
GameObject obj2 = UnityEngine.Object.Instantiate(obj.GetPrefab, base.transform);
obj2.GetComponent<TentController>().ItemData = obj;
obj2.transform.localPosition = Vector3.forward * 5f;
obj2.transform.localRotation = Quaternion.identity;
}
}