function gadget:GetInfo() return { name = "Auras", desc = "ZOMG AURAZ", author = "lurker", date = "Feb 12, 2008", license = "GNU GPL, v2 or later", layer = 1, enabled = true -- loaded by default? }endif (gadgetHandler:IsSyncedCode()) thenlocal newcmdid = 35600local auras = {}local default = { emmitterStartCMD = function(aura, unitID) aura.emitterList[unitID] = {enabled = true} end, emmitterStopCMD = function(aura, unitID) end, emmitterStopCMD = function(aura, unitID) aura.emitterList[unitID] = nil end, isEmitter = function(aura, unitID) local unitDefID = Spring.GetUnitDefID(unitID) for _,name in ipairs(aura.emitterDefs.UnitDefNames) do if unitDefID == UnitDefNames[name] then return true end end return false end, command = function(aura, unitID, UnitDefID, teamID, cmdID, cmdParams, cmdOptions) Spring.Echo(aura.emitterList[unitID].state, cmdParams[1]) local cmdDescID = Spring.FindUnitCmdDesc(unitID, cmdID) if (cmdParams[1] == 1) then --check for current state later Spring.Echo('A') aura.emitterList[unitID].state = 1 Spring.EditUnitCmdDesc(unitID, cmdDescID, { params = {'1', 'Aura Off', 'Aura On' } }) Spring.SetUnitRulesParam(unitID, aura.name, 0) else Spring.Echo('B') aura.emitterList[unitID].state = 0 Spring.EditUnitCmdDesc(unitID, cmdDescID, { params = {'0', 'Aura Off', 'Aura On' } }) Spring.SetUnitRulesParam(unitID, aura.name, 1) end end, emitterDefs = { eengineer = { radius = 1000, }, eengineer2 = { radius = 1000, }, tengineer = { radius = 1000, }, tengineer2 = { radius = 1000, }, }, description = 'it\'s an aura', params = {'0', 'Aura Off', 'Aura On' }, RunOnLoad = function(aura, def) for unitName,def in pairs(aura.emitterDefs) do if UnitDefNames[unitName] ~= nil then local id = UnitDefNames[unitName].id aura.emitterDefs[id] = def aura.emitterDefs[unitName] = nil end end if def.hasCommand ~= false then if def.cmdid then aura.cmdid = def.cmdid else newcmdid = newcmdid + 1 aura.cmdid = newcmdid end gadgetHandler:RegisterCMDID(aura.cmdid) aura.cmdDescription = { id = aura.cmdid, type = CMDTYPE.ICON_MODE, name = aura.name, cursor = 'aura', --check if this line is needed action = aura.name, tooltip = aura.description, params = aura.params, } end end,}function gadget:Initialize() local auraDefs = include("LuaRules/Configs/aura_defs.lua") if (not auraDefs) then gadgetHandler:RemoveGadget() return end for defName, def in pairs(auraDefs) do local newAura = {} newAura.name = defName newAura.affectedGameFrame = def.affectedGameFrame newAura.useGlobalAffList = false --not coded yet newAura.storeAffListPerE = def.storeAffListPerE or false if def.useuseGlobalAffList then newAura.affectedStart = def.affectedStart newAura.affectedStop = def.affectedStop newAura.affectedList = {} end newAura.emitterStartCMD = def.emmitterStartCMD or default.emmitterStartCMD newAura.emitterGameFrame= def.emmitterGameFrame or default.emmitterGameFrame newAura.emitterStopCMD = def.emmitterStopCMD or default.emmitterStopCMD newAura.isEmitter = def.isEmitter or default.isEmitter newAura.emitterList = {} newAura.emitterDefs = def.emitterDefs or default.emitterDefs newAura.description = def.description or default.description newAura.params = def.params or default.params newAura.command = def.command or default.command if def.RunOnLoad then def.RunOnLoad(newAura, def) else default.RunOnLoad(newAura, def) end auras[defName] = newAura end for _,unit in ipairs(Spring.GetAllUnits()) do local unitDefID = Spring.GetUnitDefID(unitID) for _, aura in pairs(auras) do if aura.emitterDefs[unitDefID] ~= nil then aura.emitterList[unit].state = ((aura.params[1] == '1') and 0) or 1 if aura.cmdid ~= nil then Spring.InsertUnitCmdDesc(unitID, aura.cmdid, aura.description) Spring.CreateUnitRulesParams(unitID, { { [aura.name] = (aura.params[1] == '1') and 0 or 1} }) end end end endendfunction gadget:Shutdown() --IDILendfunction gadget:UnitCreated(unitID, unitDefID, unitTeam) for _, aura in pairs(auras) do if aura.emitterDefs[unitDefID] ~= nil then aura.emitterList[unitID] = {} aura.emitterList[unitID].state = aura.defaultState if aura.cmdid ~= nil then Spring.InsertUnitCmdDesc(unitID, aura.cmdid, aura.cmdDescription) Spring.CreateUnitRulesParams(unitID, { { [aura.name] = aura.defaultState } }) end end endendfunction gadget:UnitDestroyed(unitID, unitDefID, unitTeam) for _, aura in pairs(auras) do if aura.useGlobalAffList then --it's more complex else aura.emitterList[unitID] = nil end endendfunction gadget:UnitTaken(unitID, unitDefID, unitTeam) for _, aura in pairs(auras) do if aura.useGlobalAffList then --it's more complex else if aura.emitterDefs[unitDefID] ~= nil then aura.emitterList[unitID].state = aura.defaultState if aura.cmdid ~= nil then SetUnitRulesParam(unitID, aura.name, aura.defaultState) end end end endendlocal function AuraGameFrame(aura) if (aura.emitterList == nil) then return end for emitter,edata in pairs(aura.emitterList) do if edata.state ~= 0 then local emitterTeam = Spring.GetUnitAllyTeam(emitter) local emitterDef = aura.emitterDefs[Spring.GetUnitDefID(emitter)] local x, y, z = Spring.GetUnitPosition(emitter) if (x == nil) then return end local localAffected = Spring.GetUnitsInSphere(x, y, z, emitterDef.radius or 1000) if (localAffected == nil) then return end if aura.useGlobalAffList then --merge, etc. else for _,affected in ipairs(localAffected) do if (emitterTeam == Spring.GetUnitAllyTeam(affected)) then aura.affectedGameFrame(aura, affected) end end end if aura.storeAffListPerE then aura.emitterList[emitter].affected = localAffected end end endendfunction gadget:GameFrame(frameNum) for cmdid, aura in pairs(auras) do AuraGameFrame(aura) --possibly abstract later endendfunction gadget:AllowCommand(unitID, unitDefID, teamID, cmdID, cmdParams, cmdOptions) for auraCmdID,aura in pairs(auras) do if cmdID == auraCmdID then if aura.emitterList[emitter] ~= nil then return true --let it pass else return false -- command was used end end end return true -- command was not usedendfunction gadget:CommandFallback(unitID, unitDefID, teamID, cmdID, cmdParams, cmdOptions) for auraCmdID,aura in pairs(auras) do if cmdID == aura.cmdid then if aura.emitterList[unitID] ~= nil then aura.command(aura, unitID, UnitDefID, teamID, cmdID, cmdParams, cmdOptions) return true, true -- command was used, remove it end end end return false -- command was not usedendend