using UnityEngine;
|
using System.Collections.Generic;
|
using UnityEngine.Events;
|
|
public class GActorInfo
|
{
|
public static readonly uint FullHp = 100000000;
|
|
[System.Serializable]
|
public class PropValEx
|
{
|
// 当前值
|
public ulong val;
|
// 最大值
|
public ulong max;
|
// 扩展值
|
public uint valEx;
|
// 最大值扩展值
|
public uint maxValEx;
|
}
|
|
/// <summary>
|
/// 是否本服务端死亡
|
/// </summary>
|
public bool serverDie = false;
|
public bool recordServerDie = 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<byte, byte> status4012 = new Dictionary<byte, byte>(); // buff给角色增加的状态
|
#endregion
|
|
#region 血量
|
|
/// <summary>
|
/// 血量改变事件
|
/// </summary>
|
public event UnityAction<ulong> OnHpChange;
|
/// <summary>
|
/// 血量
|
/// </summary>
|
private PropValEx pveHp = new PropValEx();
|
|
private ulong _synchp;
|
public ulong SyncServerHp
|
{
|
get { return _synchp; }
|
set
|
{
|
_synchp = value;
|
//if (sid != PlayerDatas.Instance.PlayerId)
|
//{
|
// Debug.LogFormat("<color=green>============ 设置 {1} 血量: {0}</color>", _synchp, sid);
|
//}
|
}
|
}// 服务端血量的校准值
|
|
private uint _syncHpex;
|
public uint SyncServerHpEx
|
{
|
get { return _syncHpex; }
|
set
|
{
|
_syncHpex = value;
|
// if (sid != PlayerDatas.Instance.PlayerId)
|
// {
|
// Debug.LogFormat("<color=green>============ 设置 {1} 血量Ex: {0}</color>", _syncHpex, sid);
|
// }
|
}
|
}// 服务端血量Ex的校准值
|
|
public ulong Hp
|
{
|
get
|
{
|
return pveHp.val;
|
}
|
|
set
|
{
|
pveHp.val = value;
|
}
|
}
|
|
public uint HpEx
|
{
|
get
|
{
|
return pveHp.valEx;
|
}
|
set
|
{
|
pveHp.valEx = value;
|
}
|
}
|
|
public ulong MaxHp
|
{
|
get
|
{
|
return pveHp.max;
|
}
|
|
set
|
{
|
pveHp.max = value;
|
}
|
}
|
|
public uint MaxHpEx
|
{
|
get
|
{
|
return pveHp.maxValEx;
|
}
|
set
|
{
|
pveHp.maxValEx = value;
|
}
|
}
|
|
public ulong RealHp
|
{
|
get
|
{
|
return (ulong)HpEx * FullHp + Hp;
|
}
|
}
|
|
public ulong RealMaxHp
|
{
|
get
|
{
|
return (ulong)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)
|
{
|
if (Hp == 0)
|
{
|
if (Hp != SyncServerHp)
|
{
|
Hp = SyncServerHp;
|
}
|
}
|
}
|
|
// if (sid != PlayerDatas.Instance.PlayerId)
|
// {
|
// Debug.LogFormat("<color=yellow>设置血量 {0}, 当前hp: {1}, hpEx: {2}</color>", 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("<color=red> 伤血量: {0}, 当前hp: {1}, hpEx: {2}</color>", 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
|
{
|
if (!ClientDungeonStageUtility.isClientDungeon
|
#if UNITY_EDITOR
|
&& !RuntimeLogUtility.TEST_CLIENT_PVP
|
#endif
|
)
|
{
|
Hp = SyncServerHp;
|
}
|
else
|
{
|
Hp = 0;
|
}
|
}
|
}
|
else
|
{
|
Hp -= value;
|
}
|
|
// if (sid != PlayerDatas.Instance.PlayerId)
|
// {
|
// if (HpEx > 0)
|
// {
|
// Debug.Log("Error");
|
// }
|
// }
|
|
// 如果处于客户端战斗则不进行血量矫正了
|
if (!ClientDungeonStageUtility.isClientDungeon
|
#if UNITY_EDITOR
|
&& !RuntimeLogUtility.TEST_CLIENT_PVP
|
#endif
|
)
|
{
|
if (HpEx * FullHp + Hp < SyncServerHpEx * FullHp + SyncServerHp)
|
{
|
Hp = SyncServerHp;
|
HpEx = SyncServerHpEx;
|
}
|
|
if (sid == PlayerDatas.Instance.PlayerId)
|
{
|
if (Hp == 0)
|
{
|
if (Hp != SyncServerHp)
|
{
|
Hp = SyncServerHp;
|
}
|
}
|
}
|
}
|
|
// if (sid != PlayerDatas.Instance.PlayerId)
|
// {
|
// if (HpEx != SyncServerHpEx)
|
// {
|
// Debug.LogFormat("<color=red>---- 计算后, hp: {0}, hpEx: {1}</color>", Hp, HpEx);
|
// }
|
// }
|
|
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
|
}
|