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 @@ -13,22 +13,35 @@ // Called by attacking effects. StatusEffectsReceiver.prototype.GiveStatus = function(effectData, attacker, attackerOwner, bonusMultiplier) { + let attackerData = { "entity": attacker, "owner": attackerOwner }; for (let effect in effectData) - this.AddStatus(effect, effectData[effect]); + this.AddStatus(effect, effectData[effect], attackerData); // TODO: implement loot / resistance. return { "inflictedStatuses": Object.keys(effectData) }; }; -StatusEffectsReceiver.prototype.AddStatus = function(statusName, data) +StatusEffectsReceiver.prototype.AddStatus = function(statusName, data, attackerData) { - if (this.activeStatusEffects[statusName]) + if (this.activeStatusEffects[statusName] && (!data.Stackable || data.Stackable == "false")) return; + if (data.Stackable && data.Stackable == "true") + for (let i = 0; i < 10; ++i) + { + let temp = statusName + "_" + i; + if (!this.activeStatusEffects[temp]) + { + statusName = temp; + break; + } + } + this.activeStatusEffects[statusName] = {}; let status = this.activeStatusEffects[statusName]; Object.assign(status, data); + status.AttackerData = attackerData; status.Interval = +data.Interval; status.TimeElapsed = 0; status.FirstTime = true; @@ -61,7 +74,7 @@ else status.TimeElapsed += status.Interval + lateness; - Attacking.HandleAttackEffects(statusName, status, this.entity, -1, -1); + Attacking.HandleAttackEffects(statusName, status, this.entity, status.AttackerData.entity, status.AttackerData.owner); if (status.Duration && status.TimeElapsed >= +status.Duration) this.RemoveStatus(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 @@ -86,7 +86,33 @@ ret.Capture = ApplyValueModificationsToEntity(valueModifRoot + "/Capture", +(template.Capture || 0), entity); if (template.GiveStatus) - ret.GiveStatus = template.GiveStatus; + { + for (let effect in template.GiveStatus) + { + ret.GiveStatus[effect] = { + "Duration": ApplyValueModificationsToEntity(valueModifRoot + "/GiveStatus/" + effect + "/", +(template.GiveStatus[effect].Duration || 0), entity), + "Interval": ApplyValueModificationsToEntity(valueModifRoot + "/GiveStatus/" + effect + "/", +(template.GiveStatus[effect].Interval || 1000), entity) + }; + Object.assign(ret.GiveStatus[effect], this.GetAttackEffectsData(valueModifRoot + "/GiveStatus" + effect, template.GiveStatus[effect], entity)); + if (template.GiveStatus[effect].Modifiers) + { + ret.GiveStatus[effect].Modifiers = {}; + for (let modifier in template.GiveStatus[effect].Modifiers) + { + ret.GiveStatus[effect].Modifiers[modifier] = { + "Paths": template.GiveStatus[effect].Modifiers[modifier].Paths, + "Affects": template.GiveStatus[effect].Modifiers[modifier].Affects + }; + if (template.GiveStatus[effect].Modifiers[modifier].Add) + ret.GiveStatus[effect].Modifiers[modifier].Add = ApplyValueModificationsToEntity(valueModifRoot + "/GiveStatus" + effect + "/Modifiers/" + modifier + "/Add", +(template.GiveStatus[effect].Modifiers[modifier].Add || 0), entity); + if (template.GiveStatus[effect].Modifiers[modifier].Multiply) + ret.GiveStatus[effect].Modifiers[modifier].Multiply = ApplyValueModificationsToEntity(valueModifRoot + "/GiveStatus" + effect + "/Modifiers/" + modifier + "/Multiply", +(template.GiveStatus[effect].Modifiers[modifier].Multiply || 0), entity); + if (template.GiveStatus[effect].Modifiers[modifier].Replace) + ret.GiveStatus[effect].Modifiers[modifier].Replace = template.GiveStatus[effect].Modifiers[modifier].Replace; + } + } + } + } if (template.Bonuses) ret.Bonuses = template.Bonuses;