Advertisement
HR_Shaft

Gun-Game v2 for H3 Foundry for Phasor v2+

Jan 9th, 2015
267
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 65.40 KB | None | 0 0
  1. --[[ ### Gun-Game v2 for H3 Foundry ###]]--
  2. --[[ ### by H® Shaft for Phasor v2  ###]]--
  3.  
  4. -- Script designed specifically and only for the Halo CE map H3 Foundry: Link: http://hce.halomaps.org/index.cfm?fid=6677
  5. -- GUN GAME: Based on the Counter Strike game called 'Gun Game.' Also, derivatives known as 'Global Offensive' & 'Arsenal: Arms Race'
  6.  
  7. -- Each time you kill with a weapon, you will be given a new weapon. (oddball and flag excluded weapons)
  8. -- The first person to kill with each weapon in the game - wins!
  9. -- There are 10 weapons. Starting with Plasma Pistol and ending with Sniper Rifle. All weapons have infinite ammo.
  10. -- When you kill another player, you will only advance if you survive the kill.  If you die during the kill, you don't advance.
  11. -- Other weapons, grenades & powerups are blocked.  Vehicle gun and collision damage are blocked.
  12. -- Melee is instant kill, and WILL advance your level.
  13. -- If you are on level 11, and get killed by another player, betray or suicide, you go down one level.
  14. -- Health bonus applied to players when reaching levels 4 and 8 or when any other player reaches level 11.
  15. -- Beserk Mode: When reaching level 11, you activate 'Beserk Mode' which temporarily speeds up all other players and heals the injured.
  16. -- Your player speed is based on your weapon: With a strong weapon, you move slower than you will with a weaker weapon.
  17.  
  18. -- edit --
  19. logging = false             -- | true enable full script game logging, false to disable and on function ScriptLoad() - can be spammy to the log, best used for tournaments/scrims/debugging
  20. -- don't edit --
  21. team_play = false
  22. map_reset = false
  23. showtargets = nil
  24. roaming_targets = true
  25. weapons = {}
  26. level = {}
  27. last_damage = {}
  28. team_change = {}
  29. mybattery = {}
  30. meleekills = {}
  31. playerscore = {}
  32. teamscore = {}
  33. spiker_clip = 40
  34. brifle_clip = 36
  35. brute_clip = 6
  36. needler_clip = 40
  37. shotgun_clip = 12
  38. assault_clip = 32
  39. pistol_clip = 12
  40. rocket_clip = 2
  41. sniper_clip = 4
  42. battery = 0
  43. timerCount = 0
  44. to_win = 1000
  45. cur_players = 0
  46.  
  47.  
  48. -- prefix globals
  49. default_script_prefix = "\171GunGame\187  "
  50. phasor_privatesay = privatesay
  51. phasor_say = say
  52.  
  53. function GetRequiredVersion()
  54.     return 200
  55. end
  56.  
  57. function OnScriptLoad(process, game, persistent)
  58.     GAME = game
  59.     GetGameAddresses(game)
  60.     processid = process
  61.     Persistent = persistent
  62.     ScriptLoad()
  63.     LoadTags()
  64. end
  65.  
  66. function OnScriptUnload()
  67.     writedword(ctf_score_patch, 0xFFFDE9E8)
  68.     writebyte(ctf_score_patch1, 0xFF)
  69.     writebyte(slayer_score_patch, 0x74)
  70.     writebyte(slayer_score_patch2, 0x75)
  71. end
  72.  
  73. function OnNewGame(map)
  74.     ScriptLoad()   
  75.     team_play = getteamplay()
  76.     gametype = readbyte(gametype_base + 0x30)
  77.     game_started = false
  78.     LoadTags()
  79.  
  80.     if not new_game_timer then
  81.         new_game_timer = registertimer(0, "NewGameTimer")
  82.     end
  83. end
  84.  
  85. function ApplyPatches()
  86.     writedword(ctf_score_patch, 0x90909090)
  87.     writebyte(ctf_score_patch1, 0x90)
  88.     writebyte(slayer_score_patch, 0xEB)
  89.     writebyte(slayer_score_patch2, 0xEB)   
  90. end
  91.  
  92. function ScriptLoad()
  93.     if Persistent then
  94.         -- edit --
  95.         logging = false             -- | true enable full script game logging, false to disable - can be spammy to the log, best used for tournaments/scrims/debugging
  96.         -- don't edit --
  97.         game_started = false
  98.         team_play = false
  99.         beserk = false     
  100.         weapons = {}
  101.         level = {}
  102.         last_damage = {}
  103.         team_change = {}
  104.         mybattery = {}
  105.         meleekills = {}
  106.         playerscore = {}
  107.         teamscore = {}     
  108.         spiker_clip = 40
  109.         brifle_clip = 36
  110.         brute_clip = 6
  111.         needler_clip = 40
  112.         shotgun_clip = 12
  113.         assault_clip = 32
  114.         pistol_clip = 12
  115.         rocket_clip = 2
  116.         sniper_clip = 4
  117.         battery = 0
  118.         timerCount = 0
  119.         to_win = 1000
  120.         cur_players = 0
  121.         roaming_targets = false
  122.        
  123.         if new_game_timer == nil then
  124.             new_game_timer = registertimer(0, "NewGameTimer")
  125.         end        
  126.     end
  127.    
  128.     GetGameAddresses(game) 
  129.     showtargets = nil
  130.     game_started = false
  131.     team_play = false  
  132.     team_play = getteamplay()
  133.     gametype = readbyte(gametype_base + 0x30)
  134.     LoadTags()
  135.  
  136.     for i = 0,15 do
  137.         if getplayer(i) then
  138.             local hash = gethash(i)
  139.             last_damage[hash] = nil
  140.             mybattery[i] = 1
  141.             weapons[i] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  142.             level[i] = 1
  143.             playerscore[i] = 0
  144.             team_change[i] = false
  145.             cur_players = cur_players + 1  
  146.         end
  147.     end
  148.  
  149.     if gametype ~= 5 and cur_players > 2 then
  150.         roaming_targets = true      -- | true enable roaming target/navs to appear over heads of all players. false = disable
  151.         showtargets = registertimer(250, "ShowTargets")
  152.     end    
  153.        
  154.     if gametype == 3 or gametype == 5 then
  155.         for i=0,15 do
  156.             if getplayer(i) then
  157.                 privatesay(i, "Race and Oddball are not compatible with Gun-Game. ", false)
  158.             end
  159.         end    
  160.         log_msg(4, "##GUN-GAME## Race and Oddball are NOT compatible with Gun-Game: try CTF, Slayer & KOTH.") -- log error in scripts log
  161.         log_msg(1, "##GUN-GAME## Race and Oddball are NOT compatible with Gun-Game: try CTF, Slayer & KOTH.") -- log error in game log
  162.     else
  163.         game_started = false
  164.         if new_game_timer == nil then
  165.             new_game_timer = registertimer(0, "NewGameTimer")
  166.         end    
  167.     end
  168.        
  169. end
  170.  
  171. function OnPlayerJoin(player)
  172.     if getplayer(player) then
  173.         local name = getname(player)
  174.         cur_players = cur_players + 1
  175.         mybattery[player] = 1
  176.         weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  177.         level[player] = 1
  178.         playerscore[player] = 0
  179.         team_change[player] = false
  180.         welcome = registertimer(9000, "Welcome", player)
  181.         if game_started and team_play and cur_players > 3 and TeamsAreUneven() then Balance_Teams() end
  182.         if game_started and cur_players > 2 and roaming_targets and not showtargets then
  183.             if gametype ~= 5 then
  184.                 showtargets = registertimer(250, "ShowTargets")
  185.             end
  186.         end    
  187.         if logging then log_msg(1, name .. " given Plasma Pistol on spawn.") end
  188.     end
  189. end
  190.  
  191. function Welcome(id, count, player)
  192.     if count == 1 then
  193.         if getplayer(player) then
  194.             sendconsoletext(player, "Welcome to Gun-Game Arms Race!", 10, 0)
  195.             sendconsoletext(player, "Each time you kill with a weapon, you will be given a new weapon.", 10, 0)
  196.             sendconsoletext(player, "The first person to kill with every weapon in the game - wins!", 10, 0)
  197.             sendconsoletext(player, "There are 11 weapons, good luck!  type @help for more info.", 10, 0)
  198.         end
  199.     end
  200.     return false   
  201. end
  202.  
  203. function OnPlayerLeave(player)
  204.     if getplayer(player) then
  205.         cur_players = cur_players - 1
  206.         if level[player] == 10 then
  207.             beserk = false
  208.         end
  209.         mybattery[player] = {}
  210.         team_change[player] = {}
  211.         weapons[player] = {}
  212.         level[player] = {}
  213.         playerscore[player] = 0
  214.         if cur_players < 3 and showtargets then
  215.             showtargets = nil
  216.         end        
  217.         if game_started and team_play and cur_players > 3 and TeamsAreUneven() then Balance_Teams() end
  218.     end
  219. end
  220.  
  221. function OnPlayerSpawn(player, m_objectId)
  222.     if getplayer(player) then
  223.         local hash = gethash(player)
  224.         last_damage[hash] = nil
  225.         team_change[player] = false
  226.         ChangeFFAColor(player)
  227.         if game_started then
  228.             gameweap = registertimer(0, "AssignGameWeapons", player)
  229.         end    
  230.     end
  231. end
  232.  
  233. function ChangeFFAColor(player)
  234.     if getplayer(player) then
  235.         local m_objectId = getplayerobjectid(player)
  236.         if m_objectId then
  237.             local m_object = getobject(m_objectId)
  238.             if m_object then
  239.                 local m_player = getplayer(player)
  240.                 local color = getrandomnumber(1, 18)
  241.                 writeword(m_player + 0x60, color)
  242.             end
  243.         end
  244.     end
  245. end
  246.  
  247. function OnServerCommand(player, command)
  248.     local allow = nil
  249.     local cmd = tokenizecmdstring(command)
  250.     local tokencount = #cmd
  251.     if tokencount > 0 then
  252.    
  253.         if cmd[1] == "sv_map_reset" then
  254.             map_reset = true
  255.             showtargets = nil          
  256.             ScriptLoad()
  257.             privatesay(player, "**RESET** The game has been reset and scripts reloaded. ")
  258.             if logging then log_msg(1, getname(player) .. " used sv_map_reset command.") end           
  259.             for i=0,15 do  
  260.                 if getplayer(i) then
  261.                     kill(i)
  262.                     privatesay(i, "The game has been reset. ")
  263.                 end
  264.             end        
  265.             allow = true
  266.            
  267.         elseif cmd[1] == "sv_script_reload" then
  268.             map_reset = true
  269.             showtargets = nil  
  270.             writedword(gametime_base + 0x10, 0)
  271.             ScriptLoad()
  272.             privatesay(player, "**RELOAD** The game has been reset and scripts reloaded. ")
  273.             if logging then log_msg(1, getname(player) .. " used sv_script_reload command.") end
  274.             for i=0,15 do  
  275.                 if getplayer(i) then
  276.                     kill(i)
  277.                     privatesay(i, "The game has been reset. ")
  278.                 end
  279.             end        
  280.             allow = true
  281.         end
  282.        
  283.     end
  284.     return allow
  285. end
  286.  
  287. function NewGameTimer(id, count)
  288.     if map_reset == true then
  289.         if team_play and cur_players > 3 then Balance_Teams() end
  290.         map_reset = false
  291.     end
  292.    
  293.     game_started = true
  294.     team_play = getteamplay()
  295.     cur_players = readword(network_base, 0x1A0)
  296.    
  297.     if team_play then
  298.         teamscore[0] = 0
  299.         teamscore[1] = 0
  300.         for i=0,15 do
  301.             if getplayer(i) then
  302.                 cur_players = cur_players + 1
  303.             end
  304.         end    
  305.         if not autobalance and game_started and cur_players > 3 then
  306.             autobalance = registertimer(60000, "AutoBalance")
  307.         end            
  308.     end
  309.    
  310.     if Persistent then
  311.         log_msg(1, "Gun-Game has begun on " .. map_name .. " and running as a persistent script.")
  312.     else
  313.         log_msg(1, "Gun-Game has begun on " .. map_name .. " and running as a non-persistent script.")
  314.     end
  315.    
  316.     for x = 0,15 do
  317.         if getplayer(x) then
  318.             local hash = gethash(x)
  319.             local name = getname(x)
  320.             local m_objectId = getplayerobjectid(x)
  321.             last_damage[hash] = nil
  322.             team_change[x] = false
  323.             mybattery[x] = 0   
  324.             weapons[x] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  325.             level[x] = 1
  326.             playerscore[x] = 0
  327.             speedtimer = registertimer(0, "SpeedTimer", x)
  328.            
  329.             if m_objectId ~= nil then
  330.                 local m_object = getobject(m_objectId)
  331.                 if m_object then
  332.                     for i = 0,3 do
  333.                         local weapID = readdword(getobject(m_objectId), 0x2F8 + i*4)
  334.                         if weapID ~= 0xFFFFFFFF then
  335.                             destroyobject(weapID)
  336.                         end
  337.                     end
  338.                     writebyte(m_object + 0x31E, 0)
  339.                     writebyte(m_object + 0x31F, 0) 
  340.                 end
  341.                
  342.                 if level[x] == 1 then
  343.                     battery = 0
  344.                     weapons[x] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  345.                     sendconsoletext(x, "Level 1:   Plasma Pistol - Speed: 135%", 5, 0)
  346.                     if m_object then
  347.                         writebyte(m_object + 0x31E, 0)
  348.                         writebyte(m_object + 0x31F, 1) 
  349.                     end
  350.                 end
  351.                
  352.                 local m_weaponId = createobject(gettagid("weap", weapons[x]), 0, 20, false, 0, 0, 0)
  353.                
  354.                 if m_weaponId then
  355.                     local m_weapon = getobject(m_weaponId)
  356.                     if m_weapon then
  357.                         assignweapon(x, m_weaponId)
  358.                         if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma on new game.")   end
  359.                         if m_weapon then
  360.                             mybattery[x] = 1
  361.                         end
  362.                     end    
  363.                 end
  364.                
  365.             end
  366.         end
  367.  
  368.         if not updatescores and game_started then
  369.             updatescores = registertimer(500, "Update_Scores")
  370.         end
  371.        
  372.         if not checkbattery then
  373.             checkbattery = registertimer(1000, "CheckBattery") 
  374.         end
  375.        
  376.     end
  377.    
  378.     new_game_timer = nil   
  379.     return false
  380. end
  381.  
  382. function AssignGameWeapons(id, count, player)
  383.     if map_reset == true then
  384.         map_reset = false
  385.     end
  386.    
  387.     local clip = 0
  388.     local ammo = 9999
  389.    
  390.     if game_started then   
  391.         if getplayer(player) then      
  392.             local m_objectId = getplayerobjectid(player)
  393.             local name = getname(player)
  394.             local lvl = level[player]
  395.            
  396.             if m_objectId ~= nil then
  397.                 if gametype == 1 or gametype == 2 or gametype == 4 or gametype == 5 then
  398.                     speedtimer = registertimer(0, "SpeedTimer", player)
  399.                 end
  400.                
  401.                 local m_object = getobject(m_objectId)
  402.                 if m_object then
  403.                     for i = 0,3 do
  404.                         local weapID = readdword(getobject(m_objectId), 0x2F8 + i*4)
  405.                         if weapID ~= 0xFFFFFFFF then
  406.                             destroyobject(weapID)
  407.                         end
  408.                     end
  409.                     writebyte(m_object + 0x31E, 0)
  410.                     writebyte(m_object + 0x31F, 0) 
  411.                 end
  412.                 if logging then log_msg(1, name .. " weapon assignment initiated - weapons & nades removed. Is level: " .. lvl) end                
  413.                
  414.                 if level[player] == nil then
  415.                     level[player] = 1
  416.                     weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  417.                     sendconsoletext(player, "Level 1:   Plasma Pistol - Speed: 135%", 4, 0)
  418.                     if m_object then
  419.                         writebyte(m_object + 0x31E, 0)
  420.                         writebyte(m_object + 0x31F, 1) 
  421.                     end
  422.                     if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma. Is level: " .. lvl) end
  423.                    
  424.                 elseif level[player] == 1 then
  425.                     weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
  426.                     sendconsoletext(player, "Level 1:  Plasma Pistol - Speed: 135%", 4, 0)
  427.                     if m_object then
  428.                         writebyte(m_object + 0x31E, 0)
  429.                         writebyte(m_object + 0x31F, 1) 
  430.                     end
  431.                     if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma. Is level: " .. lvl) end
  432.                    
  433.                 elseif level[player] == 2 then
  434.                     clip = needler_clip
  435.                     weapons[player] = "zteam\\objects\\weapons\\single\\needler\\h3\\needler"
  436.                     sendconsoletext(player, "Level 2:   Needler - Speed: 135%", 4, 0)
  437.                     if m_object then
  438.                         writebyte(m_object + 0x31E, 0)
  439.                         writebyte(m_object + 0x31F, 1) 
  440.                     end
  441.                     if logging then log_msg(1, name .. " given Needler, 1 plasma. Is level: " .. lvl) end  
  442.    
  443.                 elseif level[player] == 3 then
  444.                     clip = spiker_clip
  445.                     weapons[player] = "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle"
  446.                     sendconsoletext(player, "Level 3:   Spike Rifle - Speed: 135%", 4, 0)
  447.                     if m_object then
  448.                         writebyte(m_object + 0x31E, 0)
  449.                         writebyte(m_object + 0x31F, 2)
  450.                     end
  451.                     if logging then log_msg(1, name .. " given Spike Rifle, 1 plasma. Is level: " .. lvl) end
  452.                    
  453.                 elseif level[player] == 4 then
  454.                     clip = shotgun_clip
  455.                     weapons[player] = "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun"
  456.                     sendconsoletext(player, "Level 4: Shotgun - Speed: 125%", 4, 0)
  457.                     sendconsoletext(player, "This Shotgun has a VERY short range - get up-close for a kill.", 8, 0)
  458.                     if m_object then
  459.                         writebyte(m_object + 0x31E, 4)
  460.                         writebyte(m_object + 0x31F, 0)
  461.                     end                
  462.                     if logging then log_msg(1, name .. " given Shotgun, 4 frags, health bonus. Is level: " .. lvl)  end
  463.                    
  464.                 elseif level[player] == 5 then
  465.                     weapons[player] = "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle"
  466.                     sendconsoletext(player, "Level 5:   Plasma Rifle - Speed: 125%", 4, 0)
  467.                     if m_object then
  468.                         writebyte(m_object + 0x31E, 0)
  469.                         writebyte(m_object + 0x31F, 2)
  470.                     end                    
  471.                     if logging then log_msg(1, name .. " given Plasma Rifle, 1 frag. Is level: " .. lvl) end
  472.                
  473.                 elseif level[player] == 6 then
  474.                     clip = brute_clip
  475.                     weapons[player] = "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot"
  476.                     sendconsoletext(player, "Level 6:   Brute Shot - Speed: 75%", 4, 0)
  477.                     if m_object then
  478.                         writebyte(m_object + 0x31E, 0)
  479.                         writebyte(m_object + 0x31F, 0)
  480.                     end                    
  481.                     if logging then log_msg(1, name .. " given Brute Shot, 0 nades. Is level: " .. lvl) end
  482.                    
  483.                 elseif level[player] == 7 then
  484.                     clip = assault_clip
  485.                     weapons[player] = "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle"
  486.                     sendconsoletext(player, "Level 7:   Assault Rifle - Speed: 75%", 4, 0)
  487.                     if m_object then
  488.                         writebyte(m_object + 0x31E, 2)
  489.                         writebyte(m_object + 0x31F, 0)
  490.                     end                    
  491.                     if logging then log_msg(1, name .. " given Assault Rifle, 2 frags. Is level: " .. lvl) end                 
  492.                    
  493.                 elseif level[player] == 8 then
  494.                     clip = pistol_clip
  495.                     weapons[player] = "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum"
  496.                     sendconsoletext(player, "Level 8:   Magnum Pistol - Speed: 85%", 4, 0)
  497.                     if m_object then
  498.                         writebyte(m_object + 0x31E, 0)
  499.                         writebyte(m_object + 0x31F, 0)
  500.                     end
  501.                     if logging then log_msg(1, name .. " given Magnum Pistol, 0 nades, health bonus. Is level: " .. lvl) end   
  502.  
  503.                 elseif level[player] == 9 then
  504.                     clip = brifle_clip
  505.                     weapons[player] = "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle"
  506.                     sendconsoletext(player, "Level 9:   Battle Rifle - Speed: 75%", 4, 0)
  507.                     if m_object then
  508.                         writebyte(m_object + 0x31E, 0)
  509.                         writebyte(m_object + 0x31F, 0)
  510.                     end
  511.                     if logging then log_msg(1, name .. " given Battle Rifle, 0 nades. Is level: " .. lvl) end  
  512.                    
  513.                 elseif level[player] == 10 then
  514.                     clip = rocket_clip
  515.                     weapons[player] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
  516.                     sendconsoletext(player, "Level 10:   Rocket Launcher - Speed: 65%", 4, 0)
  517.                     if m_object then
  518.                         writebyte(m_object + 0x31E, 1)
  519.                         writebyte(m_object + 0x31F, 0)
  520.                     end                
  521.                     if logging then log_msg(1, name .. " given Rocket Launcher, 1 frag. Is level: " .. lvl) end
  522.                    
  523.                 elseif level[player] == 11 then
  524.                     clip = sniper_clip
  525.                     weapons[player] = "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle"
  526.                     sendconsoletext(player, "Level 11:   Sniper Rifle - Speed: 95%", 4, 0)
  527.                     sendconsoletext(player, "Final Level, Either win the game, or get demoted!", 4, 0)
  528.                     say(name .. " has reached level 11! Gang-up on 'em before it's too late!")                 
  529.                     if m_object then
  530.                         writebyte(m_object + 0x31E, 2)
  531.                         writebyte(m_object + 0x31F, 0)
  532.                     end
  533.                     if logging then log_msg(1, name .. " given Sniper Rifle, 2 frags, camo removed if any. Is level: " .. lvl) end 
  534.  
  535.                 end
  536.                 local m_weaponId = createobject(gettagid("weap", weapons[player]), 0, 20, false, 0, 0, 0)
  537.                
  538.                 if m_weaponId then
  539.                     local m_weapon = getobject(m_weaponId)
  540.                     assignweapon(player, m_weaponId)
  541.                     if m_weapon then
  542.                         if (level[player] == 1) or (level[player] == 5) then
  543.                             mybattery[player] = 1
  544.                         else
  545.                             mybattery[player] = 0
  546.                             writeword(m_weapon + 0x2B6, ammo)
  547.                             writeword(m_weapon + 0x2B8, clip)
  548.                             updateammo(m_weaponId)
  549.                         end
  550.                     end
  551.                 end
  552.                
  553.             end
  554.         end
  555.     end    
  556.     return false
  557. end
  558.  
  559. function CheckBattery(id, count, player)
  560.     -- checks battery level for plasma weapons and assigns replacement if low battery: plasma pistol, plasma rifle and plasma cannon
  561.     for i = 0,15 do
  562.         if getplayer(i) then
  563.             if mybattery[i] == 1 then
  564.                 local name = getname(i)
  565.                 local lvl = level[i]
  566.                 local m_objectId = getplayerobjectid(i)
  567.                 if m_objectId ~= nil then
  568.                     local m_object = getobject(m_objectId)
  569.                     if m_object then
  570.                         local m_weaponId = readdword(m_object + 0x118)
  571.                         if m_weaponId then
  572.                             local m_weapon = getobject(m_weaponId)
  573.                             if m_weapon then   
  574.                                 if readfloat(m_weapon + 0x240) >= 0.84 then
  575.                                     destroyplayerweaps(i)
  576.                                     replaceplasmaweap = registertimer(0, "ReplacePlasmaWeap", i)
  577.                                     if logging then log_msg(1, name .. " has a low battery on battery check. Is level: " .. lvl) end
  578.                                 end
  579.                             end
  580.                         end
  581.                     end
  582.                 end
  583.             end
  584.         end
  585.     end
  586.     return true
  587. end
  588.  
  589. function ReplacePlasmaWeap(id, count, player)
  590.     -- replaces low battery plasma weapons
  591.     if count == 1 then 
  592.         if player ~= nil and game_started then
  593.             local name = getname(player)
  594.             local lvl = level[player]  
  595.             if mybattery[player] == 1 then
  596.                 local m_weaponId = registertimer(0, "AssignGameWeapons", player)
  597.                 if logging then log_msg(1, name .. " was given assigment to replace plasma weapon. Is level: " .. lvl) end
  598.                 privatesay(player, "Battery recharged.")
  599.                 mybattery[player] = 0  
  600.             end    
  601.         end
  602.     end
  603.     return false
  604. end
  605.  
  606. function Update_Scores(id, count)
  607.     -- continuous score updating, not conditioned to game_started, updates negative values to 0 to prevent sabotage
  608.     if not team_play then
  609.         for i = 0,15 do
  610.             if getplayer(i) then
  611.                 if playerscore[i] == nil or playerscore[i] < 0 then playerscore[i] = 0 end
  612.                 Write_Player_Score(i, playerscore[i])
  613.             end
  614.         end    
  615.     else
  616.         for i = 0,15 do
  617.             if getplayer(i) then
  618.                 if playerscore[i] == nil or playerscore[i] < 0 then playerscore[i] = 0 end
  619.                 Write_Player_Score(i, playerscore[i])
  620.             end
  621.         end
  622.         if teamscore[0] == nil or teamscore[0] < 0 then teamscore[0] = 0 end
  623.         if teamscore[1] == nil or teamscore[1] < 0 then teamscore[1] = 0 end
  624.         Write_Team_Score(0, teamscore[0])
  625.         Write_Team_Score(1, teamscore[1])
  626.     end
  627.     return true
  628. end                
  629.  
  630. function Write_Player_Score(player, score)
  631.     -- writes the players score
  632.     if gametype == 1 then
  633.         if player then
  634.             local m_player = getplayer(player)
  635.             writeword(m_player + 0xC8, score)
  636.         end
  637.     elseif gametype == 2 then
  638.         if player then
  639.             local m_player = getplayer(player)
  640.             writedword(slayer_globals + 0x40 + player*4, score)
  641.         end
  642.     elseif gametype == 5 then
  643.         if player then
  644.             local m_player = getplayer(player)
  645.             writeword(m_player + 0xC6, 0x0, score)
  646.         end    
  647.     end
  648. end
  649.  
  650. function Write_Team_Score(team, score)
  651.     -- writes the team score
  652.     if gametype == 1 then
  653.         writedword(ctf_globals + team*4 + 0x10, score)
  654.     elseif gametype == 2 then
  655.         writedword(slayer_globals + team*4, score)
  656.     elseif gametype == 5 then
  657.         if team == 0 then
  658.             writedword(team_race_scores + 0x0, score)
  659.         elseif team == 1 then
  660.             writedword(team_race_scores + 0x4, score)
  661.         end
  662.     end    
  663. end
  664.  
  665. function GetGameAddresses(game)
  666.     if game == "PC" or GAME == "PC" then
  667.         map_name = readstring(0x698F21)
  668.         gametype_base = 0x671340   
  669.         network_base = 0x745BA8
  670.         gametime_base = 0x671420
  671.         gametype_name = readwidestring(gametype_base)
  672.         team_race_scores = 0x63A028
  673.         race_globals = 0x639FA0
  674.         ctf_globals = 0x639B98
  675.         ctf_score_patch = 0x488602
  676.         ctf_score_patch1 = 0x488606    
  677.         slayer_globals = 0x63A0E8
  678.         slayer_score_patch = 0x48F428
  679.         slayer_score_patch2 = 0x48F23E         
  680.     else
  681.         map_name = readstring(0x61D151)
  682.         gametype_base = 0x5F5498
  683.         network_base = 0x6C7988
  684.         gametime_base = 0x5F55BC
  685.         gametype_name = readwidestring(gametype_base)
  686.         team_race_scores = 0x5BD028
  687.         race_globals = 0x5BDFC0
  688.         ctf_globals = 0x5BDBB8
  689.         ctf_score_patch = 0x463472
  690.         ctf_score_patch1 = 0x463476
  691.         slayer_globals = 0x5BE108
  692.         slayer_score_patch = 0x469CF8
  693.         slayer_score_patch2 = 0x4691CE     
  694.     end
  695. end
  696.  
  697. function getteamplay()
  698.     if readbyte(gametype_base + 0x34) == 1 then
  699.         to_win = 1000
  700.         return true
  701.     else
  702.         to_win = 1000
  703.         return false
  704.     end
  705. end
  706.  
  707. function privatesay(player, message, script_prefix)
  708.     if GAME == "PC" then
  709.         phasor_privatesay(player, (script_prefix or default_script_prefix) .. " " .. message, false)
  710.     else
  711.         phasor_privatesay(player, message, false)
  712.     end
  713. end
  714.  
  715. function say(message, script_prefix)
  716.     if GAME == "PC" then
  717.         phasor_say((script_prefix or default_script_prefix) .. " " .. message, false)
  718.     else
  719.         phasor_say(message, false)
  720.     end
  721. end
  722.  
  723. function getweaponobjectid(player, slot)
  724.     local m_objectId = getplayerobjectid(player)
  725.     if m_objectId then return readdword(getobject(m_objectId) + 0x2F8 + slot*4) end
  726. end
  727.  
  728. function destroyplayerweaps(player)
  729.     for i=0,3 do
  730.         local weap_id = getweaponobjectid(player, i)
  731.         if weap_id ~= 0xFFFFFFFF then destroyobject(weap_id) end
  732.     end
  733. end
  734.  
  735. function Booster(id, count, arg)
  736.     if count == 1 and game_started then
  737.         local player = arg[1]
  738.         if getplayer(player) then
  739.             local name = getname(player)
  740.             local lvl = level[player]      
  741.             local m_playerObjId = getplayerobjectid(player)
  742.             if m_playerObjId ~= nil and lvl <= 9 then
  743.                 local m_object = getobject(m_playerObjId)
  744.                 local obj_health = readfloat(m_object + 0xE0)
  745.                 if obj_health < 1 then
  746.                     writefloat(m_object + 0xE0, 1)
  747.                     sendconsoletext(player, "Bonus! Health restored!", 5, 0)
  748.                     if logging then log_msg(1, name .. " health restored from booster function. Is level: " .. lvl) end
  749.                 end
  750.             end
  751.         end
  752.     end
  753.     return false
  754. end
  755.  
  756. function SpeedTimer(id, count, player)
  757.     if player then
  758.         local name = getname(player)
  759.         local lvl = level[player]  
  760.         if level[player] == 1 then
  761.             if beserk then
  762.                 setspeed(player, 1.5)
  763.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  764.             else       
  765.                 setspeed(player, 1.35) -- Plasma Pistol
  766.             end
  767.             if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
  768.            
  769.         elseif level[player] == 2 then
  770.             if beserk then
  771.                 setspeed(player, 1.5)
  772.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  773.             else       
  774.                 setspeed(player, 1.35) -- Needler
  775.             end
  776.             if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
  777.            
  778.         elseif level[player] == 3 then
  779.             if beserk then
  780.                 setspeed(player, 1.5)
  781.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  782.             else       
  783.                 setspeed(player, 1.35) -- Spike Rifle
  784.             end
  785.             health = registertimer(0, "ApplyHP", player)   
  786.             if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
  787.            
  788.         elseif level[player] == 4 then
  789.             if beserk then
  790.                 setspeed(player, 1.5)
  791.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  792.             else       
  793.                 setspeed(player, 1.25) -- Shotgun
  794.                 applycamo(player, 20)
  795.             end
  796.             if logging then log_msg(1, name .. " speed set at 1.50. Is level: " .. lvl) end
  797.            
  798.         elseif level[player] == 5 then
  799.             if beserk then
  800.                 setspeed(player, 1.5)
  801.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  802.             else       
  803.                 setspeed(player, 1.25) -- Plasma Rifle
  804.             end
  805.             if logging then log_msg(1, name .. " speed set at 1.25. Is level: " .. lvl) end
  806.  
  807.         elseif level[player] == 6 then
  808.             if beserk then
  809.                 setspeed(player, 1.5)
  810.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  811.             else       
  812.                 setspeed(player, 0.75) -- Brute Shot
  813.             end
  814.             if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
  815.             health = registertimer(0, "ApplyHP", player)
  816.            
  817.         elseif level[player] == 7 then
  818.             if beserk then
  819.                 setspeed(player, 1.5)
  820.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  821.             else       
  822.                 setspeed(player, 0.75) -- Assault Rifle
  823.             end
  824.             if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
  825.            
  826.         elseif level[player] == 8 then
  827.             if beserk then
  828.                 setspeed(player, 1.5)
  829.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  830.             else
  831.                 setspeed(player, 0.85) -- Magnum Pistol
  832.             end
  833.             if logging then log_msg(1, name .. " speed set at 0.65. Is level: " .. lvl) end
  834.            
  835.         elseif level[player] == 9 then
  836.             if beserk then
  837.                 setspeed(player, 1.5)
  838.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  839.             else       
  840.                 setspeed(player, 0.75) -- Battle Rifle
  841.             end
  842.             if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
  843.             health = registertimer(0, "ApplyHP", player)
  844.            
  845.         elseif level[player] == 10 then
  846.             if beserk then
  847.                 setspeed(player, 1.5)
  848.                 sendconsoletext(player, "BESERK MODE!", 4, 1)
  849.             else       
  850.                 setspeed(player, 0.65) -- Rocket Launcher
  851.             end    
  852.             if logging then log_msg(1, name .. " speed set at 0.65. Is level: " .. lvl) end
  853.         elseif level[player] == 11 then
  854.             setspeed(player, 0.95) -- Sniper Rifle
  855.             health = registertimer(0, "ApplyHP", player)   
  856.             if logging then log_msg(1, name .. " speed set at 0.95 Is level: " .. lvl) end     
  857.         end
  858.     end
  859.     return false
  860. end
  861.  
  862. function OnServerChat(player, type, message)
  863.     local response = nil
  864.    
  865.     if player then
  866.         name = getname(player)
  867.        
  868.         if string.lower(message) == "help" or string.lower(message) == "@help" or string.lower(message) == "/help" then
  869.             privatesay(player, "Each time you kill with a weapon, you will be given a new weapon.")
  870.             privatesay(player, "The first person to kill with each weapon in the game - wins!")
  871.             privatesay(player, "There are 11 weapons. Starting with Plasma Pistol and ending with Sniper Rifle.")
  872.             privatesay(player, "Other weapons & grenades are blocked, vehicle damage and vehicle guns are blocked")
  873.             privatesay(player, "If you are on level 11, and get killed, you go down one level.")
  874.             say(name .. " is reading the @help menu. ")
  875.             return false           
  876.         end
  877.        
  878.         if string.lower(message) == "balance" then
  879.             if isadmin(player) then
  880.                 if team_play then
  881.                     balance = registertimer(50, "Balance_Teams")
  882.                 else
  883.                     privatesay(player, "Not a team game.")
  884.                 end
  885.             end
  886.             return false       
  887.         end
  888.        
  889.     end
  890.     return response
  891. end
  892.  
  893. function OnPlayerKill(killer, victim, mode)
  894.     local response = false
  895.        
  896.     if game_started then
  897.         mybattery[victim] = 0
  898.        
  899.         if mode == 0 then -- player was killed by server
  900.             if getplayer(victim) then
  901.                 if team_change[victim] then
  902.                     response = false   
  903.                 else
  904.                     vlvl = level[victim]
  905.                     vname = getname(victim)
  906.                     vhash = gethash(victim)        
  907.                     privatesay(victim, "You were killed by the server.")
  908.                     if logging then log_msg(1, vname .. " was killed by the server. Is level: " .. vlvl) end
  909.                     response = false                       
  910.                 end
  911.                 response = false
  912.             end
  913.            
  914.         elseif mode == 1 then -- player was killed by falling or team-change
  915.                 if getplayer(victim) then
  916.                     vlvl = level[victim]
  917.                     vname = getname(victim)
  918.                     vhash = gethash(victim)                    
  919.                     if not team_change[victim] and not map_reset then
  920.                         if last_damage[vhash] == "globals\\new fall\\falling" or last_damage[vhash] == "globals\\new fall\\distance" then
  921.                             say(vname .. " fell and died.")
  922.                             if logging then log_msg(1, vname .. " was killed by fall damage. Is level: " .. vlvl) end
  923.                             response = false
  924.                         end
  925.                     elseif team_change[victim] and map_reset then
  926.                         team_change[victim] = false
  927.                         if logging then log_msg(1, vname .. " was killed by team change. Is level: " .. vlvl) end
  928.                         response = false                       
  929.                     end
  930.                 end
  931.            
  932.         elseif mode == 2 then -- player was killed by the guardians
  933.             if getplayer(victim) then
  934.                 vlvl = level[victim]
  935.                 vname = getname(victim)
  936.                 vhash = gethash(victim)
  937.                 say(vname .. " was killed by the guardians. ", false)
  938.                 if logging then log_msg(1, vname .. " was killed by guardians. Is level: " .. vlvl) end
  939.                 response = false
  940.             end
  941.            
  942.         elseif mode == 3 then -- player was killed by vehicle
  943.             if getplayer(victim) then
  944.                 vlvl = level[victim]
  945.                 vname = getname(victim)
  946.                 vhash = gethash(victim)
  947.                 say(vname .. " was killed by a vehicle. ")
  948.                 if logging then log_msg(1, vname .. " was killed by a vehicle. Is level: " .. vlvl) end
  949.                 response = false
  950.             end
  951.            
  952.         elseif mode == 4 then -- player was killed by another player
  953.             if getplayer(killer) then
  954.                 klvl = level[killer]
  955.                 kname = getname(killer)
  956.                 khash = gethash(killer)
  957.             else   
  958.                 kname = "NULL"
  959.                 klvl = NULL
  960.             end
  961.            
  962.             if getplayer(victim) then
  963.                 vlvl = level[victim]
  964.                 vname = getname(victim)
  965.                 vhash = gethash(victim)
  966.                
  967.                 if vlvl == 11 then
  968.                     privatesay(victim, "Demoted one level! Ain't that a bitch?!")
  969.                     say(vname .. " demoted to Level 10 for getting killed.")
  970.                     weapons[victim] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
  971.                     level[victim] = 10
  972.                     playerscore[victim] = 9
  973.                     beserk = false
  974.                     if logging then log_msg(1, vname .. " level 11 demoted to 10 for being killed by another player.") end
  975.                     response = false
  976.                 end
  977.  
  978.                 if last_damage[vhash] then
  979.                     if getplayer(killer) then
  980.                         klvl = level[killer]
  981.                         kname = getname(killer)
  982.                         khash = gethash(killer)                    
  983.                         local k_objectId = getplayerobjectid(killer)
  984.                         if k_objectId ~= nil then
  985.                             -- Plasma Pistol
  986.                             if weapons[killer] == "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol" then
  987.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt" or last_damage[vhash] == "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt_charged" then
  988.                                     say(kname .. " killed " .. vname .. " with a Plasma Pistol. ")
  989.                                 elseif string.find(last_damage[vhash], "melee") then
  990.                                     say(kname .. " melee'd " .. vname .. " with a Plasma Pistol.")
  991.                                 end
  992.                                 level[killer] = 2
  993.                                 playerscore[killer] = 1                                
  994.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  995.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  996.                                 response = false
  997.                                
  998.                             -- Needler
  999.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\needler\\h3\\needler" then
  1000.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\needler\\h3\\needle_impact" or last_damage[vhash] == "zteam\\objects\\weapons\\single\\needler\\h3\\needle_detonation" or
  1001.                                     last_damage[vhash] == "zteam\\objects\\weapons\\single\\needler\\h1\\needle_combining_explosion_shockwave" or last_damage[vhash] == "zteam\\objects\\weapons\\single\\needler\\h3\\needle_combining_explosion" then
  1002.                                     say(kname .. " killed " .. vname .. " with a Needler. ")
  1003.                                 elseif string.find(last_damage[vhash], "melee") then
  1004.                                     say(kname .. " melee'd " .. vname .. " with a Needler.")
  1005.                                 end
  1006.                                 level[killer] = 3
  1007.                                 playerscore[killer] = 2                                
  1008.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1009.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1010.                                
  1011.                             -- Spiker
  1012.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle" then
  1013.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike" then
  1014.                                     say(kname .. " killed " .. vname .. " with a Spike Rifle. ")
  1015.                                 elseif string.find(last_damage[vhash], "melee") then
  1016.                                     say(kname .. " melee'd " .. vname .. " with a Spike Rifle.")
  1017.                                 end
  1018.                                 level[killer] = 4
  1019.                                 playerscore[killer] = 3                                
  1020.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1021.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1022.                                 response = false
  1023.  
  1024.                             -- Shotgun
  1025.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun" then
  1026.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\shotgun\\h3\\pellet" then
  1027.                                     say(kname .. " killed " .. vname .. " with a Shotgun. ")
  1028.                                 elseif string.find(last_damage[vhash], "melee") then
  1029.                                     say(kname .. " melee'd " .. vname .. " with a Shotgun.")                                       
  1030.                                 end
  1031.                                 level[killer] = 5
  1032.                                 playerscore[killer] = 4                                
  1033.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1034.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1035.                                 response = false
  1036.  
  1037.                             -- Plasma Rifle
  1038.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle" then
  1039.                                 if last_damage[vhash] == "halo3\\weapons\\plasma_rifle\\effects\\bolt" then
  1040.                                     say(kname .. " killed " .. vname .. " with a Plasma Rifle. ")
  1041.                                 elseif string.find(last_damage[vhash], "melee") then
  1042.                                     say(kname .. " melee'd " .. vname .. " with a Plasma Rifle.")
  1043.                                 end
  1044.                                 level[killer] = 6
  1045.                                 playerscore[killer] = 5                                
  1046.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1047.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1048.                                 response = false
  1049.    
  1050.                             -- Brute Shot
  1051.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot" then
  1052.                                 say(kname .. " killed " .. vname .. " with a Brute Shot.")
  1053.                                 --[[
  1054.                                 if last_damage[vhash] == "halo3\\hud_v2\\ui\\force_zoom_out" then
  1055.                                     say(kname .. " killed " .. vname .. " with a Brute Shot.")
  1056.                                 elseif last_damage[vhash] == "zteam\\shared\\damage_effects\\misc\\projectile_detonator" then
  1057.                                     say(kname .. " killed " .. vname .. " with a Brute Shot.")
  1058.                                 elseif string.find(last_damage[vhash], "melee") then
  1059.                                     say(kname .. " melee'd " .. vname .. " with a Brute Shot.")
  1060.                                 end ]]--
  1061.                                 level[killer] = 7
  1062.                                 playerscore[killer] = 6                                
  1063.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1064.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1065.                                 response = false
  1066.  
  1067.                             -- Assault Rifle
  1068.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle" then
  1069.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\bullet" then
  1070.                                     say(kname .. " killed " .. vname .. " with an Assault Rifle. ")
  1071.                                 elseif string.find(last_damage[vhash], "melee") then
  1072.                                     say(kname .. " melee'd " .. vname .. " with an Assault Rifle.")
  1073.                                 end
  1074.                                 level[killer] = 8
  1075.                                 playerscore[killer] = 7                    
  1076.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1077.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1078.                                 response = false
  1079.  
  1080.                             -- Magnum Pistol
  1081.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum" then
  1082.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\magnum\\h3\\bullet" then
  1083.                                     say(kname .. " killed " .. vname .. " with a Magnum Pistol. ")
  1084.                                 elseif string.find(last_damage[vhash], "melee") then
  1085.                                     say(kname .. " melee'd " .. vname .. " with a Magnum Pistol.")
  1086.                                 end
  1087.                                 level[killer] = 9
  1088.                                 playerscore[killer] = 8                                
  1089.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1090.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1091.                                 response = false
  1092.  
  1093.                             -- Battle Rifle
  1094.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle" then
  1095.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet" then
  1096.                                     say(kname .. " killed " .. vname .. " with a Battle Rifle.")
  1097.                                 elseif string.find(last_damage[vhash], "melee") then
  1098.                                     say(kname .. " melee'd " .. vname .. " with a Battle Rifle.")
  1099.                                 end
  1100.                                 level[killer] = 10
  1101.                                 playerscore[killer] = 9                                    
  1102.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1103.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1104.                                 response = false
  1105.  
  1106.                             -- Rocket Launcher
  1107.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher" then
  1108.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\grenade\\fragmentation_grenade\\h1\\explosion_shockwave" or last_damage[vhash] == "weapons\\rocket launcher\\explosion" then
  1109.                                     say(kname .. " killed " .. vname .. " with a Rocket Launcher advanced to Final Level!")
  1110.                                 elseif string.find(last_damage[vhash], "melee") then
  1111.                                     say(kname .. " melee'd " .. vname .. " with a Rocket Launcher advanced to Final Level!")
  1112.                                 end
  1113.                                 level[killer] = 11
  1114.                                 playerscore[killer] = 10
  1115.                                 beserk = true
  1116.                                 for i=0,15 do
  1117.                                     if getplayer(i) then
  1118.                                         speedtimer = registertimer(0, "SpeedTimer", i)
  1119.                                     end
  1120.                                 end                                
  1121.                                 gameweap = registertimer(0, "AssignGameWeapons", killer)
  1122.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1123.                                 response = false
  1124.  
  1125.                             -- Sniper Rifle
  1126.                             elseif weapons[killer] == "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle" then
  1127.                                 if last_damage[vhash] == "zteam\\objects\\weapons\\single\\sniper_rifle\\h3\\bullet" then
  1128.                                     say(kname .. " killed " .. vname .. " with a Sniper Rifle.")
  1129.                                 elseif string.find(last_damage[vhash], "melee") then
  1130.                                     say(kname .. " melee'd " .. vname .. " with a Sniper Rifle.")
  1131.                                 end
  1132.                                 level[killer] = 12
  1133.                                 playerscore[killer] = playerscore[killer] + 11
  1134.                                 if team_play then kteam = getteam(killer) teamscore[kteam] = teamscore[kteam] + 11 end
  1135.                                 beserk = false                                 
  1136.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
  1137.                                 response = false                               
  1138.  
  1139.                             -- grenades
  1140.                             elseif last_damage[vhash] == "weapons\\frag grenade\\shock wave" or last_damage[vhash] == "weapons\\frag grenade\\explosion" or last_damage[vhash] == "halo3\\weapons\\frag grenade\\frag impact" or
  1141.                                 last_damage[vhash] == "weapons\\plasma grenade\\shock wave" or last_damage[vhash] == "weapons\\plasma grenade\\explosion" or last_damage[vhash] == "halo3\\weapons\\plasma-grenade\\stick" or last_damage[vhash] == "weapons\\plasma grenade\\attached" then
  1142.                                 say(kname .. " killed " .. vname .. " with a grenade.")
  1143.                                 sendconsoletext(killer, "No level advancement for grenade kills.", 4, 0)
  1144.                                 if logging then log_msg(1, vname .. " was killed by " .. kname .. "'s grenade who is level: " .. klvl) end
  1145.                                 response = false                           
  1146.                             end
  1147.                         else
  1148.                             response = false
  1149.                         end
  1150.                     end
  1151.                 end
  1152.             end
  1153.            
  1154.         elseif mode == 5 then -- player was killed/betrayed by teammate
  1155.             if getplayer(killer) then
  1156.                 klvl = level[killer]
  1157.                 kname = getname(killer)
  1158.                 kip = getip(killer)
  1159.                 kteam = getteam(killer)                
  1160.             else   
  1161.                 kname = "NULL"
  1162.                 klvl = NULL
  1163.                 kteam = -1 
  1164.             end
  1165.            
  1166.             if getplayer(victim) then
  1167.                 vlvl = level[victim]
  1168.                 vname = getname(victim)
  1169.                 vip = getip(victim)
  1170.                 vteam = getteam(victim)
  1171.                 if getplayer(killer) then
  1172.                     if vlvl == 11 then
  1173.                         level[killer] = 10
  1174.                         playerscore[killer] = 9
  1175.                         beserk = false
  1176.                         weapons[killer] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
  1177.                         sendconsoletext(victim, "Demoted to Level 10! Ain't that a bitch?!", 4, 0)
  1178.                         say(vname .. " demoted to Level 10 for betrayal.")             
  1179.                         klvl = level[killer]
  1180.                         kname = getname(killer)
  1181.                         kip = getip(killer)
  1182.                         kteam = getteam(killer)  
  1183.                         mybattery[killer] = 0
  1184.                     else   
  1185.                         if level[killer] ~= nil and level[killer] > 1 then
  1186.                             if (level[killer] - 1) >= 1 then level[killer] = level[killer] - 1 end
  1187.                             if (playerscore[killer] - 1) >= 0 then playerscore[killer] = playerscore[killer] - 1 end
  1188.                             if team_play then if (teamscore[kteam] - 1) >= 0 then teamscore[kteam] = teamscore[kteam] - 1 end end
  1189.                             mybattery[killer] = 0
  1190.                             kill(killer)
  1191.                             say(kname .. " was demoted a level and killed for betraying " .. vname)
  1192.                             if logging then log_msg(1, kname .. " was killed by server for betrayal of " .. vname) end
  1193.                             response = false
  1194.                         else
  1195.                             kill(killer)
  1196.                             say(kname .. " was killed for betraying " .. vname)
  1197.                             if logging then log_msg(1, kname .. " was killed by server for betrayal of " .. vname) end
  1198.                             response = false
  1199.                         end
  1200.                     end
  1201.                     response = false       
  1202.                 end
  1203.                 response = false   
  1204.             end
  1205.            
  1206.         elseif mode == 6 then --suicides - killer is self/victim
  1207.  
  1208.             if getplayer(victim) then
  1209.                 vlvl = level[victim]
  1210.                 vname = getname(victim)
  1211.                 vip = getip(victim)
  1212.                 vteam = getteam(victim)
  1213.                 if vlvl == 11 then
  1214.                     level[victim] = 10
  1215.                     playerscore[victim] = 9
  1216.                     beserk = false
  1217.                     weapons[victim] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
  1218.                     sendconsoletext(victim, "Demoted to Level 10! Ain't that a bitch?!", 4, 0)
  1219.                     say(vname .. " demoted to Level 10 for suicide.")
  1220.                     if logging then log_msg(1, vname .. " demoted from level 10 to 9 for suicide. Is level: " .. vlvl) end
  1221.                     response = false
  1222.                 else
  1223.                     if level[victim] ~= nil and level[victim] > 1 then
  1224.                         if (level[victim] - 1) >= 1 then level[victim] = level[victim] - 1 end
  1225.                         if (playerscore[victim] - 1) >= 0 then playerscore[victim] = playerscore[victim] - 1 end
  1226.                         if team_play then if (teamscore[vteam] - 1) >= 0 then teamscore[vteam] = teamscore[vteam] - 1 end end
  1227.                         say(vname .. " committed suicide and was demoted one level.")
  1228.                         if logging then log_msg(1, vname .. " demoted one level for suicide. Is level: " .. vlvl) end
  1229.                         response = false
  1230.                     else
  1231.                         say(vname .. " committed suicide.")
  1232.                         response = false
  1233.                     end
  1234.                     response = false
  1235.                 end
  1236.             end
  1237.            
  1238.         end
  1239.     end
  1240.    
  1241.     return response
  1242. end
  1243.  
  1244. function OnWeaponReload(player, weapon)
  1245.     local reload = nil
  1246.         if getplayer(player) then
  1247.             local m_player = getplayer(player)
  1248.             local m_objectId = readdword(m_player + 0x34)
  1249.             local m_object = getobject(m_objectId)
  1250.             if m_object then
  1251.                 local m_weaponId = readdword(m_object + 0x118)
  1252.                 if m_weaponId then
  1253.                     local m_weapon = getobject(m_weaponId)         
  1254.                     local weapname = gettaginfo(readdword(m_weapon))
  1255.                     if m_weapon then
  1256.                         if weapname == "zteam\\objects\\weapons\\single\\needler\\h3\\needler" then
  1257.                             writeword(getobject(weapon) + 0x2B8, needler_clip)
  1258.                             updateammo(weapon)
  1259.                             reload = false 
  1260.                         else
  1261.                             reload = true
  1262.                         end
  1263.                     end    
  1264.                 end
  1265.             end
  1266.         end
  1267.     return reload
  1268. end
  1269.  
  1270. function OnDamageApplication(receiving, causing, tagid, hit, backtap)
  1271.     if receiving and causing then
  1272.         local r_object = getobject(receiving)
  1273.         if r_object then
  1274.             local receiver = objectaddrtoplayer(r_object)
  1275.             if receiver then
  1276.                 local rhash = gethash(receiver)
  1277.                 local tagname,tagtype = gettaginfo(tagid)
  1278.                 last_damage[rhash] = tagname
  1279.  
  1280.             end
  1281.         end
  1282.     end
  1283.        
  1284.     return nil
  1285. end
  1286.  
  1287. function OnDamageLookup(receiving, causing, tagid)
  1288.    
  1289.     if receiving and causing and receiving ~= causing then
  1290.         local player = objectidtoplayer(causing)
  1291.         local tagname, tagtype = gettaginfo(tagid)
  1292.         local brifle = string.find(tagname, "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet")
  1293.         local melee = string.find(tagname, "melee")
  1294.         local spikerd = string.find(tagname, "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike")
  1295.         local ppistol1 = string.find(tagname, "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt")
  1296.         local ppistol2 = string.find(tagname, "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt_charged")
  1297.         local plasrifle = string.find(tagname, "halo3\\weapons\\plasma_rifle\\effects\\bolt")
  1298.         local needler = string.find(tagname, "zteam\\objects\\weapons\\single\\needler\\h3\\needle_impact" or
  1299.         "zteam\\objects\\weapons\\single\\needler\\h3\\needle_detonation" or
  1300.         "zteam\\objects\\weapons\\single\\needler\\h1\\needle_combining_explosion_shockwave" or
  1301.         "zteam\\objects\\weapons\\single\\needler\\h3\\needle_combining_explosion" or "zteam\\shared\\damage_effects\\screen_effects\\darken_medium_medium")
  1302.  
  1303.         local c_player = objectidtoplayer(causing)
  1304.         local r_player = objectidtoplayer(receiving)
  1305.  
  1306.         --log_msg(1, "tag: " .. tagname)
  1307.         if c_player and r_player then
  1308.             if melee then odl_multiplier(9999) end 
  1309.             if ppistol1 then odl_multiplier(2) end
  1310.             if ppistol2 then odl_multiplier(1.6) end
  1311.             if plasrifle then odl_multiplier(3) end
  1312.             if brifle then odl_multiplier(1.7) end
  1313.             if needler then odl_multiplier(1.25) end
  1314.         end
  1315.  
  1316.     end
  1317.  
  1318.     return nil
  1319. end
  1320.  
  1321. function OnVehicleEntry(player, veh_id, seat, mapid, relevant)
  1322.     if getplayer(player) then
  1323.         privatesay(player, getname(player) .. " NOTE: You can't kill players with vehicle or vehicle guns.")
  1324.     end
  1325.     return nil
  1326. end
  1327.    
  1328. function getplayervehicleid(player)
  1329.     local m_objectId = getplayerobjectid(player)
  1330.     if m_objectId then return readdword(getobject(m_objectId) + 0x11C) end
  1331. end
  1332.    
  1333. function ApplyHP(id, count, player)
  1334.     if count == 1 then
  1335.         if player and game_started then
  1336.             local name = getname(player)
  1337.             local lvl = level[player]  
  1338.             local m_playerObjId = getplayerobjectid(player)
  1339.             if m_playerObjId ~= nil then
  1340.                 local m_object = getobject(m_playerObjId)
  1341.                 local obj_health = readfloat(m_object + 0xE0)
  1342.                 if obj_health < 1 then
  1343.                     writefloat(m_object + 0xE0, 1)
  1344.                     sendconsoletext(player, "Bonus: Your health has been restored.", 4, 0)
  1345.                     if logging then log_msg(1, name .. " Health Bonus applied. Is Level: " .. lvl) end
  1346.                 end
  1347.             end
  1348.         end
  1349.     end
  1350.     return false
  1351. end
  1352.  
  1353. function OnClientUpdate(player)
  1354.     if getplayer(player) then
  1355.         local lvl = level[player]
  1356.         if lvl ~= nil then
  1357.             -- monitors and initiates game win announcement
  1358.             if lvl == 12 and game_started then
  1359.                 game_started = false
  1360.                 announcewin = registertimer(0, "AnnounceWin", player)
  1361.                 if logging then log_msg(1, "Game win detected - Announcement called.") end
  1362.             end
  1363.         end
  1364.     end
  1365. end
  1366.  
  1367. function AnnounceWin(id, count, player)
  1368.     -- announces game winner
  1369.     if player and game_started == false then
  1370.         local name = getname(player)   
  1371.         svcmd("sv_map_next")
  1372.         if not team_play then
  1373.             say(name .. " WINS THE GAME! ")
  1374.         else   
  1375.             local team = getteam(player)
  1376.             if team == 0 then team = "RED TEAM" elseif team == 1 then team = "BLUE TEAM" end
  1377.             say(team .. " WINS THE GAME! ")
  1378.         end    
  1379.         log_msg(1, name .. " has won the Gun-Game on " .. map_name .. "!")
  1380.     end    
  1381.     return false
  1382. end    
  1383.  
  1384. function OnTeamChange(player, old_team, new_team, relevant)
  1385.     -- prevent unbalancing teams by team change
  1386.     local response = nil
  1387.     if getplayer(player) then
  1388.         if not team_play then response = false return response end
  1389.        
  1390.         if relevant == true or relevant == 1 then
  1391.             if getteamsize(old_team) == getteamsize(new_team) then
  1392.                 privatesay(player, "You cannot change teams.")
  1393.                 response = false
  1394.             elseif getteamsize(old_team) + 1 == getteamsize(new_team) then
  1395.                 privatesay(player, "You cannot change teams.")
  1396.                 response = false
  1397.             elseif getteamsize(old_team) == getteamsize(new_team) + 1 then
  1398.                 privatesay(player, "You cannot change teams.")
  1399.                 response = false
  1400.             elseif getteamsize(old_team) > getteamsize(new_team) then
  1401.                 team_change[player] = true
  1402.                 -- transfer player score to new team score, and deduct new player score from old team score
  1403.                 if team_play then
  1404.                     teamscore[new_team] = teamscore[new_team] + playerscore[player]
  1405.                     teamscore[old_team] = teamscore[old_team] - playerscore[player]
  1406.                 end
  1407.                 mybattery[player] = 0
  1408.                 say(getname(player) .. " switched teams.")
  1409.                 response = true
  1410.             elseif getteamsize(old_team) < getteamsize(new_team) then
  1411.                 team_change[player] = true
  1412.                 -- transfer player score to new team score, and deduct new player score from old team score
  1413.                 if team_play then
  1414.                     teamscore[new_team] = teamscore[new_team] + playerscore[player]
  1415.                     teamscore[old_team] = teamscore[old_team] - playerscore[player]
  1416.                 end                            
  1417.                 mybattery[player] = 0
  1418.                 say(getname(player) .. " switched teams.")
  1419.                 response = true
  1420.             end
  1421.         elseif relevant == false or relevant == 0 then
  1422.             team_change[player] = true
  1423.             -- transfer player score to new team score, and deduct new player score from old team score
  1424.             if team_play then
  1425.                 teamscore[new_team] = teamscore[new_team] + playerscore[player]
  1426.                 teamscore[old_team] = teamscore[old_team] - playerscore[player]
  1427.             end        
  1428.             mybattery[player] = 0
  1429.             say(getname(player) .. " was team-switched by autobalance.")
  1430.             response = true
  1431.         end
  1432.        
  1433.     end
  1434.     return response
  1435. end
  1436.  
  1437. function OnObjectInteraction(player, objId, mapId)
  1438.     -- blocks players from picking up weapons and nades
  1439.     local Pass = nil
  1440.     local name, type = gettaginfo(mapId)
  1441.     if type == "weap" then
  1442.         if weapons[player] ~= nil then
  1443.             if name ~= weapons[player] then
  1444.                 Pass = false
  1445.             end
  1446.         end
  1447.     elseif type == "eqip" then
  1448.         if name == "powerups\\over shield" or name == "powerups\\health pack" or name == "powerups\\active camouflage" then -- os
  1449.             Pass = true
  1450.         else   
  1451.             Pass = false
  1452.         end
  1453.     end
  1454.     return Pass
  1455. end
  1456.  
  1457. function OnObjectCreationAttempt(mapId, parentId, player)
  1458.     local response = nil
  1459.     local name, type = gettaginfo(mapId)
  1460.     if game_started then
  1461.         -- block
  1462.         if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull") or -- oddball
  1463.             mapId == gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade") or -- frags
  1464.             mapId == gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade") then -- plasma
  1465.             response = false
  1466.         end
  1467.         -- replace
  1468.         if mapId == gettagid("eqip", "powerups\\active camouflage") then
  1469.             return gettagid("eqip", "powerups\\over shield") -- OS
  1470.         end
  1471.         -- replace
  1472.         if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag") then -- flag
  1473.             return gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol") -- ppistol
  1474.         end
  1475.  
  1476.     elseif not game_started then
  1477.         -- allow
  1478.         if mapId == gettagid("bipd", "halo3\\characters\\spartan\\mp_spartan") or -- mpbiped
  1479.             mapId == gettagid("vehi", "halo3\\vehicles\\forklift\\forklift") or -- forklift
  1480.             mapId == gettagid("vehi", "levels\\test\\foundry\\forge_objects\\soccerball\\soccerball") then         
  1481.             response = true
  1482.         end
  1483.         -- block
  1484.         if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull") or -- oddball
  1485.             mapId == gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade") or -- frags
  1486.             mapId == gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade") then -- plasma
  1487.             response = false
  1488.         end        
  1489.         -- replace
  1490.         if mapId == gettagid("eqip", "powerups\\active camouflage") then
  1491.             return gettagid("eqip", "powerups\\over shield") -- OS
  1492.         end
  1493.         -- replace
  1494.         if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag") then -- flag
  1495.             return gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol") -- ppistol
  1496.         end
  1497.                
  1498.     else
  1499.         response = false
  1500.     end
  1501.     return response    
  1502. end
  1503.  
  1504. function LoadTags()
  1505.     PP = gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol")
  1506.     NE = gettagid("weap", "zteam\\objects\\weapons\\single\\needler\\h3\\needler")
  1507.     SK = gettagid("weap", "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle")
  1508.     SG = gettagid("weap", "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun")
  1509.     PR = gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle")
  1510.     BS = gettagid("weap", "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot")
  1511.     AR = gettagid("weap", "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle")
  1512.     PI = gettagid("weap", "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum")
  1513.     BR = gettagid("weap", "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle")
  1514.     RL = gettagid("weap", "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher")
  1515.     SR = gettagid("weap", "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle")
  1516.     FL = gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag")
  1517.     BL = gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull")
  1518.    
  1519.     PP_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt")
  1520.     PP_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt_charged")
  1521.     NE_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_impact")
  1522.     NE_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_detonation")
  1523.     NE_D3 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h1\\needle_combining_explosion_shockwave")
  1524.     NE_D4 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_combining_explosion")
  1525.     SK_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike")
  1526.     SG_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\shotgun\\h3\\pellet")
  1527.     PR_D = gettagid("jpt!", "halo3\\weapons\\plasma_rifle\\effects\\bolt")
  1528.     BS_D1 = gettagid("jpt!", "zteam\\shared\\damage_effects\\misc\\projectile_detonator")
  1529.     BS_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\brute_shot\\h3\\grenade_explosion")
  1530.     AR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\bullet")
  1531.     PI_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\magnum\\h3\\bullet")
  1532.     BR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet")
  1533.     RL_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\grenade\\fragmentation_grenade\\h1\\explosion_shockwave")
  1534.     RL_D2 = gettagid("jpt!", "weapons\\rocket launcher\\explosion")
  1535.     SR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\sniper_rifle\\h3\\bullet")
  1536.  
  1537.     Melee_1 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_strike")
  1538.     Melee_2 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_slice")
  1539.     Melee_3 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_smash")
  1540.     Melee_4 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_crush")
  1541.    
  1542.     mp_biped = gettagid("bipd", "halo3\\characters\\spartan\\mp_spartan")
  1543.    
  1544.     Frag = gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade")
  1545.     Plasma = gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade")
  1546.     Healthp = gettagid("eqip", "powerups\\health pack")
  1547.     Oshield = gettagid("eqip", "powerups\\over shield")
  1548.     Acamo = gettagid("eqip", "powerups\\active camouflage")
  1549.    
  1550.     SoccerBall = gettagid("vehi", "levels\\test\\foundry\\forge_objects\\soccerball\\soccerball")
  1551.     Forklift = gettagid("vehi", "halo3\\vehicles\\forklift\\forklift")
  1552.     Spool = gettagid("vehi", "levels\\test\\foundry\\forge_objects\\warehouse_spool\\warehouse_spool")
  1553.  
  1554.     Fall_dmg = gettagid("jpt!", "globals\\new fall\\falling")
  1555.     Dist_dmg = gettagid("jpt!", "globals\\new fall\\distance")
  1556.     Veh_dmg = gettagid("jpt!", "globals\\vehicle_collision")   
  1557.    
  1558. end
  1559.  
  1560. function AutoBalance(id, count)
  1561.     if game_started and team_play and cur_players > 3 then
  1562.         Balance_Teams()
  1563.         return true
  1564.     elseif game_started and team_play and cur_players < 4 then 
  1565.         return false
  1566.     else
  1567.         return false
  1568.     end
  1569. end
  1570.  
  1571. -- inspired by 002's team balance for Sapp
  1572. function Balance_Teams()
  1573.     if game_started and team_play then
  1574.         local redteam = getteamsize(0)
  1575.         local blueteam = getteamsize(1)
  1576.         if redteam > blueteam then
  1577.             while TeamsAreUneven() do
  1578.                 while (getteamsize(0) > getteamsize(1)+1) do
  1579.                     local randomred = SelectPlayer(0)
  1580.                     if randomred ~= nil then
  1581.                         changeteam(randomred, true)
  1582.                     end
  1583.                 end
  1584.             end
  1585.         elseif blueteam > redteam then
  1586.             while TeamsAreUneven() do
  1587.                 while (getteamsize(1) > getteamsize(0)+1) do
  1588.                     local randomblu = SelectPlayer(1)
  1589.                     if randomblu ~= nil then                           
  1590.                         changeteam(randomblu, true)
  1591.                     end
  1592.                 end
  1593.             end    
  1594.         end
  1595.     end
  1596. end
  1597.  
  1598. -- inspired by 002's team balance for Sapp
  1599. function TeamsAreUneven()
  1600.     local red = getteamsize(0)
  1601.     local blue = getteamsize(1)
  1602.     if (red > blue + 1 or blue > red + 1) then return true end
  1603.     return false
  1604. end
  1605.  
  1606. function SelectPlayer(team)
  1607.     local t = {}
  1608.     for i=0,15 do
  1609.         if getplayer(i) and getteam(i) == team then
  1610.             table.insert(t, i)
  1611.         end
  1612.     end
  1613.     if #t > 0 then
  1614.         local r = getrandomnumber(1, #t+1)
  1615.         return t[r]
  1616.     end
  1617.     return nil
  1618. end
  1619.  
  1620. function ShowTargets(id, count)
  1621.     -- timer to repeatedly call roaming targets function while game is started and players > 0
  1622.     Roaming_Targets()
  1623.     return true
  1624. end
  1625.  
  1626. function Roaming_Targets(id, count)
  1627.     if game_started and cur_players > 2 and gametype ~= 5 then
  1628.         if team_play then
  1629.             local target = SelectRoamingPlayer(player)
  1630.             if target then
  1631.                 local team = getteam(target)
  1632.                 for i = 0,15 do
  1633.                     if getplayer(i) and getplayer(i) ~= getplayer(target) and getteam(i) ~= team then
  1634.                         writeword(getplayer(i) + 0x88, target)
  1635.                     end                
  1636.                 end
  1637.                 return true
  1638.             else
  1639.                 return false
  1640.             end
  1641.         else
  1642.             local target = SelectRoamingPlayer(player)
  1643.             if target then
  1644.                 for i = 0,15 do
  1645.                     if getplayer(i) and getplayer(i) ~= getplayer(target) then
  1646.                         writeword(getplayer(i) + 0x88, target)
  1647.                     end                
  1648.                 end
  1649.                 return true
  1650.             else
  1651.                 return false
  1652.             end
  1653.         end
  1654.     end
  1655. end
  1656.  
  1657. function SelectRoamingPlayer(player)
  1658.     local t = {}
  1659.     for i=0,15 do
  1660.         if getplayer(i) then
  1661.             table.insert(t, i)
  1662.         end
  1663.     end
  1664.     if #t > 0 then
  1665.         if (timerCount > #t) then
  1666.             timerCount = 0
  1667.         else
  1668.             timerCount = timerCount + 1
  1669.         end
  1670.         return t[timerCount]
  1671.     end
  1672. end
  1673.  
  1674. function OnGameEnd(stage)
  1675.     if stage == 1 then
  1676.         game_started = false
  1677.         beserk = false     
  1678.         if gameweap then
  1679.             gameweap = nil
  1680.         end
  1681.         if announcewin then
  1682.             announcewin = nil
  1683.         end
  1684.         if m_weaponId then
  1685.             m_weaponId = nil
  1686.         end
  1687.         if replaceplasmaweap then
  1688.             replaceplasmaweap = nil
  1689.         end
  1690.         if p_objectId then
  1691.             p_objectId = nil
  1692.         end
  1693.         if health then
  1694.             health = nil
  1695.         end
  1696.         if welcome then
  1697.             welcome = nil
  1698.         end
  1699.         if speedtimer then
  1700.             speedtimer = nil
  1701.         end
  1702.         if checkbattery then
  1703.             checkbattery = nil
  1704.         end
  1705.         if updatescores then
  1706.             updatescores = nil
  1707.         end
  1708.         if autobalance then
  1709.             autobalance = nil
  1710.         end
  1711.         if consoletimer then
  1712.             consoletimer = nil
  1713.         end
  1714.         if showtargets then
  1715.             showtargets = nil
  1716.         end    
  1717.     elseif stage == 3 then
  1718.         for i = 0, 15 do
  1719.             if getplayer(i) then
  1720.                 privatesay(i, "Thank you for playing the Gun-Game Arms Race for H3 Foundry!")
  1721.                 privatesay(i, "by H\174 Shaft")
  1722.             end
  1723.         end    
  1724.     end
  1725. end
  1726.  
  1727. -- Start sendconsoletext overloaded by Nugget
  1728. console = {}
  1729. console.__index = console
  1730. consoletimer = registertimer(100, "ConsoleTimer")
  1731. phasor_sendconsoletext = sendconsoletext
  1732.  
  1733. function sendconsoletext(player, message, time, order, align, height, func)
  1734.     if player then
  1735.         console[player] = console[player] or {}
  1736.         local temp = {}
  1737.         temp.player = player
  1738.         temp.id = nextid(player, order)
  1739.         temp.message = message or ""
  1740.         temp.time = time or 0.7
  1741.         temp.remain = temp.time
  1742.         temp.align = align or "left"
  1743.         temp.height = height or 0
  1744.         if type(func) == "function" then
  1745.             temp.func = func
  1746.         elseif type(func) == "string" then
  1747.             temp.func = _G[func]
  1748.         end
  1749.         console[player][temp.id] = temp
  1750.         setmetatable(console[player][temp.id], console)
  1751.         return console[player][temp.id]
  1752.     end
  1753. end
  1754.  
  1755. function nextid(player, order)
  1756.     if not order then
  1757.         local x = 0
  1758.         for k,v in pairs(console[player]) do
  1759.             if k > x + 1 then
  1760.                 return x + 1
  1761.             end
  1762.             x = x + 1
  1763.         end
  1764.         return x + 1
  1765.     else
  1766.         local original = order
  1767.         while console[player][order] do
  1768.             order = order + 0.001
  1769.             if order == original + 0.999 then break end
  1770.         end
  1771.         return order
  1772.     end
  1773. end
  1774.  
  1775. function getmessage(player, order)
  1776.     if console[player] then
  1777.         if order then
  1778.             return console[player][order]
  1779.         end
  1780.     end
  1781. end
  1782.  
  1783. function getmessages(player)
  1784.     return console[player]
  1785. end
  1786.  
  1787. function getmessageblock(player, order)
  1788.     local temp = {}
  1789.     for k,v in opairs(console[player]) do
  1790.         if k >= order and k < order + 1 then
  1791.             table.insert(temp, console[player][k])
  1792.         end
  1793.     end
  1794.     return temp
  1795. end
  1796.  
  1797. function console:getmessage()
  1798.     return self.message
  1799. end
  1800.  
  1801. function console:append(message, reset)
  1802.     if console[self.player] then
  1803.         if console[self.player][self.id] then
  1804.             if getplayer(self.player) then
  1805.                 if reset then
  1806.                     if reset == true then
  1807.                         console[self.player][self.id].remain = console[self.player][self.id].time
  1808.                     elseif tonumber(reset) then
  1809.                         console[self.player][self.id].time = tonumber(reset)
  1810.                         console[self.player][self.id].remain = tonumber(reset)
  1811.                     end
  1812.                 end
  1813.                 console[self.player][self.id].message = message or ""
  1814.                 return true
  1815.             end
  1816.         end
  1817.     end
  1818. end
  1819.  
  1820. function console:shift(order)
  1821.     local temp = console[self.player][self.id]
  1822.     console[self.player][self.id] = console[self.player][order]
  1823.     console[self.player][order] = temp
  1824. end
  1825.  
  1826. function console:pause(time)
  1827.     console[self.player][self.id].pausetime = time or 5
  1828. end
  1829.  
  1830. function console:delete()
  1831.     console[self.player][self.id] = nil
  1832. end
  1833.  
  1834. function ConsoleTimer(id, count)
  1835.     for i,_ in opairs(console) do
  1836.         if tonumber(i) then
  1837.             if getplayer(i) then
  1838.                 for k,v in opairs(console[i]) do
  1839.                     if console[i][k].pausetime then
  1840.                         console[i][k].pausetime = console[i][k].pausetime - 0.1
  1841.                         if console[i][k].pausetime <= 0 then
  1842.                             console[i][k].pausetime = nil
  1843.                         end
  1844.                     else
  1845.                         if console[i][k].func then
  1846.                             if not console[i][k].func(i) then
  1847.                                 console[i][k] = nil
  1848.                             end
  1849.                         end
  1850.                         if console[i][k] then
  1851.                             console[i][k].remain = console[i][k].remain - 0.1
  1852.                             if console[i][k].remain <= 0 then
  1853.                                 console[i][k] = nil
  1854.                             end
  1855.                         end
  1856.                     end
  1857.                 end
  1858.                 if table.len(console[i]) > 0 then
  1859.                     local paused = 0
  1860.                     for k,v in pairs(console[i]) do
  1861.                         if console[i][k].pausetime then
  1862.                             paused = paused + 1
  1863.                         end
  1864.                     end
  1865.                     if paused < table.len(console[i]) then
  1866.                         local str = ""
  1867.                         for i = 0,30 do
  1868.                             str = str .. " \n"
  1869.                         end
  1870.                         phasor_sendconsoletext(i, str)
  1871.                         for k,v in opairs(console[i]) do
  1872.                             if not console[i][k].pausetime then
  1873.                                 if console[i][k].align == "right" or console[i][k].align == "center" then
  1874.                                     phasor_sendconsoletext(i, consolecenter(string.sub(console[i][k].message, 1, 78)))
  1875.                                 else
  1876.                                     phasor_sendconsoletext(i, string.sub(console[i][k].message, 1, 78))
  1877.                                 end
  1878.                             end
  1879.                         end
  1880.                     end
  1881.                 end
  1882.             else
  1883.                 console[i] = nil
  1884.             end
  1885.         end
  1886.     end
  1887.    
  1888.     return true
  1889. end
  1890.  
  1891. function consolecenter(text)
  1892.     if text then
  1893.         local len = string.len(text)
  1894.         for i = len + 1, 78 do
  1895.             text = " " .. text
  1896.         end
  1897.         return text
  1898.     end
  1899. end
  1900.  
  1901. function opairs(t)
  1902.     local keys = {}
  1903.     for k,v in pairs(t) do
  1904.         table.insert(keys, k)
  1905.     end    
  1906.     table.sort(keys,
  1907.     function(a,b)
  1908.         if type(a) == "number" and type(b) == "number" then
  1909.             return a < b
  1910.         end
  1911.         an = string.lower(tostring(a))
  1912.         bn = string.lower(tostring(b))
  1913.         if an ~= bn then
  1914.             return an < bn
  1915.         else
  1916.             return tostring(a) < tostring(b)
  1917.         end
  1918.     end)
  1919.     local count = 1
  1920.     return function()
  1921.         if table.unpack(keys) then
  1922.             local key = keys[count]
  1923.             local value = t[key]
  1924.             count = count + 1
  1925.             return key,value
  1926.         end
  1927.     end
  1928. end
  1929.  
  1930. function table.len(t)
  1931.     local count = 0
  1932.     for k,v in pairs(t) do
  1933.         count = count + 1
  1934.     end
  1935.     return count
  1936. end
  1937. -- Stop sendconsoletext overloaded
  1938.  
  1939. -- Created by H® Shaft.
  1940. -- Thanks to Oxide, AelitePrime, Nugget & Wizard.
  1941. -- Visit http://halorace.org/forum/index.php?topic=514.0 or
  1942. -- Visit http://pastebin.com/u/HR_Shaft for more phasor scripts
  1943. -- Special thanks to AelitePrime, as this was an attempt to script patterned after his style similar to his Zombie script 4.1, and other scripts we have mutually developed.
  1944. -- Note: This was written and developed by H® Shaft prior to the release of any other similar script with similar names. Any claims of duplication of concept/script are 100% bullpucky.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement