using CommonAI.Data; using CommonAI.Zone.Formula; using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using System; using System.Collections.Generic; using System.Linq; using System.Text; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.Units; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; namespace XmdsCommonSkill.Plugin.Buffs { /// /// FileName: XmdsBuff_Mocking.cs /// Author: Alex.Yu /// Corporation:... /// Description: 嘲讽BUFF. /// DateTime: 2015/6/16 17:43:44 /// public class XmdsBuff_Mocking : XmdsBuffBase { //嘲讽目标. public XmdsVirtual BuffTarget = null; public int damageReduce = 5000; private uint senderId = 0; private int mHandleUUID = 0; private int mHandleUUID1 = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.Mocking; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_Mocking; ret.BuffTarget = this.BuffTarget; this.BuffTarget = null; ret.damageReduce = this.damageReduce; ret.senderId = this.senderId; base.CopyTo(other); } protected override void OnBindTemplate(ref CommonAI.Zone.BuffTemplate buffTemplate) { } protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, CommonAI.Zone.Instance.InstanceUnit.BuffState state) { mHandleUUID = hitter.RegistGetAtkTarget(OnGetAtkTarget, null, true); if(this.damageReduce > 0) { senderId = attacker.mUnit.ID; mHandleUUID1 = hitter.RegistOnHitOther(OnHandleHitOther, null); } if(hitter.mUnit.IsPlayer) { hitter.mUnit.AddActionSubState(UnitActionSubStatus.Mocking); XmdsInstancePlayer player = hitter.mUnit as XmdsInstancePlayer; player.setMocking(attacker.mUnit); } } protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, CommonAI.Zone.Instance.InstanceUnit.BuffState state, bool replace) { BuffTarget = null; hitter.UnRegistGetAtkTarget(mHandleUUID); if(this.damageReduce > 0 && mHandleUUID1 > 0) { hitter.UnRegistOnHitOther(mHandleUUID1); } if (hitter.mUnit.IsPlayer) { hitter.mUnit.RemoveActionSubState(UnitActionSubStatus.Mocking); XmdsInstancePlayer player = hitter.mUnit as XmdsInstancePlayer; player.setMocking(null); } else if(!replace) { //怪物嘲讽,且非替换才处理仇恨值相关逻辑 hitter.mHateSystem.MockingInheritHatred((XmdsVirtual)state.Sender.Virtual); } } private XmdsVirtual OnGetAtkTarget(XmdsVirtual target, GameSkill gs) { //有嘲讽目标且目标仍然有效. if(BuffTarget != null && BuffTarget.mUnit.IsActive) { return BuffTarget; } return target; } private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { //2021.5.29,MMO-16539:修改成全部伤害减免 if (hitted.mUnit.ID == this.senderId/* && source.FromSkillType == XmdsSkillType.normalAtk*/) { damage -= damage * XmdsUnitProp.PER * this.damageReduce; } return damage; } protected override void OnDispose() { BuffTarget = null; base.OnDispose(); } } }