All pastes #636309 Raw Edit

Untitled

public lua v1 · immutable
#636309 ·published 2007-07-27 19:55 UTC
rendered paste body
----------------------------------------------------------------------------------------------------------------------------------------------------------------function gadget:GetInfo()  return {    name      = "Antigravity Upgrades",    desc      = "Not sure what the point is yet :P",    author    = "quantum",    date      = "Jul 24, 2007",    license   = "GNU GPL, v2 or later",    layer     = 0,    enabled   = true  --  loaded by default?  }end----------------------------------------------------------------------------------------------------------------------------------------------------------------if (gadgetHandler:IsSyncedCode()) then----------------------------------------------------------------------------------  SYNCED----------------------------------------------------------------------------------Speed-upslocal GetUnitPosition     = Spring.GetUnitPositionlocal GetUnitsInCylinder  = Spring.GetUnitsInCylinderlocal GetUnitVelocity     = Spring.GetUnitVelocitylocal GetUnitHealth       = Spring.GetUnitHealthlocal GetAllUnits         = Spring.GetAllUnitslocal GetUnitTeam         = Spring.GetUnitTeamlocal SetUnitHealth       = Spring.SetUnitHealthlocal DestroyUnit         = Spring.DestroyUnitlocal EditUnitCmdDesc     = Spring.EditUnitCmdDesclocal RemoveUnitCmdDesc   = Spring.RemoveUnitCmdDesclocal InsertUnitCmdDesc   = Spring.InsertUnitCmdDesclocal FindUnitCmdDesc     = Spring.FindUnitCmdDesclocal UseTeamResource     = Spring.UseTeamResourcelocal SetVelocity         = Spring.MoveCtrl.SetVelocitylocal SetRotationVelocity = Spring.MoveCtrl.SetRotationVelocitylocal SetGravity          = Spring.MoveCtrl.SetGravitylocal Enable              = Spring.MoveCtrl.Enablelocal SetLeaveTracks      = Spring.MoveCtrl.SetLeaveTrackslocal Disable             = Spring.MoveCtrl.Disablelocal SetCollideStop      = Spring.MoveCtrl.SetCollideStoplocal SetTrackGround      = Spring.MoveCtrl.SetTrackGround----------------------------------------------------------------------------------------------------------------------------------------------------------------local commDefs = {  [ UnitDefNames['armcom'].id ] = true,  [ UnitDefNames['corcom'].id ] = true,}local isComm         = {}--antigrav fieldlocal isUpgraded       = {}local isControlled     = {}local isFalling       = {}local confirm          = {}local range            = 300local damageMult       = 200local CMD_U_ANTIGRAV   = 32201local uAntiGravTooltip = [[Upgrade: Antigravity Upgrades your Commander with antigravity generators.Energy Cost: 20k]]local uAntigravCmdDesc = {  id      = CMD_U_ANTIGRAV,  type    = CMDTYPE.ICON,  name    = "Upgrade",  cursor  = 'normal',  action  = 'u_antigrav',  tooltip = uAntiGravTooltip,}----------------------------------------------------------------------------------------------------------------------------------------------------------------local function Lift(unitID)  local rx, ry, rz = 0.005, 0.025, 0.025  --local vx, vy, vz = 0, 1, 0  print("Lift", unitID)  Enable(unitID)                 --take control  SetGravity(unitID, -0.1)  --SetVelocity(unitID, vx, vy, vz)  SetRotationVelocity(unitID, rx, ry, rz)    SetLeaveTracks(unitID, false)endlocal function Drop(unitID)  isFalling[unitID] = {}   print("Drop", unitID)  SetGravity(unitID, 1)  SetCollideStop(unitID, true)  SetTrackGround(unitID, true)endlocal function GetUnitsNearUnit(unitID, proximity)  local cx, cy, cz = GetUnitPosition(unitID)  local isNearArray = GetUnitsInCylinder(cx, cz, proximity)  local isNearTable = {}  for _, nearUnitID in ipairs(isNearArray) do    if (not isComm[nearUnitID]) then      isNearTable[nearUnitID] = true    end  end  return isNearTableend local function Difference(a, b)     --   c = a - b  local c = {}  for k, _ in pairs(a) do    if (not b[k]) then      c[k] = true    end  end  return cend local function DamageUnit(unitID)  local damage = isFalling[unitID][2]*damageMult  print("damage", damage)  local oldHealth, maxHealth = GetUnitHealth(unitID)  print("oldHealth", oldHealth)  print("maxHealth", maxHealth)  local newHealth = oldHealth + damage  print("newHealth", newHealth)  if (newHealth < 0) then    print("destroy")    DestroyUnit(unitID, true)  else    SetUnitHealth(unitID, newHealth)  end  Disable(unitID)  isControlled[unitID] = nil  isFalling[unitID] = nilendlocal function AddUAntigravCmdDesc(unitID)  if (not FindUnitCmdDesc(unitID, CMD_U_ANTIGRAV)) then    local insertID =       FindUnitCmdDesc(unitID, CMD.CLOAK)      or      FindUnitCmdDesc(unitID, CMD.ONOFF)      or      FindUnitCmdDesc(unitID, CMD.TRAJECTORY) or      FindUnitCmdDesc(unitID, CMD.REPEAT)     or      FindUnitCmdDesc(unitID, CMD.MOVE_STATE) or      FindUnitCmdDesc(unitID, CMD.FIRE_STATE) or      123456 -- back of the pack    InsertUnitCmdDesc(unitID, insertID + 1, uAntigravCmdDesc)  endendlocal function Upgrade(unitID, teamID)  local cmdDescID = FindUnitCmdDesc(unitID, CMD_U_ANTIGRAV)  if (not confirm[unitID]) then    EditUnitCmdDesc(unitID, cmdDescID, {      tooltip = "Confirm antigravity upgrade",      name    = "Confirm"    })    confirm[unitID] = true  else    if (not UseTeamResource(teamID, {e = 20000})) then      EditUnitCmdDesc(unitID, cmdDescID, {        tooltip = "uAntiGravTooltip",        name    = "Upgrade"      })      return    end    isUpgraded[unitID] = true    RemoveUnitCmdDesc(unitID, cmdDescID)    confirm[unitID] = nil  end  end     ----------------------------------------------------------------------------------------------------------------------------------------------------------------function gadget:Initialize()  gadgetHandler:RegisterCMDID(CMD_U_ANTIGRAV)    for _, unitID in ipairs(GetAllUnits()) do    local teamID = GetUnitTeam(unitID)    local unitDefID = GetUnitDefID(unitID)    gadget:UnitCreated(unitID, unitDefID, teamID)  endendfunction gadget:Shutdown()  for _, unitID in ipairs(GetAllUnits()) do    local cmdDescID = FindUnitCmdDesc(unitID, CMD_RETREAT)    if (cmdDescID) then      RemoveUnitCmdDesc(unitID, cmdDescID)    end  endendfunction gadget:UnitCreated(unitID, unitDefID)  print("unit created", unitID)  for comDefID, _ in pairs(commDefs) do    if (comDefID == unitDefID) then      isComm[unitID] = true      isControlled[unitID] = {}      AddUAntigravCmdDesc(unitID)    end  endendfunction gadget:UnitDestroyed(unitID)  isComm[unitID]       = nil  isControlled[unitID] = nil  isFalling[unitID]   = nil  isUpgraded[unitID]   = nilendfunction gadget:AllowCommand(unitID, unitDefID, teamID, cmdID, cmdParams)  if (cmdID ~= CMD_U_ANTIGRAV) then    return true  end  Upgrade(unitID, teamID)    return falseend function gadget:GameFrame(n)  if ((n % 34) < 0.1) then    for commID, _ in pairs(isUpgraded) do      local isInRange = GetUnitsNearUnit(commID, range)      local entered   = Difference(isInRange, isControlled[commID])      local left      = Difference(isControlled[commID], isInRange)      for unitID, _ in pairs(entered) do        isControlled[commID][unitID] = true        Lift(unitID)      end      for unitID, _ in pairs(left) do        if (not isFalling[unitID]) then          Drop(unitID)        end      end    end  end  for unitID, velocity in pairs(isFalling) do    local vx, vy, vz = GetUnitVelocity(unitID)    if (((vx == 0) and (vy == 0) and (vz == 0)) and   --stationary        ((velocity[2] or 1) < 0)) then                 --was moving downwards      DamageUnit(unitID)    else      isFalling[unitID] = {vx, vy, vz}    end  endend ----------------------------------------------------------------------------------  UNSYNCED--------------------------------------------------------------------------------end ----------------------------------------------------------------------------------------------------------------------------------------------------------------