using System;
using System.Collections.Generic;
using Fantasy;
using Fantasy.Entitas;
using NBF.Utils;
using UnityEngine;
namespace NBF
{
public class Player : Entity
{
// ========== 本地状态 ==========
///
/// 是否本地玩家
///
public bool IsLocalPlayer;
///
/// 是否切换物品中
///
public bool IsChangeItemIng;
public bool IsLureRod => false;
public bool IsSelf => RoleModel.Instance.Id == Id;
// ========== 物理状态(高频同步) ==========
public Vector3 Position;
public Quaternion Rotation;
public Vector2 MoveInput;
public float Speed;
public float RotationSpeed;
public bool IsGrounded;
public bool Run;
public float EyeAngle;
///
/// 标志量
///
public long TagValue;
///
/// 上一个状态
///
public PlayerState PreviousState;
///
/// 当前状态
///
public PlayerState State;
///
/// 状态参数
///
public StateEnterParams StateParams;
///
/// 玩家的物品
///
public Dictionary Items = new Dictionary();
///
/// 当前手持物品id
///
public long HandItemId;
///
/// 当前手持物品
///
public PlayerItem HandItem => Items.GetValueOrDefault(HandItemId);
#region 初始化
public void InitPlayer(MapUnitInfo unitInfo)
{
AddComponent();
AddComponent();
if (unitInfo.Id == RoleModel.Instance.Id)
{
//自己
AddComponent();
}
}
#endregion
#region 物品
public void ReleaseItem(PlayerItem item)
{
if (Items.ContainsValue(item))
{
Items.Remove(item.Id);
item.Dispose();
}
}
public void UnUseItem()
{
var prevItem = HandItem;
HandItemId = 0;
ItemChangeEvent(prevItem);
}
public void UseItem(ItemInfo item)
{
var prevItem = HandItem;
var itemType = item.ConfigId.GetItemType();
if (itemType == ItemType.Rod)
{
var playerItemRod = Create(Scene);
playerItemRod.Init(this, item);
Items[playerItemRod.Id] = playerItemRod;
HandItemId = playerItemRod.Id;
}
ItemChangeEvent(prevItem);
}
private void ItemChangeEvent(PlayerItem prevItem)
{
Scene.EventComponent.Publish(new PlayerItemChangeEvent
{
Player = this,
Item = HandItem,
PrevItem = prevItem
});
}
#endregion
#region 状态切换
///
/// 切换状态
///
///
///
public void ChangeState(PlayerState state, StateEnterParams stateParams = null)
{
if (state == State)
{
return;
}
PreviousState = State;
State = state;
StateParams = stateParams;
Scene.EventComponent.Publish(new PlayerStateChangeEvent
{
Player = this
});
}
#endregion
}
}