Index: binaries/data/mods/public/simulation/components/StatusEffectsReceiver.js =================================================================== --- binaries/data/mods/public/simulation/components/StatusEffectsReceiver.js +++ binaries/data/mods/public/simulation/components/StatusEffectsReceiver.js @@ -29,21 +29,49 @@ this.activeStatusEffects[statusName] = {}; let status = this.activeStatusEffects[statusName]; Object.assign(status, data); - status.Interval = +data.Interval; - status.TimeElapsed = 0; - status.FirstTime = true; + + if (status.Modifiers) + { + let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager); + for (let modifier in status.Modifiers) + { + cmpModifiersManager.AddModifier(data.Modifiers[modifier].Path, statusName, { + "affects": data.Modifiers[modifier].Affects._string.split(/\s+/), + [data.Modifiers[modifier].Operation]: +data.Modifiers[modifier].Value + }, this.entity); + } + } let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); - status.Timer = cmpTimer.SetInterval(this.entity, IID_StatusEffectsReceiver, "ExecuteEffect", 0, +status.Interval, statusName); + if (status.Interval) + { + if (status.Duration) + status.TimeElapsed = 0; + status.FirstTime = true; + status.Timer = cmpTimer.SetInterval(this.entity, IID_StatusEffectsReceiver, "ExecuteEffect", 0, +status.Interval, statusName); + } + else if (status.Duration) + cmpTimer.SetTimeout(this.entity, IID_StatusEffectsReceiver, "RemoveStatus", +status.Duration, statusName); }; StatusEffectsReceiver.prototype.RemoveStatus = function(statusName) { - if (!this.activeStatusEffects[statusName]) + let statusEffect = this.activeStatusEffects[statusName]; + if (!statusEffect) return; - let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); - cmpTimer.CancelTimer(this.activeStatusEffects[statusName].Timer); + if (statusEffect.Modifiers) + { + let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager); + for (let modifier in statusEffect.Modifiers) + cmpModifiersManager.RemoveModifier(statusEffect.Modifiers[modifier].Path, statusName, this.entity); + } + + if (statusEffect.Timer) + { + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + cmpTimer.CancelTimer(statusEffect.Timer); + } delete this.activeStatusEffects[statusName]; }; Index: binaries/data/mods/public/simulation/helpers/Attacking.js =================================================================== --- binaries/data/mods/public/simulation/helpers/Attacking.js +++ binaries/data/mods/public/simulation/helpers/Attacking.js @@ -37,12 +37,36 @@ "" + "" + "" + - "" + - "" + - "" + + "" + + "" + + "" + + "" + "" + + "" + + "" + "" + "" + DamageSchema + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "tokens" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + "" + "" + "" + Index: binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml =================================================================== --- binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml +++ binaries/data/mods/public/simulation/templates/template_unit_infantry_ranged_archer.xml @@ -11,6 +11,25 @@ 6.0 0 + + + 10000 + + + UnitMotion/WalkSpeed + Unit + add + 20 + + + Health/Max + Unit + add + -20 + + + + 72.0 0.0 600