315 lines
8.0 KiB
C#
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;
|
|
}
|
|
}
|