All pastes #2128798 Raw Edit

Stuff

public text v1 · immutable
#2128798 ·published 2012-03-16 14:25 UTC
rendered paste body
function gadget:GetInfo()
  return {
    name      = "Hacky unreached Command workaround",
    desc      = "Set smaller move goal for builder commands",
    author    = "Pako",
    date      = "15 March 2012",
    license   = "GNU GPL, v2 or later",
    layer     = 0,
    enabled   = true
  }
end


-- pako IS AWESOME:
-- SEND DOUBLE WAIT command to ALL cons that dont have an empty queu

-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------

if (not gadgetHandler:IsSyncedCode()) then
    return
end
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
local CMD_RECLAIM = CMD.RECLAIM
local CMD_RESURRECT = CMD.RESURRECT
local CMD_REPAIR = CMD.REPAIR
local CMD_WAIT = CMD.WAIT

local builders = {}
local numbuilders=0
function gadget:UnitCreated(unitID, unitDefID, unitTeam, builderID)
  if unitDefID and tonumber(UnitDefs[unitDefID].buildSpeed) and UnitDefs[unitDefID].buildSpeed > 0  and tonumber(UnitDefs[unitDefID].speed) and UnitDefs[unitDefID].speed>0 then
	--Spring.Echo(UnitDefs[unitDefID].name .. " added to table id:" .. tostring(unitID))
	table.insert(builders, 1, unitID)
	--builders[unitID] = true
	numbuilders = numbuilders+1
  else
    builders[unitID] = nil
	--Spring.Echo(UnitDefs[unitDefID].name .. " is not a builder")
  end
end

function gadget:UnitDestroyed(unitID, unitDefID, unitTeam)
	if unitDefID and tonumber(UnitDefs[unitDefID].buildSpeed) and UnitDefs[unitDefID].buildSpeed > 0  and tonumber(UnitDefs[unitDefID].speed) and UnitDefs[unitDefID].speed>0 then
		table.remove(builders, unitID)
		numbuilders = numbuilders-1
		--Spring.Echo(UnitDefs[unitDefID].name .. " removed from table")
	end
end

--buildDistance
function gadget:GameFrame(f)
	local framemod=f%37
	for b,unitID in ipairs(builders) do
		if unitID%37 == framemod then -- only wait wait each unit every 37 frames, only if they actually have commands, this also staggers the command sending so it doesnt all happen in 1 frame

			if Spring.ValidUnitID(unitID) and Spring.GetUnitCommands(unitID) and #Spring.GetUnitCommands(unitID) >0 then 
				Spring.GiveOrderToUnit(unitID,CMD_WAIT,{},{})
				Spring.GiveOrderToUnit(unitID,CMD_WAIT,{},{})
			end
		end
		
	end
end