Public feed
#890789
----------------------------------------------------------------------------------------------------------------------------------------------------------------function gadget:GetInfo() return { name = "Ammo Limiter", desc = "Gives each unit a personal 'ammo' storage that it draws from to fire, when empty it fires much more slowly", author = "Quantum, screwed up horribly by Nemo", date = "Feb 01, 2007", license = "CC attribution-noncommerical 3.0 or later", layer = 0, enabled = true -- loaded by default? }end ------------------------------------------------------------------------------------------------------------------------------------------------------------------[[a note on the customParams (custom FBI tags) used by this script:maxAmmo=the total ammo capacity of this unit;ammoSupplier=boolean; //is this a ammo supplying unit?supplyRange=x; //how far this supply unit can supply (at this distance ammoRegen is default)ammoWarningLevel=0-1; the level (% of total ammo) when this unit displays some kind of "low ammo" graphicweaponswithammo; // Number of weapons that use ammo. Must be the first ones. Default is 2.------TODO:implement trucks and halftracks and such somehowvisuals (low ammo graphic, supply range graphic, ect)make more customizable/flexible (custom params for ammoPenalty, multi-weapon support, ]]----and here we go----------------------------------------------------------------------------------------------------------------------------------------------------------------local SetWeaponState = Spring.SetWeaponStatelocal GetWeaponState = Spring.GetWeaponStatelocal GetUnitsInCylinder = Spring.GetUnitsInCylinderlocal GetUnitPosition = Spring.GetUnitPositionlocal GetUnitSeparation = Spring.GetUnitSeparation----------------------------------------------------------------------------------------------------------------------------------------------------------------local vehicles = {}local ammoSuppliers = {}--what reload time is multiplied by when the unit runs out of ammolocal ammoPenalty = 1.5----------------------------------------------------------------------------------------------------------------------------------------------------------------local function AmmoRegen(defaultRegen, supplyRange, nearestDepotDistance) return ((0-1)*(defaultRegen/supplyRange)*nearestDepotDistance + defaultRegen)endlocal function DefaultRegen(unitID) local reload = UnitDefs[unitID].weapons[1].reload return 2/reloadendlocal function CheckReload(unitID, reloadFrame, weaponNum) local oldReloadFrame = vehicles[unitID].reloadFrame[weaponNum] if (oldReloadFrame == reloadFrame or not reloadFrame ) then return false else vehicles[unitID].reloadFrame[weaponNum] = reloadFrame return true endendlocal function ProcessWeapon(unitID, weaponNum) local _, _, reloadFrame = GetUnitWeaponState(unitID, weaponNum) local ammoLevel = vehicles[unitID].ammoLevel local reload = WeaponDefs[weaponID].reload local weaponID = UnitDefs[unitID].weapons[weaponNum].weaponDef if (CheckReload(unitID, reloadFrame, weaponNum)) then if (ammoLevel > 0) then vehicles[unitID].ammoLevel = ammoLevel - 1 end end if (ammoLevel < 1) then SetUnitWeaponStates(unitID, weaponNum, {reloadtime = ammoPenalty * reload}) else SetUnitWeaponStates(unitID, weaponNum, {reloadtime = reload}) end endlocal function FindSupplier(vehicleID) local closestSupplier local closestDistance = math.huge for supplierID in pairs(ammoSuppliers) do local separation = GetUnitSeparation(vehicleID, supplierID, true) if (separation < closestDistance) then closestSupplier = supplierID closestDistance = separation end end return closestSupplier, closestDistanceendlocal function Resupply(unitID) local supplierID, distanceFromSupplier = FindSupplier(unitID) if (not supplierID) then return end local supplyRange = UnitDefs[supplierID].customParams.supplyRange local maxAmmo = UniDefs[unitID].customParams.maxAmmo local defaultRegen = DefaultRegen(unitID) local ammoRegen = AmmoRegen(defaultRegen, supplyRange, nearestDepotDistance) local oldAmmo = vehicles[unitID].ammoLevel local newAmmo = oldAmmo + ammoRegen if (newAmmo > maxAmmo) then newAmmo = maxAmmo end vehicles[unitID].ammoLevel = newAmmo end ----------------------------------------------------------------------------------------------------------------------------------------------------------------function gadget:UnitCreated(unitID, unitDefID, unitTeam, builderID) local ud = UnitDefs[unitDefID] if (string.find(ud.moveData.name, "TANK")) then vehicles[unitID] = { ammoLevel = UnitDefs[unitID].customParams.maxammo, weaponsWithAmmo = UnitDefs[unitID].customParams.weaponswithammo, } end if (ud.customParams.ammoSupplier == 1) then ammoSuppliers[unitID] = true endendfunction gadget:UnitDestroyed(unitID) -- you can omit unneeded arguments if they vehicles[unitID] = nil -- are at the end ammoSuppliers[unitID] = nilendfunction gadget:GameFrame(n) if ((n+3 % 30*2) > 0.01) then return end for unitID in pairs(vehicles) do local weaponsWithAmmo = vehciles[unitID].weaponsWithAmmo or 2 for weaponNumber=1, weaponsWithAmmo do ProcessWeapon(unitID, weaponNum) end Resupply(unitID) endend----------------------------------------------------------------------------------------------------------------------------------------------------------------