diff --git a/LuaRules/gadgets.lua b/LuaRules/gadgets.lua index 42c2f29464..ef041eef07 100644 --- a/LuaRules/gadgets.lua +++ b/LuaRules/gadgets.lua @@ -138,9 +138,8 @@ local callInLists = { -- Feature CallIns "FeatureCreated", "FeatureDestroyed", - --[[ 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. ]] + "FeaturePreDamaged", + "FeatureDamaged", -- Projectile CallIns "ProjectileCreated", @@ -2034,6 +2033,95 @@ function gadgetHandler:FeatureCreated(featureID, allyTeam) return end +local FeaturePreDamaged_GadgetMap = {} +local FeaturePreDamaged_first = true +local allWeaponDefs = {} + +function gadgetHandler:FeaturePreDamaged(featureID, featureDefID, featureTeam, + damage, 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 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, + data = {g} + } + end + end + end + FeaturePreDamaged_first = false + end + + local rDam = damage + local rImp = 1.0 + + local gadgets = FeaturePreDamaged_GadgetMap[weaponDefID] + if gadgets then + 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, 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")