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 }