using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Events;
public class GActorInfo
{
public static readonly uint FullHp = 100000000;
[System.Serializable]
public class PropValEx
{
// 当前值
public uint val;
// 最大值
public uint max;
// 扩展值
public uint valEx;
// 最大值扩展值
public uint maxValEx;
}
///
/// 是否服务端死亡
///
public bool serverDie = false;
public float moveSpeed;
public float atkSpeed = 1;
public float rotateSpeed;
#region 服务端同步信息
public uint sid;
public uint ownerSID;// 拥有者的服务端ID,一般为宠物,召唤物会对此值进行赋值
public byte Job;
public ushort ReincarnationLv;
public string PlayerName;
public ushort LV;
public uint realm;//境界
public uint titleID;// 称号ID
public uint teamID;// 队伍id, 用来和主角判断是否同个队伍
public uint familyID;// 仙盟id, 用来和主角判断是否在同个仙盟
public string familyName;// 仙盟名称
public int faction;// 阵营, 用来和主角判断是否在同个阵营
public uint horseItemID;// 坐骑ID
public Vector2 serverBornPos;// 服务端坐标, 目前至对NPC有赋值, 玩家的没有赋值
public Dictionary status4012 = new Dictionary(); // buff给角色增加的状态
#endregion
#region 血量
///
/// 血量改变事件
///
public event UnityAction OnHpChange;
///
/// 血量
///
private PropValEx pveHp = new PropValEx();
private uint _synchp;
public uint SyncServerHp
{
get { return _synchp; }
set
{
_synchp = value;
//if (sid != PlayerDatas.Instance.PlayerId)
//{
// Debug.LogFormat("============ 设置 {1} 血量: {0}", _synchp, sid);
//}
}
}// 服务端血量的校准值
private uint _syncHpex;
public uint SyncServerHpEx
{
get { return _syncHpex; }
set
{
_syncHpex = value;
//if (sid != PlayerDatas.Instance.PlayerId)
//{
// Debug.LogFormat("============ 设置 {1} 血量Ex: {0}", _syncHpex, sid);
//}
}
}// 服务端血量Ex的校准值
public uint Hp
{
get
{
return pveHp.val;
}
set
{
pveHp.val = value;
}
}
public uint HpEx
{
get
{
return pveHp.valEx;
}
set
{
pveHp.valEx = value;
}
}
public uint MaxHp
{
get
{
return pveHp.max;
}
set
{
pveHp.max = value;
}
}
public uint MaxHpEx
{
get
{
return pveHp.maxValEx;
}
set
{
pveHp.maxValEx = value;
}
}
public uint RealHp
{
get
{
return HpEx * FullHp + Hp;
}
}
public uint RealMaxHp
{
get
{
return MaxHpEx * FullHp + MaxHp;
}
}
public void ResetHp(int val = -1, short valEx = -1, int valMax = -1, short valMaxEx = -1)
{
if (val != -1)
{
Hp = (uint)val;
}
if (valEx != -1)
{
HpEx = (ushort)valEx;
}
if (valMax != -1)
{
MaxHp = (uint)valMax;
}
if (valMaxEx != -1)
{
MaxHpEx = (ushort)valMaxEx;
}
//if (sid != PlayerDatas.Instance.PlayerId)
//{
// Debug.LogFormat("设置NPC {0}, 当前hp: {1}, hpEx: {2}", sid, Hp, HpEx);
//}
if (OnHpChange != null)
{
OnHpChange(Hp);
}
}
public void ReduceHp(uint value)
{
ushort _multiple = (ushort)(value / FullHp);
//if (sid != PlayerDatas.Instance.PlayerId)
//{
// Debug.LogFormat("伤血量: {0}, 当前hp: {1}, hpEx: {2}", value, Hp, HpEx);
//}
if (_multiple > HpEx)
{
Hp = 0;
HpEx = 0;
}
else
{
HpEx -= _multiple;
value -= (_multiple * FullHp);
}
if (value > Hp)
{
if (HpEx > 0)
{
Hp = FullHp - (value - Hp);
HpEx -= 1;
}
else
{
Hp = 0;
}
}
else
{
Hp -= value;
}
//if (sid != PlayerDatas.Instance.PlayerId)
//{
// if (HpEx != SyncServerHpEx)
// {
// Debug.LogFormat("---- 计算后, hp: {0}, hpEx: {1}", Hp, HpEx);
// }
//}
if (HpEx * FullHp + Hp < SyncServerHpEx * FullHp + SyncServerHp)
{
Hp = SyncServerHp;
HpEx = SyncServerHpEx;
}
if (OnHpChange != null)
{
OnHpChange(Hp);
}
}
public void IncreaseHp(uint value)
{
// ??? 是否可能超过N个最大值? 这里是否应该改除法算出比例
if (value + Hp >= FullHp)
{
Hp = value + Hp - FullHp;
HpEx += 1;
}
else
{
Hp = value + Hp;
}
if (Hp > SyncServerHp)
{
Hp = SyncServerHp;
}
if (HpEx > SyncServerHpEx)
{
HpEx = SyncServerHpEx;
}
if (OnHpChange != null)
{
OnHpChange(Hp);
}
}
public void Clear()
{
OnHpChange = null;
status4012.Clear();
}
#endregion
}