Files
2026-03-05 18:07:55 +08:00

248 lines
7.2 KiB
C#

using NBF;
using UnityEngine;
public class FLure : FPlayerGear
{
public enum MoveType
{
None = 0,
PowolnyWleczony = 1,
Wleczony = 2,
Opadający = 3,
PowolnyOpadający = 4
}
[HideInInspector] public Rigidbody rigidbody;
[HideInInspector] public FWaterDisplacement waterDisplacement;
public Rigidbody fishJoiner;
public bool isLookingDisable;
// private Animator animator;
[HideInInspector] public FFish currentFish;
[HideInInspector] public float percentEfficacy;
public MoveType LureMoveType = MoveType.Wleczony;
[HideInInspector] public MoveType currentMoveType;
private MoveType newMoveType;
private float delayMoveTypeTimer;
private float moveTowardsFactor;
private float moveUpperFactor;
private float waterHeightPosition;
private Transform currentWaterDrop;
private float rotateVelo;
private bool destroyDropFx;
public LureAsset lureAsset;
private void Awake()
{
lureAsset = GetComponent<LureAsset>();
}
protected override void OnStart()
{
rigidbody = GetComponent<Rigidbody>();
waterDisplacement = GetComponent<FWaterDisplacement>();
// animator = GetComponent<Animator>();
waterHeightPosition = SceneSettings.Instance.WaterObject.position.y;
if (!fishJoiner)
{
return;
}
FixedJoint component = fishJoiner.GetComponent<FixedJoint>();
if ((bool)component && !component.connectedBody)
{
if ((bool)component.transform.parent.GetComponent<Rigidbody>())
{
component.connectedBody = component.transform.parent.GetComponent<Rigidbody>();
}
else
{
component.connectedBody = transform.GetComponent<Rigidbody>();
}
}
}
protected override void OnUpdate()
{
// transform.position = Rod.lineHandler.LineConnector_1.transform.position;
RotationToVelocity();
// ShowWaterFX();
MoveTypeController();
if ((bool)currentFish)
{
waterDisplacement.isFreeze = true;
if (fishJoiner) fishJoiner.gameObject.SetActive(true);
if (!currentFish.isGetFish && transform.parent == currentFish.baitContainer)
{
transform.localPosition = Vector3.zero;
transform.localEulerAngles = lureAsset.rotationInFishJaw;
}
}
else
{
waterDisplacement.isFreeze = false;
if (fishJoiner) fishJoiner.gameObject.SetActive(false);
}
if (!Rod.takeFish && !Rod.currentFish && isLookingDisable)
{
isLookingDisable = false;
}
// if ((bool)animator && transform.position.y < 0.2f && animator.runtimeAnimatorController != null)
// {
// animator.SetFloat("Speed", rigidbody.linearVelocity.magnitude);
// }
// CheckDistance(Rod.lineHandler.LineConnector_1.transform);
}
private void RotationToVelocity()
{
if (!waterDisplacement)
{
return;
}
if (transform.position.y > 0.02f)
{
// if (transform.position.y > 0.2f && (bool)animator)
// {
// animator.SetFloat("Speed", 0f);
// }
rigidbody.freezeRotation = false;
}
else
{
if (Rod.linelenghtDiferent <= 0f)
{
return;
}
rigidbody.freezeRotation = true;
Vector3 vector = new Vector3(rigidbody.linearVelocity.x, 0f, rigidbody.linearVelocity.z);
if (vector != Vector3.zero)
{
Quaternion b = Quaternion.LookRotation(vector, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, b,
rigidbody.linearVelocity.magnitude * 5f * Time.deltaTime);
}
if (lureAsset.rotateVeloMaxAngle > 0f)
{
rotateVelo = lureAsset.rotateVeloMaxAngle *
(1f - Mathf.PingPong(
Time.time * rigidbody.linearVelocity.normalized.magnitude *
lureAsset.rotateVeloMaxSpeed, 2f));
}
else if (lureAsset.rotateVeloMaxAngle == 0f)
{
rotateVelo = Time.time * rigidbody.linearVelocity.normalized.magnitude * lureAsset.rotateVeloMaxSpeed;
}
if (rigidbody.linearVelocity.magnitude > 0f)
{
if (lureAsset.rotateVeloMaxAngle == 0f)
{
transform.Rotate(Vector3.forward, rotateVelo);
return;
}
transform.Rotate(Vector3.up, rotateVelo);
rigidbody.AddForce(transform.right * rotateVelo, ForceMode.Acceleration);
}
}
}
private void MoveTypeController()
{
if (transform.position.y > waterHeightPosition + 0.1f ||
Vector3.Distance(Rod.transform.position, transform.position) < 5f)
{
moveTowardsFactor = 0f;
moveUpperFactor = 0f;
percentEfficacy = 0f;
currentMoveType = MoveType.None;
newMoveType = MoveType.None;
return;
}
float num = (Mathf.Abs(rigidbody.linearVelocity.x) + Mathf.Abs(rigidbody.linearVelocity.z)) * 0.5f;
moveTowardsFactor = Mathf.MoveTowards(moveTowardsFactor, Mathf.Clamp01(num * 1.5f), Time.deltaTime * 0.5f);
moveUpperFactor = Mathf.MoveTowards(moveUpperFactor, Mathf.Clamp01((0f - rigidbody.linearVelocity.y) * 1.3f),
Time.deltaTime * 0.5f);
if (moveTowardsFactor > 0.01f && moveTowardsFactor < 0.5f)
{
newMoveType = MoveType.PowolnyWleczony;
}
else if (moveTowardsFactor >= 0.5f && moveTowardsFactor < 1f)
{
newMoveType = MoveType.Wleczony;
}
else if (moveTowardsFactor <= 0.1f)
{
if (moveUpperFactor > 0f && moveUpperFactor < 0.4f)
{
newMoveType = MoveType.PowolnyOpadający;
}
else if (moveUpperFactor >= 0.4f && moveUpperFactor < 0.8f)
{
newMoveType = MoveType.Opadający;
}
else
{
newMoveType = MoveType.None;
}
}
else
{
newMoveType = MoveType.None;
}
if (currentMoveType == LureMoveType)
{
percentEfficacy = Mathf.MoveTowards(percentEfficacy, 1f, Time.deltaTime * 0.4f);
}
else
{
percentEfficacy = Mathf.MoveTowards(percentEfficacy, 0f, Time.deltaTime * 0.2f);
}
if (newMoveType != currentMoveType)
{
delayMoveTypeTimer += Time.deltaTime;
if (delayMoveTypeTimer > 1f)
{
currentMoveType = newMoveType;
delayMoveTypeTimer = 0f;
}
}
}
private void OnDestroy()
{
if ((bool)currentWaterDrop)
{
Destroy(currentWaterDrop.gameObject);
}
}
}