Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[ ### Gun-Game v2 for H3 Foundry ###]]--
- --[[ ### by H® Shaft for Phasor v2 ###]]--
- -- Script designed specifically and only for the Halo CE map H3 Foundry: Link: http://hce.halomaps.org/index.cfm?fid=6677
- -- GUN GAME: Based on the Counter Strike game called 'Gun Game.' Also, derivatives known as 'Global Offensive' & 'Arsenal: Arms Race'
- -- Each time you kill with a weapon, you will be given a new weapon. (oddball and flag excluded weapons)
- -- The first person to kill with each weapon in the game - wins!
- -- There are 10 weapons. Starting with Plasma Pistol and ending with Sniper Rifle. All weapons have infinite ammo.
- -- When you kill another player, you will only advance if you survive the kill. If you die during the kill, you don't advance.
- -- Other weapons, grenades & powerups are blocked. Vehicle gun and collision damage are blocked.
- -- Melee is instant kill, and WILL advance your level.
- -- If you are on level 11, and get killed by another player, betray or suicide, you go down one level.
- -- Health bonus applied to players when reaching levels 4 and 8 or when any other player reaches level 11.
- -- Beserk Mode: When reaching level 11, you activate 'Beserk Mode' which temporarily speeds up all other players and heals the injured.
- -- Your player speed is based on your weapon: With a strong weapon, you move slower than you will with a weaker weapon.
- -- edit --
- 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
- -- don't edit --
- team_play = false
- map_reset = false
- showtargets = nil
- roaming_targets = true
- weapons = {}
- level = {}
- last_damage = {}
- team_change = {}
- mybattery = {}
- meleekills = {}
- playerscore = {}
- teamscore = {}
- spiker_clip = 40
- brifle_clip = 36
- brute_clip = 6
- needler_clip = 40
- shotgun_clip = 12
- assault_clip = 32
- pistol_clip = 12
- rocket_clip = 2
- sniper_clip = 4
- battery = 0
- timerCount = 0
- to_win = 1000
- cur_players = 0
- -- prefix globals
- default_script_prefix = "\171GunGame\187 "
- phasor_privatesay = privatesay
- phasor_say = say
- function GetRequiredVersion()
- return 200
- end
- function OnScriptLoad(process, game, persistent)
- GAME = game
- GetGameAddresses(game)
- processid = process
- Persistent = persistent
- ScriptLoad()
- LoadTags()
- end
- function OnScriptUnload()
- writedword(ctf_score_patch, 0xFFFDE9E8)
- writebyte(ctf_score_patch1, 0xFF)
- writebyte(slayer_score_patch, 0x74)
- writebyte(slayer_score_patch2, 0x75)
- end
- function OnNewGame(map)
- ScriptLoad()
- team_play = getteamplay()
- gametype = readbyte(gametype_base + 0x30)
- game_started = false
- LoadTags()
- if not new_game_timer then
- new_game_timer = registertimer(0, "NewGameTimer")
- end
- end
- function ApplyPatches()
- writedword(ctf_score_patch, 0x90909090)
- writebyte(ctf_score_patch1, 0x90)
- writebyte(slayer_score_patch, 0xEB)
- writebyte(slayer_score_patch2, 0xEB)
- end
- function ScriptLoad()
- if Persistent then
- -- edit --
- logging = false -- | true enable full script game logging, false to disable - can be spammy to the log, best used for tournaments/scrims/debugging
- -- don't edit --
- game_started = false
- team_play = false
- beserk = false
- weapons = {}
- level = {}
- last_damage = {}
- team_change = {}
- mybattery = {}
- meleekills = {}
- playerscore = {}
- teamscore = {}
- spiker_clip = 40
- brifle_clip = 36
- brute_clip = 6
- needler_clip = 40
- shotgun_clip = 12
- assault_clip = 32
- pistol_clip = 12
- rocket_clip = 2
- sniper_clip = 4
- battery = 0
- timerCount = 0
- to_win = 1000
- cur_players = 0
- roaming_targets = false
- if new_game_timer == nil then
- new_game_timer = registertimer(0, "NewGameTimer")
- end
- end
- GetGameAddresses(game)
- showtargets = nil
- game_started = false
- team_play = false
- team_play = getteamplay()
- gametype = readbyte(gametype_base + 0x30)
- LoadTags()
- for i = 0,15 do
- if getplayer(i) then
- local hash = gethash(i)
- last_damage[hash] = nil
- mybattery[i] = 1
- weapons[i] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- level[i] = 1
- playerscore[i] = 0
- team_change[i] = false
- cur_players = cur_players + 1
- end
- end
- if gametype ~= 5 and cur_players > 2 then
- roaming_targets = true -- | true enable roaming target/navs to appear over heads of all players. false = disable
- showtargets = registertimer(250, "ShowTargets")
- end
- if gametype == 3 or gametype == 5 then
- for i=0,15 do
- if getplayer(i) then
- privatesay(i, "Race and Oddball are not compatible with Gun-Game. ", false)
- end
- end
- log_msg(4, "##GUN-GAME## Race and Oddball are NOT compatible with Gun-Game: try CTF, Slayer & KOTH.") -- log error in scripts log
- log_msg(1, "##GUN-GAME## Race and Oddball are NOT compatible with Gun-Game: try CTF, Slayer & KOTH.") -- log error in game log
- else
- game_started = false
- if new_game_timer == nil then
- new_game_timer = registertimer(0, "NewGameTimer")
- end
- end
- end
- function OnPlayerJoin(player)
- if getplayer(player) then
- local name = getname(player)
- cur_players = cur_players + 1
- mybattery[player] = 1
- weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- level[player] = 1
- playerscore[player] = 0
- team_change[player] = false
- welcome = registertimer(9000, "Welcome", player)
- if game_started and team_play and cur_players > 3 and TeamsAreUneven() then Balance_Teams() end
- if game_started and cur_players > 2 and roaming_targets and not showtargets then
- if gametype ~= 5 then
- showtargets = registertimer(250, "ShowTargets")
- end
- end
- if logging then log_msg(1, name .. " given Plasma Pistol on spawn.") end
- end
- end
- function Welcome(id, count, player)
- if count == 1 then
- if getplayer(player) then
- sendconsoletext(player, "Welcome to Gun-Game Arms Race!", 10, 0)
- sendconsoletext(player, "Each time you kill with a weapon, you will be given a new weapon.", 10, 0)
- sendconsoletext(player, "The first person to kill with every weapon in the game - wins!", 10, 0)
- sendconsoletext(player, "There are 11 weapons, good luck! type @help for more info.", 10, 0)
- end
- end
- return false
- end
- function OnPlayerLeave(player)
- if getplayer(player) then
- cur_players = cur_players - 1
- if level[player] == 10 then
- beserk = false
- end
- mybattery[player] = {}
- team_change[player] = {}
- weapons[player] = {}
- level[player] = {}
- playerscore[player] = 0
- if cur_players < 3 and showtargets then
- showtargets = nil
- end
- if game_started and team_play and cur_players > 3 and TeamsAreUneven() then Balance_Teams() end
- end
- end
- function OnPlayerSpawn(player, m_objectId)
- if getplayer(player) then
- local hash = gethash(player)
- last_damage[hash] = nil
- team_change[player] = false
- ChangeFFAColor(player)
- if game_started then
- gameweap = registertimer(0, "AssignGameWeapons", player)
- end
- end
- end
- function ChangeFFAColor(player)
- if getplayer(player) then
- local m_objectId = getplayerobjectid(player)
- if m_objectId then
- local m_object = getobject(m_objectId)
- if m_object then
- local m_player = getplayer(player)
- local color = getrandomnumber(1, 18)
- writeword(m_player + 0x60, color)
- end
- end
- end
- end
- function OnServerCommand(player, command)
- local allow = nil
- local cmd = tokenizecmdstring(command)
- local tokencount = #cmd
- if tokencount > 0 then
- if cmd[1] == "sv_map_reset" then
- map_reset = true
- showtargets = nil
- ScriptLoad()
- privatesay(player, "**RESET** The game has been reset and scripts reloaded. ")
- if logging then log_msg(1, getname(player) .. " used sv_map_reset command.") end
- for i=0,15 do
- if getplayer(i) then
- kill(i)
- privatesay(i, "The game has been reset. ")
- end
- end
- allow = true
- elseif cmd[1] == "sv_script_reload" then
- map_reset = true
- showtargets = nil
- writedword(gametime_base + 0x10, 0)
- ScriptLoad()
- privatesay(player, "**RELOAD** The game has been reset and scripts reloaded. ")
- if logging then log_msg(1, getname(player) .. " used sv_script_reload command.") end
- for i=0,15 do
- if getplayer(i) then
- kill(i)
- privatesay(i, "The game has been reset. ")
- end
- end
- allow = true
- end
- end
- return allow
- end
- function NewGameTimer(id, count)
- if map_reset == true then
- if team_play and cur_players > 3 then Balance_Teams() end
- map_reset = false
- end
- game_started = true
- team_play = getteamplay()
- cur_players = readword(network_base, 0x1A0)
- if team_play then
- teamscore[0] = 0
- teamscore[1] = 0
- for i=0,15 do
- if getplayer(i) then
- cur_players = cur_players + 1
- end
- end
- if not autobalance and game_started and cur_players > 3 then
- autobalance = registertimer(60000, "AutoBalance")
- end
- end
- if Persistent then
- log_msg(1, "Gun-Game has begun on " .. map_name .. " and running as a persistent script.")
- else
- log_msg(1, "Gun-Game has begun on " .. map_name .. " and running as a non-persistent script.")
- end
- for x = 0,15 do
- if getplayer(x) then
- local hash = gethash(x)
- local name = getname(x)
- local m_objectId = getplayerobjectid(x)
- last_damage[hash] = nil
- team_change[x] = false
- mybattery[x] = 0
- weapons[x] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- level[x] = 1
- playerscore[x] = 0
- speedtimer = registertimer(0, "SpeedTimer", x)
- if m_objectId ~= nil then
- local m_object = getobject(m_objectId)
- if m_object then
- for i = 0,3 do
- local weapID = readdword(getobject(m_objectId), 0x2F8 + i*4)
- if weapID ~= 0xFFFFFFFF then
- destroyobject(weapID)
- end
- end
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 0)
- end
- if level[x] == 1 then
- battery = 0
- weapons[x] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- sendconsoletext(x, "Level 1: Plasma Pistol - Speed: 135%", 5, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 1)
- end
- end
- local m_weaponId = createobject(gettagid("weap", weapons[x]), 0, 20, false, 0, 0, 0)
- if m_weaponId then
- local m_weapon = getobject(m_weaponId)
- if m_weapon then
- assignweapon(x, m_weaponId)
- if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma on new game.") end
- if m_weapon then
- mybattery[x] = 1
- end
- end
- end
- end
- end
- if not updatescores and game_started then
- updatescores = registertimer(500, "Update_Scores")
- end
- if not checkbattery then
- checkbattery = registertimer(1000, "CheckBattery")
- end
- end
- new_game_timer = nil
- return false
- end
- function AssignGameWeapons(id, count, player)
- if map_reset == true then
- map_reset = false
- end
- local clip = 0
- local ammo = 9999
- if game_started then
- if getplayer(player) then
- local m_objectId = getplayerobjectid(player)
- local name = getname(player)
- local lvl = level[player]
- if m_objectId ~= nil then
- if gametype == 1 or gametype == 2 or gametype == 4 or gametype == 5 then
- speedtimer = registertimer(0, "SpeedTimer", player)
- end
- local m_object = getobject(m_objectId)
- if m_object then
- for i = 0,3 do
- local weapID = readdword(getobject(m_objectId), 0x2F8 + i*4)
- if weapID ~= 0xFFFFFFFF then
- destroyobject(weapID)
- end
- end
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " weapon assignment initiated - weapons & nades removed. Is level: " .. lvl) end
- if level[player] == nil then
- level[player] = 1
- weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- sendconsoletext(player, "Level 1: Plasma Pistol - Speed: 135%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 1)
- end
- if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma. Is level: " .. lvl) end
- elseif level[player] == 1 then
- weapons[player] = "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol"
- sendconsoletext(player, "Level 1: Plasma Pistol - Speed: 135%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 1)
- end
- if logging then log_msg(1, name .. " given Plasma Pistol, 1 plasma. Is level: " .. lvl) end
- elseif level[player] == 2 then
- clip = needler_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\needler\\h3\\needler"
- sendconsoletext(player, "Level 2: Needler - Speed: 135%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 1)
- end
- if logging then log_msg(1, name .. " given Needler, 1 plasma. Is level: " .. lvl) end
- elseif level[player] == 3 then
- clip = spiker_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle"
- sendconsoletext(player, "Level 3: Spike Rifle - Speed: 135%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 2)
- end
- if logging then log_msg(1, name .. " given Spike Rifle, 1 plasma. Is level: " .. lvl) end
- elseif level[player] == 4 then
- clip = shotgun_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun"
- sendconsoletext(player, "Level 4: Shotgun - Speed: 125%", 4, 0)
- sendconsoletext(player, "This Shotgun has a VERY short range - get up-close for a kill.", 8, 0)
- if m_object then
- writebyte(m_object + 0x31E, 4)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Shotgun, 4 frags, health bonus. Is level: " .. lvl) end
- elseif level[player] == 5 then
- weapons[player] = "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle"
- sendconsoletext(player, "Level 5: Plasma Rifle - Speed: 125%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 2)
- end
- if logging then log_msg(1, name .. " given Plasma Rifle, 1 frag. Is level: " .. lvl) end
- elseif level[player] == 6 then
- clip = brute_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot"
- sendconsoletext(player, "Level 6: Brute Shot - Speed: 75%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Brute Shot, 0 nades. Is level: " .. lvl) end
- elseif level[player] == 7 then
- clip = assault_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle"
- sendconsoletext(player, "Level 7: Assault Rifle - Speed: 75%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 2)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Assault Rifle, 2 frags. Is level: " .. lvl) end
- elseif level[player] == 8 then
- clip = pistol_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum"
- sendconsoletext(player, "Level 8: Magnum Pistol - Speed: 85%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Magnum Pistol, 0 nades, health bonus. Is level: " .. lvl) end
- elseif level[player] == 9 then
- clip = brifle_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle"
- sendconsoletext(player, "Level 9: Battle Rifle - Speed: 75%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 0)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Battle Rifle, 0 nades. Is level: " .. lvl) end
- elseif level[player] == 10 then
- clip = rocket_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
- sendconsoletext(player, "Level 10: Rocket Launcher - Speed: 65%", 4, 0)
- if m_object then
- writebyte(m_object + 0x31E, 1)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Rocket Launcher, 1 frag. Is level: " .. lvl) end
- elseif level[player] == 11 then
- clip = sniper_clip
- weapons[player] = "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle"
- sendconsoletext(player, "Level 11: Sniper Rifle - Speed: 95%", 4, 0)
- sendconsoletext(player, "Final Level, Either win the game, or get demoted!", 4, 0)
- say(name .. " has reached level 11! Gang-up on 'em before it's too late!")
- if m_object then
- writebyte(m_object + 0x31E, 2)
- writebyte(m_object + 0x31F, 0)
- end
- if logging then log_msg(1, name .. " given Sniper Rifle, 2 frags, camo removed if any. Is level: " .. lvl) end
- end
- local m_weaponId = createobject(gettagid("weap", weapons[player]), 0, 20, false, 0, 0, 0)
- if m_weaponId then
- local m_weapon = getobject(m_weaponId)
- assignweapon(player, m_weaponId)
- if m_weapon then
- if (level[player] == 1) or (level[player] == 5) then
- mybattery[player] = 1
- else
- mybattery[player] = 0
- writeword(m_weapon + 0x2B6, ammo)
- writeword(m_weapon + 0x2B8, clip)
- updateammo(m_weaponId)
- end
- end
- end
- end
- end
- end
- return false
- end
- function CheckBattery(id, count, player)
- -- checks battery level for plasma weapons and assigns replacement if low battery: plasma pistol, plasma rifle and plasma cannon
- for i = 0,15 do
- if getplayer(i) then
- if mybattery[i] == 1 then
- local name = getname(i)
- local lvl = level[i]
- local m_objectId = getplayerobjectid(i)
- if m_objectId ~= nil then
- local m_object = getobject(m_objectId)
- if m_object then
- local m_weaponId = readdword(m_object + 0x118)
- if m_weaponId then
- local m_weapon = getobject(m_weaponId)
- if m_weapon then
- if readfloat(m_weapon + 0x240) >= 0.84 then
- destroyplayerweaps(i)
- replaceplasmaweap = registertimer(0, "ReplacePlasmaWeap", i)
- if logging then log_msg(1, name .. " has a low battery on battery check. Is level: " .. lvl) end
- end
- end
- end
- end
- end
- end
- end
- end
- return true
- end
- function ReplacePlasmaWeap(id, count, player)
- -- replaces low battery plasma weapons
- if count == 1 then
- if player ~= nil and game_started then
- local name = getname(player)
- local lvl = level[player]
- if mybattery[player] == 1 then
- local m_weaponId = registertimer(0, "AssignGameWeapons", player)
- if logging then log_msg(1, name .. " was given assigment to replace plasma weapon. Is level: " .. lvl) end
- privatesay(player, "Battery recharged.")
- mybattery[player] = 0
- end
- end
- end
- return false
- end
- function Update_Scores(id, count)
- -- continuous score updating, not conditioned to game_started, updates negative values to 0 to prevent sabotage
- if not team_play then
- for i = 0,15 do
- if getplayer(i) then
- if playerscore[i] == nil or playerscore[i] < 0 then playerscore[i] = 0 end
- Write_Player_Score(i, playerscore[i])
- end
- end
- else
- for i = 0,15 do
- if getplayer(i) then
- if playerscore[i] == nil or playerscore[i] < 0 then playerscore[i] = 0 end
- Write_Player_Score(i, playerscore[i])
- end
- end
- if teamscore[0] == nil or teamscore[0] < 0 then teamscore[0] = 0 end
- if teamscore[1] == nil or teamscore[1] < 0 then teamscore[1] = 0 end
- Write_Team_Score(0, teamscore[0])
- Write_Team_Score(1, teamscore[1])
- end
- return true
- end
- function Write_Player_Score(player, score)
- -- writes the players score
- if gametype == 1 then
- if player then
- local m_player = getplayer(player)
- writeword(m_player + 0xC8, score)
- end
- elseif gametype == 2 then
- if player then
- local m_player = getplayer(player)
- writedword(slayer_globals + 0x40 + player*4, score)
- end
- elseif gametype == 5 then
- if player then
- local m_player = getplayer(player)
- writeword(m_player + 0xC6, 0x0, score)
- end
- end
- end
- function Write_Team_Score(team, score)
- -- writes the team score
- if gametype == 1 then
- writedword(ctf_globals + team*4 + 0x10, score)
- elseif gametype == 2 then
- writedword(slayer_globals + team*4, score)
- elseif gametype == 5 then
- if team == 0 then
- writedword(team_race_scores + 0x0, score)
- elseif team == 1 then
- writedword(team_race_scores + 0x4, score)
- end
- end
- end
- function GetGameAddresses(game)
- if game == "PC" or GAME == "PC" then
- map_name = readstring(0x698F21)
- gametype_base = 0x671340
- network_base = 0x745BA8
- gametime_base = 0x671420
- gametype_name = readwidestring(gametype_base)
- team_race_scores = 0x63A028
- race_globals = 0x639FA0
- ctf_globals = 0x639B98
- ctf_score_patch = 0x488602
- ctf_score_patch1 = 0x488606
- slayer_globals = 0x63A0E8
- slayer_score_patch = 0x48F428
- slayer_score_patch2 = 0x48F23E
- else
- map_name = readstring(0x61D151)
- gametype_base = 0x5F5498
- network_base = 0x6C7988
- gametime_base = 0x5F55BC
- gametype_name = readwidestring(gametype_base)
- team_race_scores = 0x5BD028
- race_globals = 0x5BDFC0
- ctf_globals = 0x5BDBB8
- ctf_score_patch = 0x463472
- ctf_score_patch1 = 0x463476
- slayer_globals = 0x5BE108
- slayer_score_patch = 0x469CF8
- slayer_score_patch2 = 0x4691CE
- end
- end
- function getteamplay()
- if readbyte(gametype_base + 0x34) == 1 then
- to_win = 1000
- return true
- else
- to_win = 1000
- return false
- end
- end
- function privatesay(player, message, script_prefix)
- if GAME == "PC" then
- phasor_privatesay(player, (script_prefix or default_script_prefix) .. " " .. message, false)
- else
- phasor_privatesay(player, message, false)
- end
- end
- function say(message, script_prefix)
- if GAME == "PC" then
- phasor_say((script_prefix or default_script_prefix) .. " " .. message, false)
- else
- phasor_say(message, false)
- end
- end
- function getweaponobjectid(player, slot)
- local m_objectId = getplayerobjectid(player)
- if m_objectId then return readdword(getobject(m_objectId) + 0x2F8 + slot*4) end
- end
- function destroyplayerweaps(player)
- for i=0,3 do
- local weap_id = getweaponobjectid(player, i)
- if weap_id ~= 0xFFFFFFFF then destroyobject(weap_id) end
- end
- end
- function Booster(id, count, arg)
- if count == 1 and game_started then
- local player = arg[1]
- if getplayer(player) then
- local name = getname(player)
- local lvl = level[player]
- local m_playerObjId = getplayerobjectid(player)
- if m_playerObjId ~= nil and lvl <= 9 then
- local m_object = getobject(m_playerObjId)
- local obj_health = readfloat(m_object + 0xE0)
- if obj_health < 1 then
- writefloat(m_object + 0xE0, 1)
- sendconsoletext(player, "Bonus! Health restored!", 5, 0)
- if logging then log_msg(1, name .. " health restored from booster function. Is level: " .. lvl) end
- end
- end
- end
- end
- return false
- end
- function SpeedTimer(id, count, player)
- if player then
- local name = getname(player)
- local lvl = level[player]
- if level[player] == 1 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 1.35) -- Plasma Pistol
- end
- if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
- elseif level[player] == 2 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 1.35) -- Needler
- end
- if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
- elseif level[player] == 3 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 1.35) -- Spike Rifle
- end
- health = registertimer(0, "ApplyHP", player)
- if logging then log_msg(1, name .. " speed set at 1.35. Is level: " .. lvl) end
- elseif level[player] == 4 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 1.25) -- Shotgun
- applycamo(player, 20)
- end
- if logging then log_msg(1, name .. " speed set at 1.50. Is level: " .. lvl) end
- elseif level[player] == 5 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 1.25) -- Plasma Rifle
- end
- if logging then log_msg(1, name .. " speed set at 1.25. Is level: " .. lvl) end
- elseif level[player] == 6 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 0.75) -- Brute Shot
- end
- if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
- health = registertimer(0, "ApplyHP", player)
- elseif level[player] == 7 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 0.75) -- Assault Rifle
- end
- if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
- elseif level[player] == 8 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 0.85) -- Magnum Pistol
- end
- if logging then log_msg(1, name .. " speed set at 0.65. Is level: " .. lvl) end
- elseif level[player] == 9 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 0.75) -- Battle Rifle
- end
- if logging then log_msg(1, name .. " speed set at 0.75. Is level: " .. lvl) end
- health = registertimer(0, "ApplyHP", player)
- elseif level[player] == 10 then
- if beserk then
- setspeed(player, 1.5)
- sendconsoletext(player, "BESERK MODE!", 4, 1)
- else
- setspeed(player, 0.65) -- Rocket Launcher
- end
- if logging then log_msg(1, name .. " speed set at 0.65. Is level: " .. lvl) end
- elseif level[player] == 11 then
- setspeed(player, 0.95) -- Sniper Rifle
- health = registertimer(0, "ApplyHP", player)
- if logging then log_msg(1, name .. " speed set at 0.95 Is level: " .. lvl) end
- end
- end
- return false
- end
- function OnServerChat(player, type, message)
- local response = nil
- if player then
- name = getname(player)
- if string.lower(message) == "help" or string.lower(message) == "@help" or string.lower(message) == "/help" then
- privatesay(player, "Each time you kill with a weapon, you will be given a new weapon.")
- privatesay(player, "The first person to kill with each weapon in the game - wins!")
- privatesay(player, "There are 11 weapons. Starting with Plasma Pistol and ending with Sniper Rifle.")
- privatesay(player, "Other weapons & grenades are blocked, vehicle damage and vehicle guns are blocked")
- privatesay(player, "If you are on level 11, and get killed, you go down one level.")
- say(name .. " is reading the @help menu. ")
- return false
- end
- if string.lower(message) == "balance" then
- if isadmin(player) then
- if team_play then
- balance = registertimer(50, "Balance_Teams")
- else
- privatesay(player, "Not a team game.")
- end
- end
- return false
- end
- end
- return response
- end
- function OnPlayerKill(killer, victim, mode)
- local response = false
- if game_started then
- mybattery[victim] = 0
- if mode == 0 then -- player was killed by server
- if getplayer(victim) then
- if team_change[victim] then
- response = false
- else
- vlvl = level[victim]
- vname = getname(victim)
- vhash = gethash(victim)
- privatesay(victim, "You were killed by the server.")
- if logging then log_msg(1, vname .. " was killed by the server. Is level: " .. vlvl) end
- response = false
- end
- response = false
- end
- elseif mode == 1 then -- player was killed by falling or team-change
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vhash = gethash(victim)
- if not team_change[victim] and not map_reset then
- if last_damage[vhash] == "globals\\new fall\\falling" or last_damage[vhash] == "globals\\new fall\\distance" then
- say(vname .. " fell and died.")
- if logging then log_msg(1, vname .. " was killed by fall damage. Is level: " .. vlvl) end
- response = false
- end
- elseif team_change[victim] and map_reset then
- team_change[victim] = false
- if logging then log_msg(1, vname .. " was killed by team change. Is level: " .. vlvl) end
- response = false
- end
- end
- elseif mode == 2 then -- player was killed by the guardians
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vhash = gethash(victim)
- say(vname .. " was killed by the guardians. ", false)
- if logging then log_msg(1, vname .. " was killed by guardians. Is level: " .. vlvl) end
- response = false
- end
- elseif mode == 3 then -- player was killed by vehicle
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vhash = gethash(victim)
- say(vname .. " was killed by a vehicle. ")
- if logging then log_msg(1, vname .. " was killed by a vehicle. Is level: " .. vlvl) end
- response = false
- end
- elseif mode == 4 then -- player was killed by another player
- if getplayer(killer) then
- klvl = level[killer]
- kname = getname(killer)
- khash = gethash(killer)
- else
- kname = "NULL"
- klvl = NULL
- end
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vhash = gethash(victim)
- if vlvl == 11 then
- privatesay(victim, "Demoted one level! Ain't that a bitch?!")
- say(vname .. " demoted to Level 10 for getting killed.")
- weapons[victim] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
- level[victim] = 10
- playerscore[victim] = 9
- beserk = false
- if logging then log_msg(1, vname .. " level 11 demoted to 10 for being killed by another player.") end
- response = false
- end
- if last_damage[vhash] then
- if getplayer(killer) then
- klvl = level[killer]
- kname = getname(killer)
- khash = gethash(killer)
- local k_objectId = getplayerobjectid(killer)
- if k_objectId ~= nil then
- -- Plasma Pistol
- if weapons[killer] == "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol" then
- 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
- say(kname .. " killed " .. vname .. " with a Plasma Pistol. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Plasma Pistol.")
- end
- level[killer] = 2
- playerscore[killer] = 1
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Needler
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\needler\\h3\\needler" then
- 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
- 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
- say(kname .. " killed " .. vname .. " with a Needler. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Needler.")
- end
- level[killer] = 3
- playerscore[killer] = 2
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- -- Spiker
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike" then
- say(kname .. " killed " .. vname .. " with a Spike Rifle. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Spike Rifle.")
- end
- level[killer] = 4
- playerscore[killer] = 3
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Shotgun
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\shotgun\\h3\\pellet" then
- say(kname .. " killed " .. vname .. " with a Shotgun. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Shotgun.")
- end
- level[killer] = 5
- playerscore[killer] = 4
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Plasma Rifle
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle" then
- if last_damage[vhash] == "halo3\\weapons\\plasma_rifle\\effects\\bolt" then
- say(kname .. " killed " .. vname .. " with a Plasma Rifle. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Plasma Rifle.")
- end
- level[killer] = 6
- playerscore[killer] = 5
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Brute Shot
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot" then
- say(kname .. " killed " .. vname .. " with a Brute Shot.")
- --[[
- if last_damage[vhash] == "halo3\\hud_v2\\ui\\force_zoom_out" then
- say(kname .. " killed " .. vname .. " with a Brute Shot.")
- elseif last_damage[vhash] == "zteam\\shared\\damage_effects\\misc\\projectile_detonator" then
- say(kname .. " killed " .. vname .. " with a Brute Shot.")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Brute Shot.")
- end ]]--
- level[killer] = 7
- playerscore[killer] = 6
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Assault Rifle
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\bullet" then
- say(kname .. " killed " .. vname .. " with an Assault Rifle. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with an Assault Rifle.")
- end
- level[killer] = 8
- playerscore[killer] = 7
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Magnum Pistol
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\magnum\\h3\\bullet" then
- say(kname .. " killed " .. vname .. " with a Magnum Pistol. ")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Magnum Pistol.")
- end
- level[killer] = 9
- playerscore[killer] = 8
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Battle Rifle
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet" then
- say(kname .. " killed " .. vname .. " with a Battle Rifle.")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Battle Rifle.")
- end
- level[killer] = 10
- playerscore[killer] = 9
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Rocket Launcher
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\grenade\\fragmentation_grenade\\h1\\explosion_shockwave" or last_damage[vhash] == "weapons\\rocket launcher\\explosion" then
- say(kname .. " killed " .. vname .. " with a Rocket Launcher advanced to Final Level!")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Rocket Launcher advanced to Final Level!")
- end
- level[killer] = 11
- playerscore[killer] = 10
- beserk = true
- for i=0,15 do
- if getplayer(i) then
- speedtimer = registertimer(0, "SpeedTimer", i)
- end
- end
- gameweap = registertimer(0, "AssignGameWeapons", killer)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- Sniper Rifle
- elseif weapons[killer] == "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle" then
- if last_damage[vhash] == "zteam\\objects\\weapons\\single\\sniper_rifle\\h3\\bullet" then
- say(kname .. " killed " .. vname .. " with a Sniper Rifle.")
- elseif string.find(last_damage[vhash], "melee") then
- say(kname .. " melee'd " .. vname .. " with a Sniper Rifle.")
- end
- level[killer] = 12
- playerscore[killer] = playerscore[killer] + 11
- if team_play then kteam = getteam(killer) teamscore[kteam] = teamscore[kteam] + 11 end
- beserk = false
- if logging then log_msg(1, vname .. " was killed by " .. kname .. " who is level: " .. klvl) end
- response = false
- -- grenades
- 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
- 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
- say(kname .. " killed " .. vname .. " with a grenade.")
- sendconsoletext(killer, "No level advancement for grenade kills.", 4, 0)
- if logging then log_msg(1, vname .. " was killed by " .. kname .. "'s grenade who is level: " .. klvl) end
- response = false
- end
- else
- response = false
- end
- end
- end
- end
- elseif mode == 5 then -- player was killed/betrayed by teammate
- if getplayer(killer) then
- klvl = level[killer]
- kname = getname(killer)
- kip = getip(killer)
- kteam = getteam(killer)
- else
- kname = "NULL"
- klvl = NULL
- kteam = -1
- end
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vip = getip(victim)
- vteam = getteam(victim)
- if getplayer(killer) then
- if vlvl == 11 then
- level[killer] = 10
- playerscore[killer] = 9
- beserk = false
- weapons[killer] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
- sendconsoletext(victim, "Demoted to Level 10! Ain't that a bitch?!", 4, 0)
- say(vname .. " demoted to Level 10 for betrayal.")
- klvl = level[killer]
- kname = getname(killer)
- kip = getip(killer)
- kteam = getteam(killer)
- mybattery[killer] = 0
- else
- if level[killer] ~= nil and level[killer] > 1 then
- if (level[killer] - 1) >= 1 then level[killer] = level[killer] - 1 end
- if (playerscore[killer] - 1) >= 0 then playerscore[killer] = playerscore[killer] - 1 end
- if team_play then if (teamscore[kteam] - 1) >= 0 then teamscore[kteam] = teamscore[kteam] - 1 end end
- mybattery[killer] = 0
- kill(killer)
- say(kname .. " was demoted a level and killed for betraying " .. vname)
- if logging then log_msg(1, kname .. " was killed by server for betrayal of " .. vname) end
- response = false
- else
- kill(killer)
- say(kname .. " was killed for betraying " .. vname)
- if logging then log_msg(1, kname .. " was killed by server for betrayal of " .. vname) end
- response = false
- end
- end
- response = false
- end
- response = false
- end
- elseif mode == 6 then --suicides - killer is self/victim
- if getplayer(victim) then
- vlvl = level[victim]
- vname = getname(victim)
- vip = getip(victim)
- vteam = getteam(victim)
- if vlvl == 11 then
- level[victim] = 10
- playerscore[victim] = 9
- beserk = false
- weapons[victim] = "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher"
- sendconsoletext(victim, "Demoted to Level 10! Ain't that a bitch?!", 4, 0)
- say(vname .. " demoted to Level 10 for suicide.")
- if logging then log_msg(1, vname .. " demoted from level 10 to 9 for suicide. Is level: " .. vlvl) end
- response = false
- else
- if level[victim] ~= nil and level[victim] > 1 then
- if (level[victim] - 1) >= 1 then level[victim] = level[victim] - 1 end
- if (playerscore[victim] - 1) >= 0 then playerscore[victim] = playerscore[victim] - 1 end
- if team_play then if (teamscore[vteam] - 1) >= 0 then teamscore[vteam] = teamscore[vteam] - 1 end end
- say(vname .. " committed suicide and was demoted one level.")
- if logging then log_msg(1, vname .. " demoted one level for suicide. Is level: " .. vlvl) end
- response = false
- else
- say(vname .. " committed suicide.")
- response = false
- end
- response = false
- end
- end
- end
- end
- return response
- end
- function OnWeaponReload(player, weapon)
- local reload = nil
- if getplayer(player) then
- local m_player = getplayer(player)
- local m_objectId = readdword(m_player + 0x34)
- local m_object = getobject(m_objectId)
- if m_object then
- local m_weaponId = readdword(m_object + 0x118)
- if m_weaponId then
- local m_weapon = getobject(m_weaponId)
- local weapname = gettaginfo(readdword(m_weapon))
- if m_weapon then
- if weapname == "zteam\\objects\\weapons\\single\\needler\\h3\\needler" then
- writeword(getobject(weapon) + 0x2B8, needler_clip)
- updateammo(weapon)
- reload = false
- else
- reload = true
- end
- end
- end
- end
- end
- return reload
- end
- function OnDamageApplication(receiving, causing, tagid, hit, backtap)
- if receiving and causing then
- local r_object = getobject(receiving)
- if r_object then
- local receiver = objectaddrtoplayer(r_object)
- if receiver then
- local rhash = gethash(receiver)
- local tagname,tagtype = gettaginfo(tagid)
- last_damage[rhash] = tagname
- end
- end
- end
- return nil
- end
- function OnDamageLookup(receiving, causing, tagid)
- if receiving and causing and receiving ~= causing then
- local player = objectidtoplayer(causing)
- local tagname, tagtype = gettaginfo(tagid)
- local brifle = string.find(tagname, "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet")
- local melee = string.find(tagname, "melee")
- local spikerd = string.find(tagname, "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike")
- local ppistol1 = string.find(tagname, "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt")
- local ppistol2 = string.find(tagname, "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt_charged")
- local plasrifle = string.find(tagname, "halo3\\weapons\\plasma_rifle\\effects\\bolt")
- local needler = string.find(tagname, "zteam\\objects\\weapons\\single\\needler\\h3\\needle_impact" or
- "zteam\\objects\\weapons\\single\\needler\\h3\\needle_detonation" or
- "zteam\\objects\\weapons\\single\\needler\\h1\\needle_combining_explosion_shockwave" or
- "zteam\\objects\\weapons\\single\\needler\\h3\\needle_combining_explosion" or "zteam\\shared\\damage_effects\\screen_effects\\darken_medium_medium")
- local c_player = objectidtoplayer(causing)
- local r_player = objectidtoplayer(receiving)
- --log_msg(1, "tag: " .. tagname)
- if c_player and r_player then
- if melee then odl_multiplier(9999) end
- if ppistol1 then odl_multiplier(2) end
- if ppistol2 then odl_multiplier(1.6) end
- if plasrifle then odl_multiplier(3) end
- if brifle then odl_multiplier(1.7) end
- if needler then odl_multiplier(1.25) end
- end
- end
- return nil
- end
- function OnVehicleEntry(player, veh_id, seat, mapid, relevant)
- if getplayer(player) then
- privatesay(player, getname(player) .. " NOTE: You can't kill players with vehicle or vehicle guns.")
- end
- return nil
- end
- function getplayervehicleid(player)
- local m_objectId = getplayerobjectid(player)
- if m_objectId then return readdword(getobject(m_objectId) + 0x11C) end
- end
- function ApplyHP(id, count, player)
- if count == 1 then
- if player and game_started then
- local name = getname(player)
- local lvl = level[player]
- local m_playerObjId = getplayerobjectid(player)
- if m_playerObjId ~= nil then
- local m_object = getobject(m_playerObjId)
- local obj_health = readfloat(m_object + 0xE0)
- if obj_health < 1 then
- writefloat(m_object + 0xE0, 1)
- sendconsoletext(player, "Bonus: Your health has been restored.", 4, 0)
- if logging then log_msg(1, name .. " Health Bonus applied. Is Level: " .. lvl) end
- end
- end
- end
- end
- return false
- end
- function OnClientUpdate(player)
- if getplayer(player) then
- local lvl = level[player]
- if lvl ~= nil then
- -- monitors and initiates game win announcement
- if lvl == 12 and game_started then
- game_started = false
- announcewin = registertimer(0, "AnnounceWin", player)
- if logging then log_msg(1, "Game win detected - Announcement called.") end
- end
- end
- end
- end
- function AnnounceWin(id, count, player)
- -- announces game winner
- if player and game_started == false then
- local name = getname(player)
- svcmd("sv_map_next")
- if not team_play then
- say(name .. " WINS THE GAME! ")
- else
- local team = getteam(player)
- if team == 0 then team = "RED TEAM" elseif team == 1 then team = "BLUE TEAM" end
- say(team .. " WINS THE GAME! ")
- end
- log_msg(1, name .. " has won the Gun-Game on " .. map_name .. "!")
- end
- return false
- end
- function OnTeamChange(player, old_team, new_team, relevant)
- -- prevent unbalancing teams by team change
- local response = nil
- if getplayer(player) then
- if not team_play then response = false return response end
- if relevant == true or relevant == 1 then
- if getteamsize(old_team) == getteamsize(new_team) then
- privatesay(player, "You cannot change teams.")
- response = false
- elseif getteamsize(old_team) + 1 == getteamsize(new_team) then
- privatesay(player, "You cannot change teams.")
- response = false
- elseif getteamsize(old_team) == getteamsize(new_team) + 1 then
- privatesay(player, "You cannot change teams.")
- response = false
- elseif getteamsize(old_team) > getteamsize(new_team) then
- team_change[player] = true
- -- transfer player score to new team score, and deduct new player score from old team score
- if team_play then
- teamscore[new_team] = teamscore[new_team] + playerscore[player]
- teamscore[old_team] = teamscore[old_team] - playerscore[player]
- end
- mybattery[player] = 0
- say(getname(player) .. " switched teams.")
- response = true
- elseif getteamsize(old_team) < getteamsize(new_team) then
- team_change[player] = true
- -- transfer player score to new team score, and deduct new player score from old team score
- if team_play then
- teamscore[new_team] = teamscore[new_team] + playerscore[player]
- teamscore[old_team] = teamscore[old_team] - playerscore[player]
- end
- mybattery[player] = 0
- say(getname(player) .. " switched teams.")
- response = true
- end
- elseif relevant == false or relevant == 0 then
- team_change[player] = true
- -- transfer player score to new team score, and deduct new player score from old team score
- if team_play then
- teamscore[new_team] = teamscore[new_team] + playerscore[player]
- teamscore[old_team] = teamscore[old_team] - playerscore[player]
- end
- mybattery[player] = 0
- say(getname(player) .. " was team-switched by autobalance.")
- response = true
- end
- end
- return response
- end
- function OnObjectInteraction(player, objId, mapId)
- -- blocks players from picking up weapons and nades
- local Pass = nil
- local name, type = gettaginfo(mapId)
- if type == "weap" then
- if weapons[player] ~= nil then
- if name ~= weapons[player] then
- Pass = false
- end
- end
- elseif type == "eqip" then
- if name == "powerups\\over shield" or name == "powerups\\health pack" or name == "powerups\\active camouflage" then -- os
- Pass = true
- else
- Pass = false
- end
- end
- return Pass
- end
- function OnObjectCreationAttempt(mapId, parentId, player)
- local response = nil
- local name, type = gettaginfo(mapId)
- if game_started then
- -- block
- if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull") or -- oddball
- mapId == gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade") or -- frags
- mapId == gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade") then -- plasma
- response = false
- end
- -- replace
- if mapId == gettagid("eqip", "powerups\\active camouflage") then
- return gettagid("eqip", "powerups\\over shield") -- OS
- end
- -- replace
- if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag") then -- flag
- return gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol") -- ppistol
- end
- elseif not game_started then
- -- allow
- if mapId == gettagid("bipd", "halo3\\characters\\spartan\\mp_spartan") or -- mpbiped
- mapId == gettagid("vehi", "halo3\\vehicles\\forklift\\forklift") or -- forklift
- mapId == gettagid("vehi", "levels\\test\\foundry\\forge_objects\\soccerball\\soccerball") then
- response = true
- end
- -- block
- if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull") or -- oddball
- mapId == gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade") or -- frags
- mapId == gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade") then -- plasma
- response = false
- end
- -- replace
- if mapId == gettagid("eqip", "powerups\\active camouflage") then
- return gettagid("eqip", "powerups\\over shield") -- OS
- end
- -- replace
- if mapId == gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag") then -- flag
- return gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol") -- ppistol
- end
- else
- response = false
- end
- return response
- end
- function LoadTags()
- PP = gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\plasma_pistol")
- NE = gettagid("weap", "zteam\\objects\\weapons\\single\\needler\\h3\\needler")
- SK = gettagid("weap", "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike_rifle")
- SG = gettagid("weap", "zteam\\objects\\weapons\\single\\shotgun\\h3\\shotgun")
- PR = gettagid("weap", "zteam\\objects\\weapons\\single\\plasma_rifle\\h3\\plasma_rifle")
- BS = gettagid("weap", "zteam\\objects\\weapons\\single\\brute_shot\\h3_6rounds\\brute_shot")
- AR = gettagid("weap", "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\assault_rifle")
- PI = gettagid("weap", "zteam\\objects\\weapons\\single\\magnum\\h3_laser\\magnum")
- BR = gettagid("weap", "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\battle_rifle")
- RL = gettagid("weap", "zteam\\objects\\weapons\\single\\rocket_launcher\\h3\\rocket_launcher")
- SR = gettagid("weap", "zteam\\objects\\weapons\\single\\sniper_rifle\\z\\sniper_rifle")
- FL = gettagid("weap", "zteam\\objects\\weapons\\multi_player\\flag\\h3\\flag")
- BL = gettagid("weap", "zteam\\objects\\weapons\\multi_player\\skull\\h3\\skull")
- PP_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt")
- PP_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\plasma_pistol\\h3\\bolt_charged")
- NE_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_impact")
- NE_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_detonation")
- NE_D3 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h1\\needle_combining_explosion_shockwave")
- NE_D4 = gettagid("jpt!", "zteam\\objects\\weapons\\single\\needler\\h3\\needle_combining_explosion")
- SK_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\spike_rifle\\h3\\spike")
- SG_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\shotgun\\h3\\pellet")
- PR_D = gettagid("jpt!", "halo3\\weapons\\plasma_rifle\\effects\\bolt")
- BS_D1 = gettagid("jpt!", "zteam\\shared\\damage_effects\\misc\\projectile_detonator")
- BS_D2 = gettagid("jpt!", "zteam\\objects\\weapons\\single\brute_shot\\h3\\grenade_explosion")
- AR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\assault_rifle\\h3\\bullet")
- PI_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\magnum\\h3\\bullet")
- BR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\battle_rifle\\h3\\bullet")
- RL_D1 = gettagid("jpt!", "zteam\\objects\\weapons\\grenade\\fragmentation_grenade\\h1\\explosion_shockwave")
- RL_D2 = gettagid("jpt!", "weapons\\rocket launcher\\explosion")
- SR_D = gettagid("jpt!", "zteam\\objects\\weapons\\single\\sniper_rifle\\h3\\bullet")
- Melee_1 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_strike")
- Melee_2 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_slice")
- Melee_3 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_smash")
- Melee_4 = gettagid("jpt!", "zteam\\shared\\damage_effects\\melee\\melee_crush")
- mp_biped = gettagid("bipd", "halo3\\characters\\spartan\\mp_spartan")
- Frag = gettagid("eqip", "halo3\\weapons\\frag grenade\\frag grenade")
- Plasma = gettagid("eqip", "halo3\\weapons\\plasma-grenade\\plasma grenade")
- Healthp = gettagid("eqip", "powerups\\health pack")
- Oshield = gettagid("eqip", "powerups\\over shield")
- Acamo = gettagid("eqip", "powerups\\active camouflage")
- SoccerBall = gettagid("vehi", "levels\\test\\foundry\\forge_objects\\soccerball\\soccerball")
- Forklift = gettagid("vehi", "halo3\\vehicles\\forklift\\forklift")
- Spool = gettagid("vehi", "levels\\test\\foundry\\forge_objects\\warehouse_spool\\warehouse_spool")
- Fall_dmg = gettagid("jpt!", "globals\\new fall\\falling")
- Dist_dmg = gettagid("jpt!", "globals\\new fall\\distance")
- Veh_dmg = gettagid("jpt!", "globals\\vehicle_collision")
- end
- function AutoBalance(id, count)
- if game_started and team_play and cur_players > 3 then
- Balance_Teams()
- return true
- elseif game_started and team_play and cur_players < 4 then
- return false
- else
- return false
- end
- end
- -- inspired by 002's team balance for Sapp
- function Balance_Teams()
- if game_started and team_play then
- local redteam = getteamsize(0)
- local blueteam = getteamsize(1)
- if redteam > blueteam then
- while TeamsAreUneven() do
- while (getteamsize(0) > getteamsize(1)+1) do
- local randomred = SelectPlayer(0)
- if randomred ~= nil then
- changeteam(randomred, true)
- end
- end
- end
- elseif blueteam > redteam then
- while TeamsAreUneven() do
- while (getteamsize(1) > getteamsize(0)+1) do
- local randomblu = SelectPlayer(1)
- if randomblu ~= nil then
- changeteam(randomblu, true)
- end
- end
- end
- end
- end
- end
- -- inspired by 002's team balance for Sapp
- function TeamsAreUneven()
- local red = getteamsize(0)
- local blue = getteamsize(1)
- if (red > blue + 1 or blue > red + 1) then return true end
- return false
- end
- function SelectPlayer(team)
- local t = {}
- for i=0,15 do
- if getplayer(i) and getteam(i) == team then
- table.insert(t, i)
- end
- end
- if #t > 0 then
- local r = getrandomnumber(1, #t+1)
- return t[r]
- end
- return nil
- end
- function ShowTargets(id, count)
- -- timer to repeatedly call roaming targets function while game is started and players > 0
- Roaming_Targets()
- return true
- end
- function Roaming_Targets(id, count)
- if game_started and cur_players > 2 and gametype ~= 5 then
- if team_play then
- local target = SelectRoamingPlayer(player)
- if target then
- local team = getteam(target)
- for i = 0,15 do
- if getplayer(i) and getplayer(i) ~= getplayer(target) and getteam(i) ~= team then
- writeword(getplayer(i) + 0x88, target)
- end
- end
- return true
- else
- return false
- end
- else
- local target = SelectRoamingPlayer(player)
- if target then
- for i = 0,15 do
- if getplayer(i) and getplayer(i) ~= getplayer(target) then
- writeword(getplayer(i) + 0x88, target)
- end
- end
- return true
- else
- return false
- end
- end
- end
- end
- function SelectRoamingPlayer(player)
- local t = {}
- for i=0,15 do
- if getplayer(i) then
- table.insert(t, i)
- end
- end
- if #t > 0 then
- if (timerCount > #t) then
- timerCount = 0
- else
- timerCount = timerCount + 1
- end
- return t[timerCount]
- end
- end
- function OnGameEnd(stage)
- if stage == 1 then
- game_started = false
- beserk = false
- if gameweap then
- gameweap = nil
- end
- if announcewin then
- announcewin = nil
- end
- if m_weaponId then
- m_weaponId = nil
- end
- if replaceplasmaweap then
- replaceplasmaweap = nil
- end
- if p_objectId then
- p_objectId = nil
- end
- if health then
- health = nil
- end
- if welcome then
- welcome = nil
- end
- if speedtimer then
- speedtimer = nil
- end
- if checkbattery then
- checkbattery = nil
- end
- if updatescores then
- updatescores = nil
- end
- if autobalance then
- autobalance = nil
- end
- if consoletimer then
- consoletimer = nil
- end
- if showtargets then
- showtargets = nil
- end
- elseif stage == 3 then
- for i = 0, 15 do
- if getplayer(i) then
- privatesay(i, "Thank you for playing the Gun-Game Arms Race for H3 Foundry!")
- privatesay(i, "by H\174 Shaft")
- end
- end
- end
- end
- -- Start sendconsoletext overloaded by Nugget
- console = {}
- console.__index = console
- consoletimer = registertimer(100, "ConsoleTimer")
- phasor_sendconsoletext = sendconsoletext
- function sendconsoletext(player, message, time, order, align, height, func)
- if player then
- console[player] = console[player] or {}
- local temp = {}
- temp.player = player
- temp.id = nextid(player, order)
- temp.message = message or ""
- temp.time = time or 0.7
- temp.remain = temp.time
- temp.align = align or "left"
- temp.height = height or 0
- if type(func) == "function" then
- temp.func = func
- elseif type(func) == "string" then
- temp.func = _G[func]
- end
- console[player][temp.id] = temp
- setmetatable(console[player][temp.id], console)
- return console[player][temp.id]
- end
- end
- function nextid(player, order)
- if not order then
- local x = 0
- for k,v in pairs(console[player]) do
- if k > x + 1 then
- return x + 1
- end
- x = x + 1
- end
- return x + 1
- else
- local original = order
- while console[player][order] do
- order = order + 0.001
- if order == original + 0.999 then break end
- end
- return order
- end
- end
- function getmessage(player, order)
- if console[player] then
- if order then
- return console[player][order]
- end
- end
- end
- function getmessages(player)
- return console[player]
- end
- function getmessageblock(player, order)
- local temp = {}
- for k,v in opairs(console[player]) do
- if k >= order and k < order + 1 then
- table.insert(temp, console[player][k])
- end
- end
- return temp
- end
- function console:getmessage()
- return self.message
- end
- function console:append(message, reset)
- if console[self.player] then
- if console[self.player][self.id] then
- if getplayer(self.player) then
- if reset then
- if reset == true then
- console[self.player][self.id].remain = console[self.player][self.id].time
- elseif tonumber(reset) then
- console[self.player][self.id].time = tonumber(reset)
- console[self.player][self.id].remain = tonumber(reset)
- end
- end
- console[self.player][self.id].message = message or ""
- return true
- end
- end
- end
- end
- function console:shift(order)
- local temp = console[self.player][self.id]
- console[self.player][self.id] = console[self.player][order]
- console[self.player][order] = temp
- end
- function console:pause(time)
- console[self.player][self.id].pausetime = time or 5
- end
- function console:delete()
- console[self.player][self.id] = nil
- end
- function ConsoleTimer(id, count)
- for i,_ in opairs(console) do
- if tonumber(i) then
- if getplayer(i) then
- for k,v in opairs(console[i]) do
- if console[i][k].pausetime then
- console[i][k].pausetime = console[i][k].pausetime - 0.1
- if console[i][k].pausetime <= 0 then
- console[i][k].pausetime = nil
- end
- else
- if console[i][k].func then
- if not console[i][k].func(i) then
- console[i][k] = nil
- end
- end
- if console[i][k] then
- console[i][k].remain = console[i][k].remain - 0.1
- if console[i][k].remain <= 0 then
- console[i][k] = nil
- end
- end
- end
- end
- if table.len(console[i]) > 0 then
- local paused = 0
- for k,v in pairs(console[i]) do
- if console[i][k].pausetime then
- paused = paused + 1
- end
- end
- if paused < table.len(console[i]) then
- local str = ""
- for i = 0,30 do
- str = str .. " \n"
- end
- phasor_sendconsoletext(i, str)
- for k,v in opairs(console[i]) do
- if not console[i][k].pausetime then
- if console[i][k].align == "right" or console[i][k].align == "center" then
- phasor_sendconsoletext(i, consolecenter(string.sub(console[i][k].message, 1, 78)))
- else
- phasor_sendconsoletext(i, string.sub(console[i][k].message, 1, 78))
- end
- end
- end
- end
- end
- else
- console[i] = nil
- end
- end
- end
- return true
- end
- function consolecenter(text)
- if text then
- local len = string.len(text)
- for i = len + 1, 78 do
- text = " " .. text
- end
- return text
- end
- end
- function opairs(t)
- local keys = {}
- for k,v in pairs(t) do
- table.insert(keys, k)
- end
- table.sort(keys,
- function(a,b)
- if type(a) == "number" and type(b) == "number" then
- return a < b
- end
- an = string.lower(tostring(a))
- bn = string.lower(tostring(b))
- if an ~= bn then
- return an < bn
- else
- return tostring(a) < tostring(b)
- end
- end)
- local count = 1
- return function()
- if table.unpack(keys) then
- local key = keys[count]
- local value = t[key]
- count = count + 1
- return key,value
- end
- end
- end
- function table.len(t)
- local count = 0
- for k,v in pairs(t) do
- count = count + 1
- end
- return count
- end
- -- Stop sendconsoletext overloaded
- -- Created by H® Shaft.
- -- Thanks to Oxide, AelitePrime, Nugget & Wizard.
- -- Visit http://halorace.org/forum/index.php?topic=514.0 or
- -- Visit http://pastebin.com/u/HR_Shaft for more phasor scripts
- -- 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.
- -- 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