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 @@ -24,21 +24,52 @@ this.activeStatusEffects[statusName] = {}; let status = this.activeStatusEffects[statusName]; status.duration = +data.Duration; - status.interval = +data.Interval; - status.damage = +data.Damage; status.timeElapsed = 0; status.firstTime = true; + if (data.Damage) + { + status.interval = +data.Interval; + status.damage = +data.Damage; + } + if (data.Modifiers) + { + status.Modifiers = {}; + let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager); + for (let modifier in data.Modifiers) + { + status.Modifiers[modifier] = data.Modifiers[modifier].Path + 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) + 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) { +StatusEffectsReceiver.prototype.RemoveStatus = function(statusName) +{ if (!this.activeStatusEffects[statusName]) return; - let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); - cmpTimer.CancelTimer(this.activeStatusEffects[statusName].timer); + if (this.activeStatusEffects[statusName].Modifiers) + { + let cmpModifiersManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_ModifiersManager); + for (let modifier in this.activeStatusEffects[statusName].Modifiers) + cmpModifiersManager.RemoveModifier(this.activeStatusEffects[statusName].Modifiers[modifier], statusName, this.entity); + } + + if (this.activeStatusEffects[statusName].timer) + { + let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); + cmpTimer.CancelTimer(this.activeStatusEffects[statusName].timer); + } this.activeStatusEffects[statusName] = undefined; }; 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 @@ -29,14 +29,38 @@ "" + "" + "" + - "" + + "" + "" + "" + "" + "" + + "" + "" + + "" + + "" + "" + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "tokens" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + "" + "" + "" + @@ -79,8 +103,8 @@ if (template.Capture) ret.Capture = ApplyValueModificationsToEntity(valueModifRoot + "/Capture", +(template.Capture || 0), entity); - if (template.StatusEffects) - ret.StatusEffects = template.StatusEffects; + if (template.GiveStatus) + ret.GiveStatus = template.GiveStatus; if (template.Bonuses) ret.Bonuses = template.Bonuses; 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