Added a small change to a snippet I've taken from FAF's Unit.lua to allow a shielded unit to build silo ammo when keeping accurate build costs. The below script is running within a single unit only, so this isnt hook'd into the whole game.
UpdateConsumptionValues = function(self)
local energy_rate = 0
local mass_rate = 0
if self.ActiveConsumption then
local focus = self:GetFocusUnit()
local time = 1
local mass = 0
local energy = 0
local targetData
local baseData
local repairRatio = 0.75
if focus then -- Always inherit work status of focus
self:InheritWork(focus)
end
if self.WorkItem then -- Enhancement
targetData = self.WorkItem
elseif focus then -- Handling upgrades
if self:IsUnitState('Upgrading') then
baseData = self.Blueprint.Economy -- Upgrading myself, subtract ev. baseCost
elseif focus.originalBuilder and not focus.originalBuilder.Dead and focus.originalBuilder:IsUnitState('Upgrading') and focus.originalBuilder:GetFocusUnit() == focus then
baseData = focus.originalBuilder:GetBlueprint().Economy
end
if baseData then
targetData = focus:GetBlueprint().Economy
end
end
if targetData then -- Upgrade/enhancement
time, energy, mass = Game.GetConstructEconomyModel(self, targetData, baseData)
elseif focus then -- Building/repairing something
if focus:IsUnitState('SiloBuildingAmmo') then
local siloBuildRate = focus:GetBuildRate() or 1
time, energy, mass = focus:GetBuildCosts(focus.SiloProjectile)
energy = ( (energy / siloBuildRate) * (self:GetBuildRate() or 0) ) + focus:GetConsumptionPerSecondEnergy()
mass = ( (mass / siloBuildRate) * (self:GetBuildRate() or 0) ) + focus:GetConsumptionPerSecondMass()
else
time, energy, mass = self:GetBuildCosts(focus:GetBlueprint())
if self:IsUnitState('Repairing') and focus.isFinishedUnit then
energy = energy * repairRatio
mass = mass * repairRatio
end
end
end
energy = math.max(0, energy * (self.EnergyBuildAdjMod or 1))
mass = math.max(0, mass * (self.MassBuildAdjMod or 1))
energy_rate = energy / time
mass_rate = mass / time
end
local myBlueprint = self.Blueprint
if self.MaintenanceConsumption then
local mai_energy = (self.EnergyMaintenanceConsumptionOverride or myBlueprint.Economy.MaintenanceConsumptionPerSecondEnergy) or 0
local mai_mass = myBlueprint.Economy.MaintenanceConsumptionPerSecondMass or 0
-- Apply economic bonuses
mai_energy = mai_energy * (100 + (self.EnergyModifier or 0)) * (self.EnergyMaintAdjMod or 1) * 0.01
mai_mass = mai_mass * (100 + (self.MassModifier or 0)) * (self.MassMaintAdjMod or 1) * 0.01
energy_rate = energy_rate + mai_energy
mass_rate = mass_rate + mai_mass
end
-- Apply minimum rates
energy_rate = math.max(energy_rate, myBlueprint.Economy.MinConsumptionPerSecondEnergy or 0)
mass_rate = math.max(mass_rate, myBlueprint.Economy.MinConsumptionPerSecondMass or 0)
self:SetConsumptionPerSecondEnergy(energy_rate)
self:SetConsumptionPerSecondMass(mass_rate)
self:SetConsumptionActive(energy_rate > 0 or mass_rate > 0)
end,
This is just a quick fix and is by no means perfect... Will mess with this more as time allows.