From e462f008b15b2410ee86f0ed823f893857e28f7d Mon Sep 17 00:00:00 2001 From: Stiofan-K <108685389+Stiofan-K@users.noreply.github.com> Date: Thu, 11 Jun 2026 21:08:13 +0200 Subject: [PATCH 1/3] FeatureDamaged and FeaturePreDamaged --- LuaRules/gadgets.lua | 100 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/LuaRules/gadgets.lua b/LuaRules/gadgets.lua index 42c2f29464..eeb79a0816 100644 --- a/LuaRules/gadgets.lua +++ b/LuaRules/gadgets.lua @@ -138,6 +138,8 @@ local callInLists = { -- Feature CallIns "FeatureCreated", "FeatureDestroyed", + "FeaturePreDamaged", + "FeatureDamaged", --[[ FeatureDamaged and FeaturePreDamaged missing on purpose. Basic damage control can be achieved via armordefs (use the "default" class, make sure to populate the others including "else" explicitly) so this way we avoid the perf cost. ]] @@ -2034,6 +2036,104 @@ function gadgetHandler:FeatureCreated(featureID, allyTeam) return end +local FeaturePreDamaged_GadgetMap = {} +local FeaturePreDamaged_first = true +local allWeaponDefs = {} + +do + for i=-7,#WeaponDefs do + allWeaponDefs[#allWeaponDefs+1] = i + end +end + +function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, + damage, paralyzer, weaponDefID, + projectileID, attackerID, attackerDefID, attackerTeam) + tracy.ZoneBeginN("G:FeaturePreDamaged") + + if FeaturePreDamaged_first then + for _,g in r_ipairs(self.FeaturePreDamagedList) do + tracy.ZoneBeginN("G:FeaturePreDamaged_GetWantedWeaponDef :" .. g.ghInfo.name) + local weaponDefs = (g.FeaturePreDamaged_GetWantedWeaponDef and g:FeatureDamaged_GetWantedWeaponDef()) or allWeaponDefs + tracy.ZoneEnd() + for _,wdid in ipairs(weaponDefs) do + if FeatureDamaged_GadgetMap[wdid] then + FeatureDamaged_GadgetMap[wdid].count = FeaturePreDamaged_GadgetMap[wdid].count + 1 + FeatureDamaged_GadgetMap[wdid].data[FeatureDamaged_GadgetMap[wdid].count] = g + else + FeaturePreDamaged_GadgetMap[wdid] = { + count = 1, + data = {g} + } + end + end + end + FeaturePreDamaged_first = false + end + + local rDam = damage + local rImp = 1.0 + + local gadgets = FeaturePreDamaged_GadgetMap[weaponDefID] + if gadgets then + if gadgetHandler.GG._AddUnitDamage_teamID then + attackerTeam = gadgetHandler.GG._AddUnitDamage_teamID + end + local data = gadgets.data + local g + for i = 1, gadgets.count do + g = data[i] + tracy.ZoneBeginN("G:FeaturePreDamaged:" .. g.ghInfo.name) + local dam, imp = g:FeaturePreDamaged(featureID, featureDefID, featureTeam, + rDam, paralyzer, weaponDefID, + attackerID, attackerDefID, attackerTeam, + projectileID) + tracy.ZoneEnd() + if (dam ~= nil) then + rDam = dam + end + if (imp ~= nil) then + rImp = math.min(imp, rImp) + end + end + end + + tracy.ZoneEnd() + return rDam, rImp +end + +local FeatureDamaged_first = true +local FeatureDamaged_count = 0 +local FeatureDamaged_gadgets = {} + +function gadgetHandler:FeatureDamaged(featureID, featureDefID, featureTeam, damage, weaponDefID, + projectileID, attackerID, attackerDefID, attackerTeam) + tracy.ZoneBeginN("G:FeatureDamaged") + + if FeatureDamaged_first then + for _,g in r_ipairs(self.FeatureDamagedList) do + FeatureDamaged_count = FeatureDamaged_count + 1 + FeatureDamaged_gadgets[FeatureDamaged_count] = g + end + FeatureDamaged_first = false + end + + if gadgetHandler.GG._AddUnitDamage_teamID then + attackerTeam = gadgetHandler.GG._AddUnitDamage_teamID + end + + local g + for i = 1, FeatureDamaged_count do + g = FeatureDamaged_gadgets[i] + tracy.ZoneBeginN("G:FeatureDamaged:" .. g.ghInfo.name) + g:FeatureDamaged(featureID, featureDefID, featureTeam, damage, weaponDefID, + projectileID, attackerID, attackerDefID, attackerTeam) + tracy.ZoneEnd() + end + tracy.ZoneEnd() + return +end + function gadgetHandler:FeatureDestroyed(featureID, allyTeam) tracy.ZoneBeginN("G:FeatureDestroyed") From 4aeef1b32177bb2c2606eeda5e31ee0be59e5c09 Mon Sep 17 00:00:00 2001 From: Stiofan-K <108685389+Stiofan-K@users.noreply.github.com> Date: Fri, 12 Jun 2026 19:11:25 +0200 Subject: [PATCH 2/3] FeaturePreDamaged adjustments --- LuaRules/gadgets.lua | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/LuaRules/gadgets.lua b/LuaRules/gadgets.lua index eeb79a0816..ef041eef07 100644 --- a/LuaRules/gadgets.lua +++ b/LuaRules/gadgets.lua @@ -140,9 +140,6 @@ local callInLists = { "FeatureDestroyed", "FeaturePreDamaged", "FeatureDamaged", - --[[ FeatureDamaged and FeaturePreDamaged missing on purpose. Basic damage control - can be achieved via armordefs (use the "default" class, make sure to populate - the others including "else" explicitly) so this way we avoid the perf cost. ]] -- Projectile CallIns "ProjectileCreated", @@ -2040,14 +2037,8 @@ local FeaturePreDamaged_GadgetMap = {} local FeaturePreDamaged_first = true local allWeaponDefs = {} -do - for i=-7,#WeaponDefs do - allWeaponDefs[#allWeaponDefs+1] = i - end -end - function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, - damage, paralyzer, weaponDefID, + damage, weaponDefID, projectileID, attackerID, attackerDefID, attackerTeam) tracy.ZoneBeginN("G:FeaturePreDamaged") @@ -2057,9 +2048,9 @@ function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, local weaponDefs = (g.FeaturePreDamaged_GetWantedWeaponDef and g:FeatureDamaged_GetWantedWeaponDef()) or allWeaponDefs tracy.ZoneEnd() for _,wdid in ipairs(weaponDefs) do - if FeatureDamaged_GadgetMap[wdid] then - FeatureDamaged_GadgetMap[wdid].count = FeaturePreDamaged_GadgetMap[wdid].count + 1 - FeatureDamaged_GadgetMap[wdid].data[FeatureDamaged_GadgetMap[wdid].count] = g + if FeaturePreDamaged_GadgetMap[wdid] then + FeaturePreDamaged_GadgetMap[wdid].count = FeaturePreDamaged_GadgetMap[wdid].count + 1 + FeaturePreDamaged_GadgetMap[wdid].data[FeaturePreDamaged_GadgetMap[wdid].count] = g else FeaturePreDamaged_GadgetMap[wdid] = { count = 1, @@ -2076,16 +2067,13 @@ function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, local gadgets = FeaturePreDamaged_GadgetMap[weaponDefID] if gadgets then - if gadgetHandler.GG._AddUnitDamage_teamID then - attackerTeam = gadgetHandler.GG._AddUnitDamage_teamID - end local data = gadgets.data local g for i = 1, gadgets.count do g = data[i] tracy.ZoneBeginN("G:FeaturePreDamaged:" .. g.ghInfo.name) local dam, imp = g:FeaturePreDamaged(featureID, featureDefID, featureTeam, - rDam, paralyzer, weaponDefID, + rDam, weaponDefID, attackerID, attackerDefID, attackerTeam, projectileID) tracy.ZoneEnd() From 6e66fea0facd24dbe2983702bf0de598348d34ea Mon Sep 17 00:00:00 2001 From: sprunk Date: Tue, 23 Jun 2026 11:10:14 +0200 Subject: [PATCH 3/3] Fix issues with the FeaturePreDamaged PR --- LuaRules/gadgets.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LuaRules/gadgets.lua b/LuaRules/gadgets.lua index ef041eef07..0f0723f96f 100644 --- a/LuaRules/gadgets.lua +++ b/LuaRules/gadgets.lua @@ -2035,7 +2035,6 @@ end local FeaturePreDamaged_GadgetMap = {} local FeaturePreDamaged_first = true -local allWeaponDefs = {} function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, damage, weaponDefID, @@ -2045,7 +2044,7 @@ function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, if FeaturePreDamaged_first then for _,g in r_ipairs(self.FeaturePreDamagedList) do tracy.ZoneBeginN("G:FeaturePreDamaged_GetWantedWeaponDef :" .. g.ghInfo.name) - local weaponDefs = (g.FeaturePreDamaged_GetWantedWeaponDef and g:FeatureDamaged_GetWantedWeaponDef()) or allWeaponDefs + local weaponDefs = (g.FeaturePreDamaged_GetWantedWeaponDef and g:FeaturePreDamaged_GetWantedWeaponDef()) or allWeaponDefs tracy.ZoneEnd() for _,wdid in ipairs(weaponDefs) do if FeaturePreDamaged_GadgetMap[wdid] then