using System;
using System.Collections;
using NBC;
using UnityEngine;
namespace NBF
{
public class FPlayerUseGear : MonoBehaviour
{
///
/// 可用的
///
public bool Usable { get; private set; }
public int UseGearId { get; private set; }
public FPlayer Player { get; set; }
public FRod Rod;
public FReel Reel;
public FHook Hook;
public FFloat Bobber;
public FBait Bait;
public FLure Lure;
public FWeight Weight;
public FLine Line;
public Transform GearParent { get; private set; }
private void Start()
{
Player = GetComponentInParent();
var obj = new GameObject(Player.Data.PlayerID.ToString());
GearParent = obj.transform;
GearParent.SetParent(SceneSettings.Instance.GearNode);
GearParent.localPosition = Vector3.zero;
GearParent.position = Player.transform.position;
}
public void Update()
{
if (CheckGear())
{
StartCoroutine(CreateOrHideGear());
}
}
private bool CheckGear()
{
var nowGearId = 0;
if (Player != null && Player.Data != null && Player.Data.currentGear != null)
{
nowGearId = Player.Data.currentGear.GetUnitId();
}
if (UseGearId != nowGearId)
{
UseGearId = nowGearId;
return true;
}
return false;
}
public IEnumerator CreateOrHideGear()
{
if (Player.PlayerAnimatorCtrl.ItemInHands)
{
Player.PlayerAnimatorCtrl.ItemInHands = false;
}
if (Rod != null)
{
yield return HideGear();
}
yield return new WaitForSeconds(0.1f);
if (Player.Data == null || Player.Data.currentGear == null) yield break;
var parent = GearParent;
parent.position = Player.transform.position;
var data = Player.Data.currentGear;
var rodConfig = data.rod.Config;
var cloneObj = rodConfig.Instantiate(parent, Vector3.zero, Player.MainArm.RodContainer.rotation);
if (cloneObj == null)
{
yield break;
}
Rod = cloneObj.GetComponent();
if (Rod == null)
{
Rod = cloneObj.AddComponent();
}
if (Rod)
{
Rod.transform.localPosition = Vector3.zero;
Rod.transform.rotation = Player.MainArm.RodContainer.rotation;
if (rodConfig.ring > 0)
{
var ringConfig = GameRings.Get(rodConfig.ring);
var ringObject = ringConfig.Instantiate(Rod.transform);
ringObject.SetActive(false);
Rod.SetRing(ringObject.GetComponent());
}
}
else
{
yield break;
}
if (data.line != null)
{
var linePrefab = data.line.Config.Instantiate(parent);
Line = linePrefab.GetComponent();
}
if (data.reel != null)
{
var reelPrefab = data.reel.Config.Create(parent);
Reel = reelPrefab.GetComponent();
}
if (data.bobber != null)
{
var bobberPrefab = data.bobber.Config.Create(parent);
Bobber = bobberPrefab.GetComponent();
}
if (data.hook != null)
{
var hookPrefab = data.hook.Config.Create(parent);
Hook = hookPrefab.GetComponent();
}
if (data.bait != null)
{
var baitPrefab = data.bait.Config.Create(parent);
if (baitPrefab.TryGetComponent(out var bait))
{
Bait = bait;
}
}
if (data.lure != null)
{
var baitPrefab = data.lure.Config.Create(parent);
if (baitPrefab.TryGetComponent(out var lure))
{
Lure = lure;
}
}
if (data.weight != null)
{
var weightPrefab = data.weight.Config.Instantiate(parent);
Weight = weightPrefab.GetComponent();
}
Debug.LogError("CreateOrHideGear");
yield return 1;
Rod.Initialize(Player, data.rod);
Rod.CreateFishingHandler();
if (Line)
{
Line.Initialize(Player, data.line);
if ((bool)Rod.lineHandler.obiRopeSegment_1)
{
Rod.lineHandler.obiRopeSegment_1.GetComponent().material =
Line.lineMat;
}
if ((bool)Rod.lineHandler.obiRopeSegment_2)
{
Rod.lineHandler.obiRopeSegment_2.GetComponent().material =
Line.lineMat;
}
if ((bool)Rod.lineHandler.obiRopeSegment_3)
{
Rod.lineHandler.obiRopeSegment_3.GetComponent().material =
Line.lineMat;
}
}
if (Reel)
{
// Reel.maxReelStrength = data.reel.Config.strength;
// Reel.reelingSpeed = 0.5f; //slotsEquip.reel.currentSpeed;
Reel.reelingDrag = 0.699f; //slotsEquip.reel.currentDrag;
Reel.transform.SetParent(Rod.rodAsset.ReelConnector);
Reel.transform.localPosition = Vector3.zero;
Reel.transform.localEulerAngles = Vector3.zero;
// Reel.reelAsset.szpulaObject.GetComponent().material = Line.szpulaMat;
Reel.Initialize(Player, data.reel);
}
if (Bobber)
{
Bobber.floatDisplacement = data.bobber.Config.displacement;
// if ((double)slotsEquip.ffloat.lastSetGroundValue > 0.2)
// {
// Bobber.newDeepth = slotsEquip.ffloat.lastSetGroundValue;
// }
Bobber.newDeepth = 0.5f;
Bobber.Initialize(Player, data.bobber);
Bobber.transform.position = Rod.lineHandler.LineConnector_1.transform.position;
Bobber.gameObject.GetComponent().connectedBody =
Rod.lineHandler.LineConnector_1.GetComponent();
}
if (Hook)
{
Hook.Initialize(Player, data.hook);
Hook.transform.position = Rod.lineHandler.LineConnector_2.transform.position;
Hook.transform.rotation = Rod.lineHandler.LineConnector_2.transform.rotation; // 确保旋转也同步
var target = Rod.lineHandler.LineConnector_2.GetComponent();
var joint = Hook.gameObject.GetComponent();
// // 关键设置:关闭自动锚点计算,手动设置锚点
// joint.autoConfigureConnectedAnchor = false;
// joint.anchor = Vector3.zero; // 以 Hook 自身中心为锚点
// joint.connectedAnchor = Vector3.zero; // 以目标物体的中心为锚点
joint.connectedBody = target;
// // 强制物理引擎立即更新变换(避免1帧延迟)
// Physics.SyncTransforms();
// joint.autoConfigureConnectedAnchor = false;
// joint.anchor = Vector3.zero;
// joint.connectedAnchor = Vector3.zero;
Rod.LureHookWaterDisplacement = Hook.GetComponent();
}
if (Bait)
{
Bait.Initialize(Player, data.bait);
Bait.transform.position = Hook.hookAsset.baitConnector.position;
Bait.transform.SetParent(Hook.hookAsset.baitConnector);
}
if (Lure)
{
Lure.Initialize(Player, data.bait);
Lure.transform.position = Rod.lineHandler.LineConnector_1.transform.position;
Lure.gameObject.GetComponent().connectedBody =
Rod.lineHandler.LineConnector_1.GetComponent();
Rod.LureHookWaterDisplacement = Lure.GetComponent();
}
if (Weight)
{
Weight.weight = data.weight.Config.weight;
Weight.Initialize(Player, data.weight);
}
// Player.PlayerAnimatorCtrl.ItemInHands = true;
Player.PlayerAnimatorCtrl.ItemInHands = true;
Player.PlayerAnimatorCtrl.ThrowMode = ThrowModeEnum.Spin;
Player.PlayerAnimatorCtrl.ItemType = HandItemType.SpinRod;
if (data.Type == GearType.Pole)
{
Player.PlayerAnimatorCtrl.ItemType = HandItemType.HandRod;
Player.PlayerAnimatorCtrl.ThrowMode = ThrowModeEnum.Float;
}
yield return 1; //等待1帧
Rod.transform.SetParent(Player.MainArm.RodContainer);
Rod.transform.localPosition = Vector3.zero;
Rod.transform.rotation = Player.MainArm.RodContainer.rotation;
// yield return 1; //等待1帧
// Rod.lineHandler.SetStartPosition();
// yield return 5; //等待1帧
// Rod.lineHandler.SetStartPosition2();
Usable = true;
}
public IEnumerator HideGear()
{
Usable = false;
yield return new WaitForSeconds(0.5f);
DestroyGear();
}
private void DestroyGear()
{
if (Rod != null)
{
if (Rod.lineHandler != null)
{
Destroy(Rod.lineHandler.gameObject);
}
Destroy(Rod.gameObject);
}
if (Reel != null)
{
Destroy(Reel.gameObject);
}
if (Hook != null)
{
Destroy(Hook.gameObject);
}
if (Bobber != null)
{
Destroy(Bobber.gameObject);
}
if (Bait != null)
{
Destroy(Bait.gameObject);
}
if (Lure != null)
{
Destroy(Lure.gameObject);
}
if (Weight != null)
{
Destroy(Weight.gameObject);
}
if (Line != null)
{
Destroy(Line.gameObject);
}
}
}
}