using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using XmdsCommonServer.Plugin; using XmdsCommonServer.XLS.Data; using XmdsCommonSkill.Plugin.Buffs; using System; using static CommonAI.Zone.Instance.InstanceUnit; using XmdsCommon.Plugin; using CommonAI.Zone; using XmdsCommonServer.Plugin.Units; using CommonAI.Zone.Formula; using XmdsCommonSkill.Plugin.Skills; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using XmdsCommonSkill.Plugin.Skills.Magic; using CommonLang; using CommonAI.Data; using System.Collections.Generic; namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic { /// /// 封神战-旗子被动 /// public class Other_100005 : XmdsPassiveSkillBase { /// 技能ID. public static readonly int ID = 100005; private static readonly int BuffID = (int)XmdsBuffBase.XmdsBuffList.PVP_FLAG_DAMAGEREDUCE; private static XmdsSkillValue valueSet; private static int HIT_DAMAGE = 1; //单次攻击掉血 private static int HIT_DAMAGE_REDUCE = 0; //免伤逻辑 private static int HPRebornInterval = 0; //HP恢复频率 private static int NotDamgeAddHPTime = 0; //没有收到伤害多久,开始回血 private static int HPRebornValue = 0; //HP恢复比例 private int mNeedHitTimes = 0; private int mUUID_1 = 0; private int mUUID_2 = 0; private int mOpID1 = 0; //私有数据 private XmdsVirtual mOwner = null; private int timePass = 0; //旗子被动刷新间隔 private long lastHitTime = 0; //最后一次被攻击时间 public override int SkillID { get { return ID; } } protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner) { this.mOwner = owner; mNeedHitTimes = Math.Max(10, valueSet.GetValue(owner.mUnit.gameServerFlag == 0 ? skillInfo.SkillLevel : owner.mUnit.gameServerFlag)); XmdsVirtual.PropChangeOperation pco = owner.CreatePropChangeOpertation(null); pco.Type = XmdsVirtual.UnitAttributeType.SetMaxHP; pco.Value = mNeedHitTimes * HIT_DAMAGE; mOpID1 = owner.AddPropChangeOperation(pco); mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true); mUUID_2 = owner.RegistTryAddBuffEvent(OnTryAddBuffEvent, skillInfo); } private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { this.lastHitTime = CommonLang.CUtils.localTimeMS; isEndDispatch = true; if (source.FromSkillType == XmdsSkillType.normalAtk && attacker.mUnit.IsPlayer) { if(HIT_DAMAGE > 1 && HIT_DAMAGE_REDUCE > 0 && hitted.mUnit.GetBuffByID(BuffID) != null) { float damageReduce = HIT_DAMAGE * HIT_DAMAGE_REDUCE * XmdsUnitProp.PER; return HIT_DAMAGE - damageReduce; } return HIT_DAMAGE; } attacker.SendBattleHintNumberB2C(0, XmdsVirtual.UnitHitEventState.Immunity, hitted.mUnit.ID); return 0; } private bool OnTryAddBuffEvent(ref BuffTemplate buff, XmdsVirtual attacker, XmdsVirtual hitter, GameSkill skill) { // 只允许加这个buff return (buff.TemplateID == BuffID) ? true : false; } protected override void OnUpdate(int intervalMS, bool slowRefresh) { base.OnUpdate(intervalMS, slowRefresh); //开始回血判断 long noDamageTimePass = CommonLang.CUtils.localTimeMS - lastHitTime; if (mOwner == null || noDamageTimePass < NotDamgeAddHPTime) { timePass = 0; return; } timePass += intervalMS; //回血判断 if (mOwner.mUnit.CurrentHP < mOwner.mUnit.MaxHP && timePass > HPRebornInterval) { timePass = 0; //队伍范围内找友军 //int addHp = (int)(mOwner.mUnit.MaxHP * XmdsUnitProp.PER * HPRebornValue); this.mOwner.mUnit.AddHP(HPRebornValue, this.mOwner.mUnit); } } // //防御加成 // int damageReduce = GetDamageReduceByAlliesCount(alliestCount); // if (damageReduce != preDamageReduce) // { // if (damageReduce > 0) // { // var buff = this.mOwner.GetRegisBuffVirtual(BuffID) as XmdsBuff_PropChange; // buff.CurrentValue = damageReduce; // this.mOwner.mUnit.AddBuff(BuffID, this.mOwner.mUnit); // } // else // { // this.mOwner.mUnit.removeBuff(BuffID); // } // } //} ///** 获得附近队友数量 */ //private int AlliesCounting() //{ // int alliesCount = 0; // using (var list = ListObjectPool.AllocAutoRelease()) // { // mOwner.mUnit.Parent.getObjectsRoundRange( // (obj, dx, dy, dr) => // { // var u = obj as InstanceUnit; // if (u.Virtual is XmdsVirtual_Player && CMath.includeRoundPoint(dx, dy, dr, u.X, u.Y)) // { // //己方单位. // if (mOwner.IsAllies(u.Virtual as XmdsVirtual)) // { // alliesCount++; // } // } // return true; // }, // mOwner.mUnit.X, // mOwner.mUnit.Y, // 6, // list, mOwner.mUnit.AoiStatus); // } // return alliesCount++; //} ///** 根据队友数量,获得减伤比例 */ //private int GetDamageReduceByAlliesCount(int alliesCount) //{ // if(alliesCount <= 0) // { // return 0; // } // else if(alliesCount <= 3) // { // return 1000; // } // else if(alliesCount <= 5) // { // return 2000; // } // else if(alliesCount <= 10) // { // return 5000; // } // return 8000; //} ///** 根据队友数量,获得减伤比例 */ //private float GetHealByAlliesCount(int alliesCount) //{ // int precent = 1000; // if (alliesCount <= 0) // { // precent = 500; // } // else if (alliesCount <= 3) // { // precent = 600; // } // else if (alliesCount <= 5) // { // precent = 800; // } // else if (alliesCount <= 10) // { // precent = 1000; // } // return precent * XmdsUnitProp.PER; //} protected override void OnInitSkillParam() { XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID); InitData(data, out valueSet, XmdsSkillData.XmdsSkillDataKey.ValueSet); XmdsSkillValue valueTemp; InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet2); HIT_DAMAGE = Math.Max(1, valueTemp.GetValue()); InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet3); HIT_DAMAGE_REDUCE = valueTemp.GetValue(); InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet4); NotDamgeAddHPTime = valueTemp.GetValue() * 1000; InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet5); HPRebornValue = valueTemp.GetValue(); InitData(data, out valueTemp, XmdsSkillData.XmdsSkillDataKey.ValueSet6); HPRebornInterval = valueTemp.GetValue() * 1000; } protected override void OnDispose(XmdsVirtual owner) { owner.UnRegistOnHitDamage(mUUID_1); owner.UnRegistTryAddBuffEvent(mUUID_2); owner.RemovePropChangeOperation(mOpID1); } } }