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; namespace XmdsCommonSkill.Plugin.PassiveSkills.Magic { /// /// 防御塔被动 /// 1. 受伤机制, 2. 攻击机制 /// public class Other_100003 : XmdsPassiveSkillBase { /// 技能ID. public static readonly int ID = 100003; public static readonly float SoliderAtkRange = 6.0f; private XmdsVirtual mOwner = null; private int mUUID_1 = 0; private int mUUID_2 = 0; public override int SkillID { get { return ID; } } protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner) { this.mOwner = owner; mUUID_1 = owner.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true); mUUID_2 = owner.RegistOnHitOther(OnHandleOnHitOther, skillInfo, true); } //受到攻击 private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { //队伍范围内找友军 int soldiersCount = 0; using (var list = ListObjectPool.AllocAutoRelease()) { mOwner.mUnit.Parent.getObjectsRoundRange( (obj, dx, dy, dr) => { var u = obj as InstanceUnit; if (u.Virtual is XmdsVirtual_Monster && CMath.includeRoundPoint(dx, dy, dr, u.X, u.Y)) { //己方单位. if (mOwner.mUnit.Force != u.Force) { soldiersCount++; } } return true; }, mOwner.mUnit.X, mOwner.mUnit.Y, SoliderAtkRange, list, mOwner.mUnit.AoiStatus); } //有小兵,伤害不衰减,最大1/10防御塔最大血量 if (soldiersCount > 0) { return Math.Min(damage, mOwner.mUnit.MaxHP / 10); } //没有小兵,伤害衰减10倍,最大1/10防御塔最大血量 return Math.Min(damage / 100, mOwner.mUnit.MaxHP / 10); } //单位攻击 private float OnHandleOnHitOther(float damage, XmdsVirtual hitter, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { if (hitter is XmdsVirtual_Player) { damage = Math.Max(damage, hitter.mUnit.MaxHP/10); } return damage; } protected override void OnDispose(XmdsVirtual owner) { owner.UnRegistOnHitDamage(mUUID_1); owner.UnRegistOnHitOther(mUUID_2); } } }