using CommonAI.Zone.Formula; using CommonAI.Zone.Instance; using CommonLang; using System; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; namespace XmdsCommonSkill.Plugin.Buffs { /// /// Description: 移动速度变更, 衰减 public abstract class XmdsBuff_SpeedAttenuation : XmdsBuffBase { /// /// 传负值减速度,传正值加速度. /// public int ChangePercent = 0; private int ChangeSpeed = 0; //改变速率 private int mOpID = 0; public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_SpeedAttenuation; ret.ChangePercent = this.ChangePercent; base.CopyTo(other); } protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, InstanceUnit.BuffState state) { XmdsVirtual.PropChangeOperation pco = hitter.CreatePropChangeOpertation(this); pco.Type = XmdsVirtual.UnitAttributeType.MoveSpeed; pco.Value = ChangePercent; pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent; mOpID = hitter.AddPropChangeOperation(pco); if (state.LifeTimeMS > 1000) { ChangeSpeed = ChangePercent / (state.LifeTimeMS/1000); } XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】,移动速度变更{1}", hitter.mProp.ServerData.BaseInfo.name, ChangePercent); } protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace) { hitter.RemovePropChangeOperation(mOpID); XmdsVirtual.FormatLog("BuffEnd : 单位【{0}】,移动速度变更{1}", hitter.mProp.ServerData.BaseInfo.name, ChangePercent); } public override void BuffUpdate(XmdsVirtual unit, InstanceUnit.BuffState state) { if(ChangeSpeed < 0) { ChangePercent = Math.Min(0, ChangePercent - ChangeSpeed); } else { ChangePercent = Math.Max(0, ChangePercent - ChangeSpeed); } //Console.WriteLine("BuffUpdate - " + TimeUtil.GetTimestampMS() + ", " + ChangePercent); XmdsVirtual.PropChangeOperation pco = unit.CreatePropChangeOpertation(this); pco.Type = XmdsVirtual.UnitAttributeType.MoveSpeed; pco.Value = ChangePercent; pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent; //刷新数值 unit.UpdatePropChangeOperation(mOpID, pco); } } }