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