using CommonAI.Data;
using CommonAI.Zone.Formula;
using CommonAI.Zone.Helper;
using CommonAI.ZoneClient;
using CommonAI.ZoneServer.JSGModule;
using CommonLang.Property;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace CommonAI.Zone.Instance
{
partial class InstanceUnit
{
//-----------------------------------------------------------------------------------------------------------
#region _sync_fields_
protected readonly SyncUnitInfo mSyncInfo;
private UnitFieldChangedEvent mSyncFields;
private int m_dummy_0, m_dummy_1, m_dummy_2, m_dummy_3, m_dummy_4, m_dummy_5;
//是否触发过破碎效果
private bool isTriggerBroken = false;
public void SetMaxHP(int value, bool auto_update_hp = false)
{
if (__mCurrentHP.SetMax(value, auto_update_hp))
{
syncFields(UnitFieldChangedEvent.MASK_HP | UnitFieldChangedEvent.MASK_MAX_HP);
}
}
[DescAttribute("最大血量")]
public int MaxHP
{
get { return __mCurrentHP.Max; }
set
{
if (__mCurrentHP.SetMax(value, true))
{
syncFields(UnitFieldChangedEvent.MASK_HP | UnitFieldChangedEvent.MASK_MAX_HP);
}
}
}
[DescAttribute("最大能量")]
public int MaxMP
{
get { return __mCurrentMP.Max; }
set
{
if (__mCurrentMP.SetMax(value, true))
{
syncFields(UnitFieldChangedEvent.MASK_MP | UnitFieldChangedEvent.MASK_MAX_MP);
}
}
}
[DescAttribute("当前血量")]
public int CurrentHP
{
get { return __mCurrentHP.Value; }
set
{
if (!IsDead() && __mCurrentHP.SetValue(value))
{
syncFields(UnitFieldChangedEvent.MASK_HP);
}
}
}
[DescAttribute("当前能量")]
public int CurrentMP
{
get { return __mCurrentMP.Value; }
set
{
if (!IsDead() && __mCurrentMP.SetValue(value))
{
syncFields(UnitFieldChangedEvent.MASK_MP);
}
}
}
[DescAttribute("当前血量百分比")]
public float CurrentHP_Pct { get { return __mCurrentHP.Value * 100f / __mCurrentHP.Max; } }
[DescAttribute("当前能量百分比")]
public float CurrentMP_Pct { get { return __mCurrentMP.Value * 100f / __mCurrentMP.Max; } }
[DescAttribute("当前金币")]
public int CurrentMoney
{
get { return mMoney; }
set
{
if (mMoney != value)
{
int add = value - mMoney;
mMoney = value;
syncFields(UnitFieldChangedEvent.MASK_MONEY);
Parent.cb_unitGotMoneyCallBack(this, add);
}
}
}
[DescAttribute("当前等级")]
public int Level
{
get { return mLevel; }
set
{
if (mLevel != value)
{
mLevel = value;
syncFields(UnitFieldChangedEvent.MASK_LEVEL);
}
}
}
[DescAttribute("单位职业")]
public int UnitPro()
{
return (int)this.Virtual.GetUnitPro();
}
[DescAttribute("性别0-男1-女")]
public int UnitSex()
{
return (int)this.Virtual.GetUnitSex();
}
[DescAttribute("玩家职业")]
public int PlayerPro()
{
if (this.IsPlayer)
{
return (int)this.Virtual.GetUnitPro();
}
return 0;
}
private void DoAddHP(int hp)
{
if (!IsDead())
{
if (__mCurrentHP.Add(hp))
{
syncFields(UnitFieldChangedEvent.MASK_HP);
// 触发破碎效果
if (this.Info.HitBreakPrecent > 0 && !this.isTriggerBroken)
{
int precent = (int)((double)this.CurrentHP / this.MaxHP * 100);
if (precent <= this.Info.HitBreakPrecent)
{
//Console.WriteLine("触发破碎");
this.isTriggerBroken = true;
UnitHitBreak hitBreak = new UnitHitBreak(this.ID);
this.Parent.queueObjectEvent(this, hitBreak);
}
}
}
}
}
private void DoAddMP(int mp, bool force = false)
{
if (IsDead() || (mp < 0 && !this.Virtual.IsCanReduceMP(force)))
{
return;
}
if (__mCurrentMP.Add(mp))
{
syncFields(UnitFieldChangedEvent.MASK_MP);
//进入破定状态
if (__mCurrentMP.Value == 0 && this.CurrentActionStatus != UnitActionStatus.BreakShield)
{
this.changeState(new StateBreakShield(this), true);
}
//System.Console.WriteLine("更新定力值:" + this.Info.Name + ", " + __mCurrentMP.Value);
}
}
public void AddSP(int st)
{
// if (!IsDead)
// {
// if (__mCurrentSP.Add(st))
// {
// syncFields(UnitFieldChangedEvent.MASK_SP);
// }
// }
}
public int AddHP(int hp, InstanceUnit sender, bool sendHit = true, AttackSource source = null)
{
int finalHP = ReduceHP(-hp, sender, source, sendHit);
//排除怪物回血
JSGHackerModule.PrintDmgInfo(this, sender, source, hp, finalHP);
return finalHP;
}
public void AddHP_Pct(float percent, InstanceUnit sender)
{
AddHP((int)(percent / 100f * MaxHP), sender);
}
///
/// 直接设置移动速度
///
///
public void SetMoveSpeed(float speed)
{
if (speed < 0)
{
speed = 0;
}
if (speed != __mCurrentMoveSpeedSEC)
{
__mCurrentMoveSpeedSEC = speed;
syncFields(UnitFieldChangedEvent.MASK_SPEED);
}
}
///
/// 直接设置攻速
///
///
public void SetAttackSpeed(int speed)
{
if (speed <= 0)
{
speed = GlobalData.DEFAULT_ATTACK_SPEED;
}
if (speed != __mCurrentAttackSpeed)
{
__mCurrentAttackSpeed = speed;
}
}
public int GetAttackSpeed()
{
return this.__mCurrentAttackSpeed;
}
///
/// 直接设置当前技能cd减少
///
///
public void SetSkillCdReduce(float value)
{
if (value < 0)
{
value = 0;
}
if (value != __mCurrentSkillCdReduce)
{
__mCurrentSkillCdReduce = value;
syncFields(UnitFieldChangedEvent.MASK_SKILL_CD_ACC);
}
}
///
/// 直接设置受到控制效果的持续时间减少
///
///
public void SetControledTimeReduce(float value)
{
if (value < 0)
{
value = 0;
}
if (value != __mCurrentControledTimeReduce)
{
__mCurrentControledTimeReduce = value;
syncFields(UnitFieldChangedEvent.MASK_CONTROLED_ACC);
}
}
public void SetControledTimeAdd(float value)
{
if (value < 0)
{
value = 0;
}
if (value != __mControledTimeAdd)
{
__mControledTimeAdd = value;
syncFields(UnitFieldChangedEvent.MASK_CONTROLED_ACC);
}
}
///
/// 设置所有技能动作速度加成
///
///
public void SetSkillActionSpeedRate(float rate)
{
if (rate < 0)
{
rate = 0;
}
if (rate != __mSkillActionSpeedRate)
{
__mSkillActionSpeedRate = rate;
}
}
/** 是否满血 */
public bool IsFullHP()
{
return this.CurrentHP == this.MaxHP;
}
///
/// 设置当前快速施法速度(基准0)(1是1倍速)
///
///
public void SetFastCastRate(float fcr)
{
if (mFastCastRate != fcr)
{
mFastCastRate = fcr;
syncFields(UnitFieldChangedEvent.MASK_FCR);
}
}
public int Dummy_0
{
get { return m_dummy_0; }
set
{
if (m_dummy_0 != value)
{
m_dummy_0 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_0);
}
}
}
public int Dummy_1
{
get { return m_dummy_1; }
set
{
if (m_dummy_1 != value)
{
m_dummy_1 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_1);
}
}
}
public int Dummy_2
{
get { return m_dummy_2; }
set
{
if (m_dummy_2 != value)
{
m_dummy_2 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_2);
}
}
}
public int Dummy_3
{
get { return m_dummy_3; }
set
{
if (m_dummy_3 != value)
{
m_dummy_3 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_3);
}
}
}
public int Dummy_4
{
get { return m_dummy_4; }
set
{
if (m_dummy_4 != value)
{
m_dummy_4 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_4);
}
}
}
public int Dummy_5
{
get { return m_dummy_5; }
set
{
if (m_dummy_5 != value)
{
m_dummy_5 = value;
syncFields(UnitFieldChangedEvent.MASK_DUMMY_5);
}
}
}
public void syncFields(uint mask)
{
if (mSyncFields == null)
{
mSyncFields = new UnitFieldChangedEvent();
}
mSyncFields.mask |= mask;
}
private void updateSyncFields()
{
if (mSyncFields != null)
{
GenSyncFields(mSyncFields);
queueEvent(mSyncFields);
mSyncFields = null;
}
}
public void GenSyncFields(UnitFieldChangedEvent sync)
{
sync.currentHP = __mCurrentHP.Value;
sync.currentMP = __mCurrentMP.Value;
sync.maxHP = __mCurrentHP.Max;
sync.maxMP = __mCurrentMP.Max;
sync.maxSP = 0;
sync.currentSP = 0;
sync.currentSpeed = __mCurrentMoveSpeedSEC;
sync.currentFCR = mFastCastRate;
sync.currentMoney = mMoney;
sync.level = mLevel;
sync.dummy_0 = m_dummy_0;
sync.dummy_1 = m_dummy_1;
sync.dummy_2 = m_dummy_2;
sync.dummy_3 = m_dummy_3;
sync.dummy_4 = m_dummy_4;
sync.dummy_5 = m_dummy_5;
}
public override SyncObjectInfo GenSyncInfo(bool net)
{
return GenSyncUnitInfo(net);
}
public SyncUnitInfo GenSyncUnitInfo(bool net = false)
{
mSyncInfo.status = (byte)CurrentActionStatus;
mSyncInfo.sub_status = (byte)CurrentActionSubstate;
mSyncInfo.sub_flag = mSubStateExt;
mSyncInfo.Force = mForce;
mSyncInfo.Level = mLevel;
mSyncInfo.x = X;
mSyncInfo.y = Y;
mSyncInfo.direction = this.Direction;
if (net)
{
mSyncInfo.CurrentBuffStatus = this.GetCurrentBuffStatus();
mSyncInfo.fields.mask = UnitFieldChangedEvent.MASK_ALL;
GenSyncFields(mSyncInfo.fields);
}
return mSyncInfo;
}
///
/// 设置单位显示信息
///
///
public void SetVisibleInfo(IUnitVisibleData visible_data)
{
mSyncInfo.VisibleInfo = visible_data;
}
public void SetDiaplayerName(String name)
{
if (mSyncInfo.VisibleInfo != null)
{
mSyncInfo.VisibleInfo.setVisibleName(name);
}
this.mSyncInfo.Name = name;
}
public override String GetTemplateData()
{
return "Unit:" + this.mInfo.ID;
}
//设置自动拾取范围
public virtual void SetAutoPickRange(int value) { }
#endregion
//-----------------------------------------------------------------------------------------------------------
#region script_support
public string get_name()
{
return mName;
}
public int get_force()
{
return mForce;
}
public int get_level()
{
return mLevel;
}
public bool is_dead()
{
return IsDead();
}
public bool is_enable()
{
return Enable;
}
public bool is_paused()
{
return IsPaused;
}
public bool is_none_block()
{
return IsNoneBlock;
}
public bool is_none_skill()
{
return IsNoneSkill;
}
public uint get_id()
{
return ID;
}
public UnitInfo get_info()
{
return mInfo;
}
public Random get_random()
{
return RandomN;
}
public float get_x()
{
return X;
}
public float get_y()
{
return Y;
}
public float get_direction()
{
return Direction;
}
public float set_direction(float d)
{
this.faceTo(d);
return d;
}
public string get_unit_tag()
{
return UnitTag;
}
public string set_unit_tag(string str)
{
UnitTag = str;
return str;
}
public int get_max_hp()
{
return MaxHP;
}
public int set_max_hp(int max)
{
MaxHP = max;
return max;
}
public int get_max_mp()
{
return MaxMP;
}
//public int set_max_mp(int mp)
//{
// MaxMP = mp;
// return mp;
//}
public int get_current_hp()
{
return __mCurrentHP.Value;
}
public int set_current_hp(int hp)
{
CurrentHP = hp;
return hp;
}
public int get_current_mp()
{
return __mCurrentMP.Value;
}
//public int set_current_mp(int mp)
//{
// CurrentMP = mp;
// return mp;
//}
public int set_level(int lv)
{
Level = lv;
return lv;
}
//public void add_mp(int mp)
//{
// AddMP(mp);
//}
public void add_hp(int hp)
{
AddHP(hp, this);
}
public void add_sp(int sp)
{
AddSP(sp);
}
public void add_buff(int buffID)
{
AddBuff(buffID);
}
public void clear_buff()
{
clearBuffs();
}
public void use_item(int itemTemplateID)
{
ItemTemplate item = Templates.getItem(itemTemplateID);
if (item != null)
{
UseItem(item);
}
}
#endregion
}
}