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 OnFishingSetEquiped; public event Action OnFishingSetUnequip; public event Action OnLinePulled; public event Action OnGearDestroyed; private void Awake() { _character = GetComponent(); 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().ItemData = obj; obj2.transform.localPosition = Vector3.forward * 5f; obj2.transform.localRotation = Quaternion.identity; } }