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
|
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--
-- file: unit_factory_guard.lua
-- brief: assigns new builder units to guard their source factory
-- author: Dave Rodgers
--
-- Copyright (C) 2007.
-- Licensed under the terms of the GNU GPL, v2 or later.
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function widget:GetInfo()
return {
name = "FactoryGuard",
desc = "Assigns new builders to assist their source factory",
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_GUARD = CMD.GUARD
local CMD_MOVE = CMD.MOVE
local spGetMyTeamID = Spring.GetMyTeamID
local spGetUnitBuildFacing = Spring.GetUnitBuildFacing
local spGetUnitGroup = Spring.GetUnitGroup
local spGetUnitPosition = Spring.GetUnitPosition
local spGetUnitRadius = Spring.GetUnitRadius
local spGiveOrderToUnit = Spring.GiveOrderToUnit
local spSetUnitGroup = Spring.SetUnitGroup
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function ClearGroup(unitID, factID)
-- clear the unit's group if it's the same as the factory's
local unitGroup = spGetUnitGroup(unitID)
if (not unitGroup) then
return
end
local factGroup = spGetUnitGroup(factID)
if (not factGroup) then
return
end
if (unitGroup == factGroup) then
spSetUnitGroup(unitID, -1)
end
end
local function GuardFactory(unitID, unitDefID, factID, factDefID)
-- is this a factory?
local fd = UnitDefs[factDefID]
if (not (fd and fd.isFactory)) then
return
end
-- can this unit assist?
local ud = UnitDefs[unitDefID]
if (not (ud and ud.builder and ud.canAssist)) then
return
end
local x, y, z = spGetUnitPosition(factID)
if (not x) then
return
end
local radius = spGetUnitRadius(factID)
if (not radius) then
return
end
local dist = radius * 2
local facing = spGetUnitBuildFacing(factID)
if (not facing) then
return
end
-- facing values { S = 0, E = 1, N = 2, W = 3 }
local dx, dz -- down vector
local rx, rz -- right vector
if (facing == 0) then
-- south
dx, dz = 0, dist
rx, rz = dist, 0
elseif (facing == 1) then
-- east
dx, dz = dist, 0
rx, rz = 0, -dist
elseif (facing == 2) then
-- north
dx, dz = 0, -dist
rx, rz = -dist, 0
else
-- west
dx, dz = -dist, 0
rx, rz = 0, dist
end
local OrderUnit = spGiveOrderToUnit
OrderUnit(unitID, CMD_MOVE, { x + dx, y, z + dz }, { "" })
OrderUnit(unitID, CMD_MOVE, { x + rx, y, z + rz }, { "shift" })
OrderUnit(unitID, CMD_GUARD, { factID }, { "shift" })
end
--------------------------------------------------------------------------------
function widget:UnitFromFactory(unitID, unitDefID, unitTeam,
factID, factDefID, userOrders)
if (unitTeam ~= spGetMyTeamID()) then
return -- not my unit
end
ClearGroup(unitID, factID)
if (userOrders) then
return -- already has user assigned orders
end
GuardFactory(unitID, unitDefID, factID, factDefID)
end
--------------------------------------------------------------------------------
|