1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--
-- file: unit_immobile_buider.lua
-- brief: sets immobile builders to ROAMING, and gives them a PATROL order
-- author: Dave Rodgers
--
-- Copyright (C) 2007.
-- Licensed under the terms of the GNU GPL, v2 or later.
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function widget:GetInfo()
return {
name = "ImmobileBuilder",
desc = "Sets immobile builders to ROAM, with a PATROL command",
author = "trepan",
date = "Jan 8, 2007",
license = "GNU GPL, v2 or later",
layer = 0,
enabled = true -- loaded by default?
}
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Automatically generated local definitions
local CMD_MOVE_STATE = CMD.MOVE_STATE
local CMD_PATROL = CMD.PATROL
local CMD_STOP = CMD.STOP
local spGetGameFrame = Spring.GetGameFrame
local spGetMyTeamID = Spring.GetMyTeamID
local spGetTeamUnits = Spring.GetTeamUnits
local spGetUnitCommands = Spring.GetUnitCommands
local spGetUnitDefID = Spring.GetUnitDefID
local spGetUnitPosition = Spring.GetUnitPosition
local spGiveOrderToUnit = Spring.GiveOrderToUnit
local hmsx = Game.mapSizeX/2
local hmsz = Game.mapSizeZ/2
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- if this is >0, then commands are re-issued for immobile
-- builders that have been idling for the number of game frames
-- (in case a player accidentally STOPs them)
local idleFrames = 30
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function IsImmobileBuilder(ud)
return(ud and ud.builder and not ud.canMove
and not ud.isFactory)
end
local function SetupUnit(unitID)
-- set immobile builders (nanotowers?) to the ROAM movestate,
-- and give them a PATROL order (does not matter where, afaict)
local ret = false
local x, y, z = spGetUnitPosition(unitID)
if (x) then
ret = spGiveOrderToUnit(unitID, CMD_MOVE_STATE, { 2 }, {})
if (x > hmsx) then -- avoid to issue commands outside map
x = x - 25
else
x = x + 25
end
if (z > hmsz) then
z = z - 25
else
z = z + 25
end
ret = spGiveOrderToUnit(unitID, CMD_PATROL, { x, y, z }, {}) and ret
end
return ret
end
function widget:Initialize()
for _,unitID in ipairs(spGetTeamUnits(spGetMyTeamID())) do
local unitDefID = spGetUnitDefID(unitID)
if (IsImmobileBuilder(UnitDefs[unitDefID])) then
SetupUnit(unitID)
end
end
end
function widget:UnitCreated(unitID, unitDefID, unitTeam)
if (unitTeam ~= spGetMyTeamID()) then
return
end
if (IsImmobileBuilder(UnitDefs[unitDefID])) then
SetupUnit(unitID)
end
end
function widget:UnitGiven(unitID, unitDefID, unitTeam)
widget:UnitCreated(unitID, unitDefID, unitTeam)
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
if (idleFrames > 0) then
local idlers = {}
function widget:GameFrame(frame)
for unitID, f in pairs(idlers) do
local idler = idlers[k]
if ((frame - f) > idleFrames) then
local cmds = spGetUnitCommands(unitID)
if (cmds and (#cmds <= 0)) then
if SetupUnit(unitID) then
idlers[unitID] = frame -- safeguard against command spam
else
idlers[unitID] = nil -- the unit could not be set up, don't retry
end
else
idlers[unitID] = nil
end
end
end
end
function widget:UnitDestroyed(unitID, unitDefID, unitTeam)
idlers[unitID] = nil
end
function widget:UnitIdle(unitID, unitDefID, unitTeam)
if (unitTeam ~= spGetMyTeamID()) then
return
end
if (IsImmobileBuilder(UnitDefs[unitDefID])) then
idlers[unitID] = spGetGameFrame()
end
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
|