User:Hadr0: Difference between revisions

From WolfWiki
Jump to navigation Jump to search
Hadr0 (talk | contribs)
No edit summary
Hadr0 (talk | contribs)
Line 19: Line 19:
team time to clear the area. To see it operational /connect shiven.net
team time to clear the area. To see it operational /connect shiven.net


Players are punished by removing health. Lua doesnt support this (yet):<br>
Players are punished by removing health. Allies can go through axis spawn in the first map part.. but only while holding a knife. This is the best i could do to avoid spawncamping. Unfortunately, Lua's function et_ClientCommand(cno, cmd) was not triggered when a client issues "+attack" command. So making a no-fire zone had to be done this way.
et.trap_SendServerCommand(cno, "kill") -- this would show corpses
 
Allies can go through axis spawn in the first map part.. but only while holding a knife.
This is the best i could do to avoid spawncamping. Unfortunately, Lua's function
et_ClientCommand(cno, cmd) was not triggered when a client issues "+attack" command.
So making a no-fire zone had to be done this way.


It currently only supports the Fuel Dump map. But adding more maps should not be hard.
It currently only supports the Fuel Dump map. But adding more maps should not be hard.

Revision as of 15:10, 19 December 2005

http://www.dinotopia.com/hadro.jpg

Profile

Anti Spawn Kill Bot

This bot enforces Shiven spawnkilling rules. It can detect a spawn switch and gives the withdrawing team time to clear the area. To see it operational /connect shiven.net

Players are punished by removing health. Allies can go through axis spawn in the first map part.. but only while holding a knife. This is the best i could do to avoid spawncamping. Unfortunately, Lua's function et_ClientCommand(cno, cmd) was not triggered when a client issues "+attack" command. So making a no-fire zone had to be done this way.

It currently only supports the Fuel Dump map. But adding more maps should not be hard. A useful tool for determining box/sphere coordinates is the Radiant map editor. Decompile the maps .bsp first using q3map2.

skbot.lua code:

-----------------------------------------------------------------------------------------------------
-- Lua Guardian
-- Anti Spawn Kill Bot
-- created by Hadro
-- contact adr7777@hotmail.com
-----------------------------------------------------------------------------------------------------
-- many thanks to the regulars from 'shiven.net ** 24/7 action'
-- for putting up with my genocidal beta tests =)
-----------------------------------------------------------------------------------------------------
-- origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3]
-- checks if a player is in a box with lowest coordinates origin[1,2,3] and highest coordinates endpt[1,2,3]
--
-- (ppos[1] - origin[1])^2 + (ppos[2] - origin[2])^2 + (ppos[3] - origin[3])^2 < radius^2
-- checks if a player is in a sphere with center origin[1,2,3] and radius
-- spheres are not used for the fueldump map
-----------------------------------------------------------------------------------------------------
version    = "1.0"
samplerate = 500 -- bot will check player positions every x milliseconds

function et_RunFrame(levelTime)
  if math.mod(levelTime, samplerate) ~= 0 then return end
  if mapname ~= "fueldump" then return end

  for cno=0, num_cl-1, 1 do
    phealth = et.gentity_get(cno, "health")
    if phealth > 0 then
      msg = nil
      ppos = et.gentity_get(cno,"r.currentOrigin")
      teamnum = et.gentity_get(cno, "sess.sessionTeam")

      if teamnum == 1 then -- if you are Axis:
        if fdspawnswitch == nil then
          -- allied spawn hut
          origin = { -2864, -9376, 64 }
          endpt = { 496, -6192, 1152 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^)wiped out ^3for getting too close to allied spawn"
          end
        elseif spawnfullyswitched == 1 then -- if spawn as switched and delay has passed:
          -- balcony lookout
          origin = { -4968, -2066, 792 }
          endpt = { -4454, -808, 1024 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^)crushed ^3for entering allied spawn"
          end
          -- office & balcony over main door
          origin = { -5752, -3080, 488 }
          endpt = { -5192, -1568, 1024 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^)crushed ^3for entering allied spawn"
          end
          --lower office
          origin = { -5720, -2064, 344 }
          endpt = { -4848, -1272, 1024 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^)crushed ^3for entering allied spawn"
          end
        end
      end -- if axis

      if teamnum == 2 then -- if you are Allies:
        if fdspawnswitch == nil then
          -- dont trickjump over axis facade roof in first map part
          origin = { -9272, -5328, 608 }
          endpt = { -8576, -5028, 792 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^3Please don't do that LAME trickjump now, ^7%s"
          end
          -- knife only in axis spawn region
          if et.gentity_get(cno, "s.weapon") ~= 1 then
            -- balcony lookout
            origin = { -4968, -2066, 792 }
            endpt = { -4454, -808, 1024 }
            if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
              msg = "^7%s^3, you can ONLY pass through axis spawn holding a ^7KNIFE"
            end
            -- office & balcony over main door
            origin = { -5752, -3080, 488 }
            endpt = { -5192, -1568, 1024 }
            if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
              msg = "^7%s^3, you can ONLY pass through axis spawn holding a ^7KNIFE"
            end
            -- lower office
            origin = { -5720, -2064, 344 }
            endpt = { -4848, -1272, 1024 }
            if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
              msg = "^7%s^3, you can ONLY pass through axis spawn holding a ^7KNIFE"
            end
          end
        else -- if spawn switched
          -- axis facade
          origin = { -9424, -5600, 440 }
          endpt = { -8928, -5160, 600 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^5spanked ^3for entering axis upper spawn"
          end
          -- axis rear spawn exit
          origin = { -9240, -7448, 208 }
          endpt = { -8728, -7184, 352 }
          if origin[1] < ppos[1] and ppos[1] < endpt[1] and origin[2] < ppos[2] and ppos[2] < endpt[2] and origin[3] < ppos[3] and ppos[3] < endpt[3] then
            msg = "^7%s ^3was ^)annihilated ^3for entering axis rear spawn"
          end
        end
      end -- if allies
      if msg ~= nil then
        et.gentity_set(cno, "health", -511)
        msg = string.format(msg, et.Info_ValueForKey(et.trap_GetUserinfo(cno), "name"))
        msg = string.format("qsay %s\n", msg)
        et.trap_SendConsoleCommand(et.EXEC_APPEND, msg)
        et.trap_SendServerCommand(cno, "cp \"^1!! DO NOT SPAWNKILL !!\"\n" )
      end
    end -- if health > 0
  end -- for loop

  if fdspawnswitch == 1 and spawnfullyswitched == nil then
    if switchcounter == switchtime then
      spawnfullyswitched = 1
    else
      if switchcounter == 0 then
        et.trap_SendServerCommand(-1, "cpm \"^6Lua^7: allied spawn will be protected in 45 seconds\"\n")
      end
      if switchcounter == switchtime - 1 then
        et.trap_SendServerCommand(-1, "cpm \"^6Lua^7: allied spawn is now protected\"\n")
      end
      switchcounter = switchcounter + 1
    end
  end

end

function et_InitGame(levelTime, randomSeed, restart)
  num_cl = et.trap_Cvar_Get("sv_maxclients")
  mapname = et.trap_Cvar_Get("mapname")
  origin = {}
  endpt = {}
  switchcounter = 0
  switchtime = 45 / samplerate * 1000 -- 45 seconds to spawn protection switch
end

function et_ClientCommand(cno, cmd)
  if cmd ~= "say" then return 0 end
  if string.lower(et.ConcatArgs(1)) ~= "!luatest" then return 0 end
  et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \"^3test for ^6Lua ^7Guardian - Anti Spawn Kill Bot\"\n")
  if mapname == "fueldump" then
    tosend = string.format("qsay \"^3>version ^7%s ^3sampling at ^7%d ^3milliseconds\"\n", version, samplerate)
    et.trap_SendConsoleCommand(et.EXEC_APPEND, tosend)
  else
    tosend = string.format("qsay \"^3>version ^7%s ^3no parameters set for ^7%s ^3map\"\n", version, mapname)
    et.trap_SendConsoleCommand(et.EXEC_APPEND, tosend)
  end
  return 0
end

function et_Print(text)
  if text == "Setting Axis autospawn to Axis Fuel Dump\n" then fdspawnswitch = 1 end
end

Note: typing !luatest in main chat will give the current status of the mod. Any possible future mods will support this.