--[[ ==================================================================================================================================== ]] -- Protect the Prime Minister (server) -- Requires mapmanager resource (included in server package) -- Code is released as is and may be modified and/or redistributed provided correct credits are given -- If you are running the 'Admin' resource (admin panel) you must remove the register command as PTPM uses its own --[[ ==================================================================================================================================== ]] local ptpm_mode_name = "Protect the Prime Minister version 1.1" local TEAM_PSYCHO = 1 local TEAM_TERROR = 2 local TEAM_PRIMEMINISTER = 3 local TEAM_BODYGUARD = 4 local TEAM_COP = 5 local current_map local crouchObject = {} local crouchCorona = {} local root = getRootElement() local team_names = { [1] = "Psychopath", [2] = "Terrorist", [3] = "Prime Minister", [4] = "Bodyguard", [5] = "Cop" } local pocket_money = 500 local current_pm = -1 local pm_health_penalty_safe = 0 local player_boundary_safe = {} local player_blip = {} local player_respawn_timer = {} local player_knock = {} local player_callvote_voted = {} local player_admin = {} local last_good_x = {} local last_good_y = {} local last_good_z = {} local plan_active = 0 local plan_text = "" local round_timer_counter = 0 local round_time local game_teams = {} local cant_drive_vehicle = {} local cant_passenger_vehicle = {} local respawn_table = {} local supported = {1,1,0,0,0,1,0,0,1,1,0,0} local vote_victim, vote_initiator, votes_left, vote_timer, vote_reason, vote_serial, vote_victim_name local callvote_ban_tracker = {} local callvote_ban_max = 0 local command_block = 0 local swapclass_victim = nil function PtpmMapStart(map) outputServerLog("PTPM: map started") current_map = map vote_table = {0,0,0,0,0,0,0,0,0,0,0,0} local time_ = getRealTime() setTime(time_.hour,time_.minute) for index,player in ipairs(getElementsByType("player")) do if player then setCameraMode(player,"fixed") SetupWardrobeForPlayerClientTrigger(player) fadeCamera(player,true) HideSpawnMenuTrigger(player) -- PlayerSpawnSelectionSetupTrigger(player) ClientRoundStartedSetup(player) BoundarySafe(player,10) --distance_display_text = {} --distance_display_text_string = {} end end local distance_display_element = getElementsByType("distance_display") distance_display = tonumber(getElementData(distance_display_element[1],"value")) local team_specific_radar_element = getElementsByType("team_specific_radar") team_specific_radar = tonumber(getElementData(team_specific_radar_element[1],"value")) local misc_info_pm = getElementsByType("pm_health_bonus") pm_health_bonus = tonumber(getElementData(misc_info_pm[1],"value")) local misc_info_medic = getElementsByType("medic_health_bonus") medic_health_bonus = tonumber(getElementData(misc_info_medic[1],"value")) local misc_info_can_drown = getElementsByType("pm_can_drown") pm_can_drown = tonumber(getElementData(misc_info_can_drown[1],"value")) local misc_info_abandoned = getElementsByType("pm_abandoned_health_penalty") pm_abandoned_health_penalty = tonumber(getElementData(misc_info_abandoned[1],"value")) local misc_info_health_increase_check = getElementsByType("pm_health_increase_check") pm_health_increase_check = tonumber(getElementData(misc_info_health_increase_check[1],"value")) pm_health_increase_current = 0.0 pm_health_increase_previous = 100.0 if distance_display==1 then setTimer(UpdateDistanceDisplay,300,0) end pm_fresh = 0 current_pm = -1 round_timer_counter = 0 plan_active = 0 plan_text = "" game_boundary_count = 0 game_boundary_x = {} game_boundary_y = {} pm_health_penalty_safe = 0 command_block = 0 local currentmap = call(getResourceFromName"mapmanager","getRunningGamemodeMap") round_time = get(getResourceName(currentmap)..".round_time_data") for k,v in ipairs(getElementsByType("corner",root)) do -- load the boundary corners AddGameBoundaryCorner(getElementData(v,"x"),getElementData(v,"y")) end banned_cuboid = {} banned_cuboid_count = 0 for k,v in ipairs(getElementsByType("cuboid",root)) do -- load the banned cuboids AddBannedCuboid(v) end cant_drive_vehicle = {} cant_passenger_vehicle = {} for i=1,5 do -- max teams cant_drive_vehicle[i] = {} cant_passenger_vehicle[i] = {} for j=1,700 do -- max (highest number ptpm uses) vehicles cant_drive_vehicle[i][j] = 0 cant_passenger_vehicle[i][j] = 0 end end for k,v in ipairs(getElementsByType("cant_drive_vehicle",root)) do -- load the vehicle permissions (driver) local team = tonumber(getElementData(v,"team")+1) cant_drive_vehicle[team][tonumber(getElementData(v,"model"))] = 1 end for k,v in ipairs(getElementsByType("cant_passenger_vehicle",root)) do -- load the vehicle permissions (passenger) local team = tonumber(getElementData(v,"team")+1) cant_passenger_vehicle[team][tonumber(getElementData(v,"model"))] = 1 end respawn_table = {} for k,vehicle in ipairs(getElementsByType("vehicle")) do respawn_table[vehicle] = {} toggleVehicleRespawn(vehicle,true) setVehicleRespawnDelay(vehicle,10000) --setVehicleIdleRespawnDelay(vehicle,30000) setVehicleIdleRespawnDelayEx(vehicle,45000) setVehicleRespawnPosition(vehicle,getElementData(vehicle,"posX"),getElementData(vehicle,"posY"),getElementData(vehicle,"posZ"), getElementData(vehicle,"rotX"),getElementData(vehicle,"rotY"),getElementData(vehicle,"rotZ")) setElementData(source,"ptpm_vehicle_fresh",1) if getResourceName(map)=="ptpm_air_assault" then local colour = getVehicleColor(vehicle) if colour==79 then -- cop setElementData(vehicle,"ptpm_vehicle_team",5) elseif colour==85 then -- terror setElementData(vehicle,"ptpm_vehicle_team",2) elseif colour==86 then -- bguard setElementData(vehicle,"ptpm_vehicle_team",4) end end end --[[ if getResourceName(map)=="ptpm_chiliad" then local object_root = getElementsByType("object",root) for k,v in ipairs(object_root) do if k>1 and k<91 then end end end]] end addEventHandler("onGamemodeMapStart",root,PtpmMapStart) function AddBannedCuboid(root) banned_cuboid[banned_cuboid_count] = {} banned_cuboid[banned_cuboid_count].col = createColCuboid(getElementData(root,"posX"),getElementData(root,"posY"),getElementData(root,"posZ"), getElementData(root,"width"),getElementData(root,"depth"),getElementData(root,"height")) if banned_cuboid[banned_cuboid_count].col == false then outputServerLog("Banned Cuboid: Invalid arguments ("..banned_cuboid_count..")") return end banned_cuboid[banned_cuboid_count].telex = getElementData(root,"teleX") banned_cuboid[banned_cuboid_count].teley = getElementData(root,"teleY") banned_cuboid[banned_cuboid_count].telez = getElementData(root,"teleZ") banned_cuboid[banned_cuboid_count].telea = getElementData(root,"teleA") banned_cuboid[banned_cuboid_count].vehicles = getElementData(root,"vehicles") banned_cuboid[banned_cuboid_count].interior = getElementData(root,"interior") banned_cuboid[banned_cuboid_count].message = getElementData(root,"message") banned_cuboid_count = banned_cuboid_count+1 end function AddGameBoundaryCorner(x,y) game_boundary_x[game_boundary_count] = x game_boundary_y[game_boundary_count] = y -- outputServerLog("Boundary Corner: x: "..game_boundary_x[game_boundary_count].." y: "..game_boundary_y[game_boundary_count]) game_boundary_count = game_boundary_count+1 end function setVehicleIdleRespawnDelayEx(vehicle,delay) respawn_table[vehicle].delay = delay end function OnPlayerColShapeHit(element,colshape,dimension) local type_ = getElementType(element) for k = 1,#banned_cuboid do if banned_cuboid[k].col == colshape then if type_=="player" then local vehicle = getPlayerOccupiedVehicle(element) if vehicle then if banned_cuboid[k].vehicles == 1 then setElementPosition(vehicle,banned_cuboid[k].telex,banned_cuboid[k].teley,banned_cuboid[k].telez) local x,y = getVehicleRotation(vehicle) setVehicleRotation(vehicle,x,y,banned_cuboid[k].telea) setElementInterior(vehicle,banned_cuboid[k].interior) else return end elseif not vehicle then setElementPosition(element,banned_cuboid[k].telex,banned_cuboid[k].teley,banned_cuboid[k].telez) setPlayerRotation(element,banned_cuboid[k].telea) setElementInterior(element,banned_cuboid[k].interior) end if banned_cuboid[k].message~=nil then outputChatBox(banned_cuboid[k].message,element) end end end end end addEvent("OnPlayerColShapeHit",true) addEventHandler("OnPlayerColShapeHit",root,OnPlayerColShapeHit) function PtpmMapStop(map) for k,vehicle in ipairs(getElementsByType("vehicle")) do if respawn_table[vehicle].timer then killTimer(respawn_table[vehicle].timer) end respawn_table[vehicle].timer = nil end distance_display = 0 -- distance_display_text = nil -- distance_display_text_string = nil for k=1,5 do cant_drive_vehicle[k] = nil cant_passenger_vehicle[k] = nil end cant_drive_vehicle = nil cant_passenger_vehicle = nil game_boundary_x = nil game_boundary_y = nil game_boundary_count = 0 pm_health_bonus = 0 medic_health_bonus = 0 pm_can_drown = 0 pm_abandoned_health_penalty = 0 pm_health_increase_check = 0 triggerClientEvent(root,"UpdateMapVotesInMenu",root,{0,0,0,0,0,0,0,0,0,0,0,0}) for index,player in ipairs(getElementsByType("player")) do if player then setPlayerTeam(player,nil) setPlayerNametagColor(player,255,255,255) setElementData(player,"ptpm_spawned",false) setElementData(player,"ptpm_class_type","null") setElementData(player,"ptpm_team",-1) setElementData(player,"ptpm_class",-1) setElementData(player,"deaths",0) setElementData(player,"kills",0) last_good_x[player] = 0 last_good_y[player] = 0 last_good_z[player] = 0 player_callvote_voted[player] = 0 triggerClientEvent(player,"ResetMapvoteColours",root,-1,getElementData(player,"ptpm_mapvote")) triggerClientEvent(player,"ForceMapvoteMenuHide",root) setElementData(player,"ptpm_mapvote",-1) -- BoundarySafe(player,5) if distance_display == 1 then textDisplayRemoveObserver(distance_display_text[player],player) end if crouchObject[player] then destroyElement(crouchObject[player]) destroyElement(crouchCorona[player]) end crouchObject[player] = nil crouchCorona[player] = nil end end outputServerLog("PTPM: map stopped") end addEventHandler("onGamemodeMapStop",root,PtpmMapStop) function OutputModeMap(player) local currentmap = call(getResourceFromName"mapmanager","getRunningGamemodeMap") local currentmode = call(getResourceFromName"mapmanager","getRunningGamemode") outputChatBox("Mode: "..getResourceName(currentmode) .. " Map: "..getResourceName(currentmap),player) end addCommandHandler("mode",OutputModeMap) function OnRoundEnd() local manager = getResourceFromName("mapmanager") vote_table = {0,0,0,0,0,0,0,0,0,0,0,0} for index, player in ipairs(getElementsByType("player")) do if player then local vote_ = getElementData(player,"ptpm_mapvote") if vote_~=-1 then vote_table[vote_] = vote_table[vote_] + 1 local mapid = "ptpm_mapcount"..vote_ setElementData(player,mapid,getElementData(player,mapid)+1) end end end local max_score=0 for k = 1,12 do if vote_table[k]>max_score then max_score = vote_table[k] end end local map_ = -1 repeat map_ = -1 while map_==-1 do local proposal = math.random(12) if vote_table[proposal] == max_score then map_ = proposal end end until supported[map_]==1 local maps = { "ptpm_ls_hydra", "ptpm_san_fierro", "ptpm_desert", "ptpm_area_51", "ptpm_lv_obj", "ptpm_air_assault", "ptpm_chiliad", "ptpm_countryside", "ptpm_los_santos", "ptpm_las_venturas", "ptpm_factory", "ptpm_bayside" } call(manager,"changeGamemodeMap",getResourceFromName(maps[map_]),getResourceFromName("ptpm")) end --[[ function PtpmModeStart() outputServerLog("PTPM: mode started") local manager = getResourceFromName("mapmanager") call(manager,"changeGamemodeMap",getResourceFromName("ptpm_los_santos"),getResourceFromName("ptpm")) call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Score") call(getResourceFromName("scoreboard"), "addScoreboardColumn", "kills") call(getResourceFromName("scoreboard"), "addScoreboardColumn", "deaths") setTimer(RoundTick,1000,0) end]] --addEventHandler("onGamemodeStart",getResourceRootElement(getThisResource()),PtpmModeStart) function onThisResourceStart() outputServerLog("PTPM: mode started") local manager = getResourceFromName("mapmanager") call(manager,"changeGamemode",getResourceFromName("ptpm")) call(manager,"changeGamemodeMap",getResourceFromName("ptpm_los_santos"),getResourceFromName("ptpm")) call(getResourceFromName("scoreboard"), "addScoreboardColumn", "kills") call(getResourceFromName("scoreboard"), "addScoreboardColumn", "deaths") stopResource(getResourceFromName("votemanager")) stopResource(getResourceFromName("mapcycler")) stopResource(getResourceFromName("spawnmanager")) setTimer(RoundTick,1000,0) setTimer(BoundCheck,400,0) Commands() setMapName("Los Santos") setGameType("Ptpm") distance_display_text = {} distance_display_text_string = {} timer_display = textCreateDisplay() timer_display_text = textCreateTextItem("This is a timer message",0.5,0.25,"low",100,140,220,200,4,"center","top") textDisplayAddText(timer_display,timer_display_text) swapclass_display = textCreateDisplay() swapclass_message = textCreateTextItem("- wants to swapclass with you",0.5,0.90,"low",255,70,0,200,2,"center","top") textDisplayAddText(swapclass_display,swapclass_message) game_teams = {} local teams_ = getElementsByType("team_data") for k,v in ipairs(teams_) do game_teams[k] = {} game_teams[k].team = createTeam(team_names[k]) if k ~= 1 then setTeamFriendlyFire(game_teams[k].team,false) end end end addEventHandler("onResourceStart",getResourceRootElement(getThisResource()),onThisResourceStart) function onThisResourceStop() for k = 1,callvote_ban_max do if callvote_ban_tracker[k] then unbanSerial(callvote_ban_tracker[k].serial) outputServerLog("CALLVOTE: "..callvote_ban_tracker[k].name.." ("..callvote_ban_tracker[k].serial..") unbanned.") callvote_ban_tracker[k].serial = nil callvote_ban_tracker[k].timer = nil callvote_ban_tracker[k].name = nil callvote_ban_tracker[k] = nil end end for k = 1,#game_teams do destroyElement(game_teams[k].team) game_teams[k] = nil end game_teams = nil end addEventHandler("onResourceStop",getResourceRootElement(getThisResource()),onThisResourceStop) function OnPlayerJoinFunc() local player_name = getClientName(source) setCameraMode(player,"fixed") setPlayerTeam(source,nil) setPlayerBlurLevel(source,20) setElementData(source,"ptpm_spawned",false) setElementData(source,"ptpm_team",-1) setElementData(source,"ptpm_class",-1) setElementData(source,"ptpm_class_type","null") last_good_x[source] = 0 last_good_y[source] = 0 last_good_z[source] = 0 setElementData(source,"ptpm_mapvote",-1) player_callvote_voted[source] = 0 setElementData(source,"deaths",0) setElementData(source,"kills",0) setElementData(source,"ptpm_kills",0) setElementData(source,"ptpm_deaths",0) setElementData(source,"ptpm_pmvictory",0) setElementData(source,"ptpm_pmkills",0) for i = 1,12 do local mapid = "ptpm_mapcount"..i setElementData(source,mapid,0) end for i = 1,5 do local spawned = "ptpm_spawned"..i setElementData(source,spawned,0) end fadeCamera(source,true) player_boundary_safe[source] = 0 player_blip[source] = nil player_respawn_timer[source] = nil player_knock[source] = true player_admin[source] = false distance_display_text[source] = textCreateDisplay() distance_display_text_string[source] = textCreateTextItem("Distance to -:\n-\n\nHis health is:\n-",0.08,0.45,"low",255,0,0,255,1,"center") textDisplayAddText(distance_display_text[source],distance_display_text_string[source]) Motd(source) local name,found = string.gsub(getClientName(source),"#%x%x%x%x%x%x","") if found>0 then if string.len(name)>0 then outputChatBox("Nick cannot contain colour code(s).",source,255,0,0) triggerEvent("ChangePlayerNick",source,name) else kickPlayer(source,root,"Nick cannot be a colour code.") end end end addEventHandler("onPlayerJoin",root,OnPlayerJoinFunc) function SetupWardrobeForPlayerClientTrigger(player) if (player) then triggerClientEvent(player,"SetupWardrobeForPlayerFunc",root) end end function HideSpawnMenuTrigger(player) if (player) then triggerClientEvent(player,"HideSpawnMenu",root) end end --[[ function PlayerSpawnSelectionSetupTrigger(player) if (player) then triggerClientEvent(player,"PlayerSelectSpawn",root) end end]] function ClientRoundStartedSetup(player) if player then triggerClientEvent(player,"ClientRoundStarted",root) end end function OnPlayerQuitFunc(reason) triggerClientEvent(source,"HideSpawnMenu",root) local player_name = getClientName(source) if source==current_pm then current_pm=-1 end local players = getElementsByType("player") local vote_table = {0,0,0,0,0,0,0,0,0,0,0,0} for index, player in ipairs(players) do if player then local vote_ = tonumber(getElementData(player,"ptpm_mapvote")) if vote~=nil and vote~=false and vote_>=0 then vote_table[vote_] = vote_table[vote_] + 1 end end end setElementData(source,"ptpm_mapvote",-1) player_respawn_timer[source] = nil player_admin[source] = false distance_display_text[source] = nil distance_display_text_string[source] = nil triggerClientEvent(root,"UpdateMapVotesInMenu",root,vote_table) destroyBlipsAttachedTo(source) -- quitting whilst in a vehicle doesnt call onPlayerVehicleExit() local vehicle = getPlayerOccupiedVehicle(source) if vehicle~=false then local seat = getPlayerOccupiedVehicleSeat(source) OnPlayerVehicleExit(vehicle,seat,-1) end if crouchObject[source] then destroyElement(crouchObject[source]) destroyElement(crouchCorona[source]) end crouchObject[source] = nil crouchCorona[source] = nil --[[ local account = getClientAccount(source) if not isGuestAccount(account) then setAccountData(account,"ptpm_kills",getElementData(source,"ptpm_kills")) setAccountData(account,"ptpm_deaths",getElementData(source,"ptpm_deaths")) setAccountData(account,"ptpm_pmkills",getElementData(source,"ptpm_pmkills")) setAccountData(account,"ptpm_pmvictory",getElementData(source,"ptpm_pmvictory")) setAccountData(account,"ptpm_spawned1",getElementData(source,"ptpm_spawned1")) setAccountData(account,"ptpm_spawned2",getElementData(source,"ptpm_spawned2")) setAccountData(account,"ptpm_spawned3",getElementData(source,"ptpm_spawned3")) setAccountData(account,"ptpm_spawned4",getElementData(source,"ptpm_spawned4")) setAccountData(account,"ptpm_spawned5",getElementData(source,"ptpm_spawned5")) setAccountData(account,"ptpm_mapcount1",getElementData(source,"ptpm_mapcount1")) setAccountData(account,"ptpm_mapcount2",getElementData(source,"ptpm_mapcount2")) setAccountData(account,"ptpm_mapcount3",getElementData(source,"ptpm_mapcount3")) setAccountData(account,"ptpm_mapcount4",getElementData(source,"ptpm_mapcount4")) setAccountData(account,"ptpm_mapcount5",getElementData(source,"ptpm_mapcount5")) setAccountData(account,"ptpm_mapcount6",getElementData(source,"ptpm_mapcount6")) setAccountData(account,"ptpm_mapcount7",getElementData(source,"ptpm_mapcount7")) setAccountData(account,"ptpm_mapcount8",getElementData(source,"ptpm_mapcount8")) setAccountData(account,"ptpm_mapcount9",getElementData(source,"ptpm_mapcount9")) setAccountData(account,"ptpm_mapcount10",getElementData(source,"ptpm_mapcount10")) setAccountData(account,"ptpm_mapcount11",getElementData(source,"ptpm_mapcount11")) setAccountData(account,"ptpm_mapcount12",getElementData(source,"ptpm_mapcount12")) end]] end addEventHandler("onPlayerQuit",root,OnPlayerQuitFunc) function destroyBlipsAttachedTo(player) local attached = getAttachedElements(player) if attached~=false then for k,element in ipairs(attached) do if getElementType(element)=="blip" then destroyElement(element) player_blip[player] = nil end end end end function UpdateDistanceDisplay() local players = getElementsByType("player") local px,py,pz if current_pm~=-1 then px,py,pz = getElementPosition(current_pm) end for k,player in ipairs(players) do if player then if current_pm~=-1 and player~=current_pm then local x,y,z = getElementPosition(player) textItemSetText(distance_display_text_string[player],string.format("Distance to %s:\n%.1f\n\nHis health is:\n%.1f",getClientName(current_pm),getDistanceBetweenPoints3D(x,y,z,px,py,pz),getElementHealth(current_pm))) -- "Distance to "..getClientName(current_pm)..":\n"..getDistanceBetweenPoints3D(x,y,z,px,py,pz).."\n\nHis health is:\n"..getElementHealth(current_pm)) else textItemSetText(distance_display_text_string[player],"Distance to -:\n-\n\nHis health is:\n-") end end end end function ClientSpawnMenuTrigger(player) if (player) then triggerClientEvent(player,"PlayerSelectSpawn",root) end end function SpawnPlayerFunc(player,team,class,hide) -- hide denotes whether the player got here through the menu or through the script (ie: /reclass is through the menu, dying and respawning is through the script) -- outputChatBox("Spawn with: Team: "..team.." Class: "..class,player) if player_respawn_timer[player] then killTimer(player_respawn_timer[player]) end player_respawn_timer[player] = nil if not isElement(player) then return end if CalcTeamBalance(player,team)==false then outputChatBox("That team is full!",player) return end local spawn_node1 = getElementByID(string.lower(team_names[team])) local spawn_info1 = getElementsByType("spawn",spawn_node1) if spawn_info1==false then outputChatBox("ERROR: spawn info false",player) return end local random_ = randInt(1,table.getn(spawn_info1)) local px = getElementData(spawn_info1[random_],"posX") local py = getElementData(spawn_info1[random_],"posY") local pz = getElementData(spawn_info1[random_],"posZ") local rot = math.ceil(getElementData(spawn_info1[random_],"rot")) local spawn_node2 = getElementByID(string.lower(team_names[team])) local spawn_info2 = getElementsByType("skin",spawn_node2) if spawn_info2==false then outputChatBox("ERROR: skin spawn info false",player) return end if (isElement(spawn_info2[class])==false) then return end if hide==1 then HideSpawnMenuTrigger(source) end setElementInterior(player,0) -- reclassing whilst in a vehicle doesnt call onPlayerVehicleExit() local vehicle = getPlayerOccupiedVehicle(player) if vehicle~=false then local seat = getPlayerOccupiedVehicleSeat(player) OnPlayerVehicleExit(vehicle,seat,-1) -- removePlayerFromVehicle(player) end local skin = getElementData(spawn_info2[class],"model") spawnPlayer(player,px,py,pz,rot,skin,0,0,game_teams[team].team) -- local team_text = "ptpm_spawned"..team -- setElementData(player,team_text,getElementData(player,team_text)+1) setCameraMode(player,"player") setCameraTarget(player,player) local class_root = getElementByID(string.lower(team_names[team])) local class_root_child = getElementsByType("spawn",class_root) local class_element = getElementChild (class_root,class+#class_root_child-1) local class_type_string = getElementData(class_element,"type") local class_type if string.find(class_type_string,"medic")~=nil then class_type = "medic" else class_type = "generic" end if getElementData(player,"ptpm_team")==TEAM_PRIMEMINISTER and getElementData(player,"ptpm_class")==1 then current_pm = -1 outputChatBox(getClientName(player).." is no longer the Prime Minister.",root,255,255,64,true) end setTimer(setElementData,1000,1,player,"ptpm_spawned",true) setElementData(player,"ptpm_team",team) setElementData(player,"ptpm_class",class) setElementData(player,"ptpm_class_type",class_type) if ((class==1) and (team==TEAM_PRIMEMINISTER)) then current_pm = player outputChatBox(getClientName(player).." is now the Prime Minister.",root,255,255,64,true) plan_active = 0 pm_fresh = 1 pm_health_penalty_safe = 6 end if ((team==TEAM_BODYGUARD) or (team==TEAM_COP)) then if plan_active == 1 then Plan(player) end end if distance_display == 1 then if team~=TEAM_PSYCHO and team~=TEAM_PRIMEMINISTER then -- psychos arnt allowed to see it, pm doesnt need to see it textDisplayAddObserver(distance_display_text[player],player) else textDisplayRemoveObserver(distance_display_text[player],player) end end local red = getElementData(spawn_info2[class],"red") local green = getElementData(spawn_info2[class],"green") local blue = getElementData(spawn_info2[class],"blue") setPlayerNametagColor(player,red,green,blue) local wep1 = getElementData(spawn_info2[class],"wep1") local ammo1 = getElementData(spawn_info2[class],"ammo1") giveWeapon(player,wep1,ammo1) local wep2 = getElementData(spawn_info2[class],"wep2") local ammo2 = getElementData(spawn_info2[class],"ammo2") giveWeapon(player,wep2,ammo2) local wep3 = getElementData(spawn_info2[class],"wep3") local ammo3 = getElementData(spawn_info2[class],"ammo3") giveWeapon(player,wep3,ammo3) setPlayerArmor(player,0) setElementHealth(player,100) setPlayerMoney(player,pocket_money) -- setBlipColor(player_blip[player],red,green,blue,255) destroyBlipsAttachedTo(player) if team_specific_radar~=1 then player_blip[player] = createBlipAttachedTo(player,0,2,red,green,blue,150) else player_blip[player] = createBlipAttachedTo(player,0,2,red,green,blue,150,0) end if ((class==1) and (team==TEAM_PRIMEMINISTER)) then setBlipColor(player_blip[player],red,green,blue,255) end setPlayerStat(player,160,999) -- driving setPlayerStat(player,229,999) -- bike setPlayerStat(player,230,999) -- pedal bike setPlayerStat(player,225,999) -- underwater stamina setPlayerStat(player,165,999) -- energy setPlayerStat(player,22,999) -- stamina setPlayerStat(player,69,999) -- weapons setPlayerStat(player,70,999) setPlayerStat(player,71,999) setPlayerStat(player,72,999) setPlayerStat(player,74,999) setPlayerStat(player,75,999) setPlayerStat(player,76,999) setPlayerStat(player,77,999) setPlayerStat(player,78,999) setPlayerStat(player,79,999) if crouchObject[player] then destroyElement(crouchObject[player]) destroyElement(crouchCorona[player]) end crouchObject[player] = nil crouchCorona[player] = nil BoundarySafe(player,10) triggerClientEvent(player,"PlayerRespawn",root) end addEvent("SpawnPlayer",true) addEventHandler("SpawnPlayer",root,SpawnPlayerFunc) function OnPlayerChatFunc(message,message_type) if message_type == 0 then -- normal chat cancelEvent() message = string.gsub(message, "#%x%x%x%x%x%x", "") local r,g,b = getPlayerNametagColor(source) local chattername = getClientName(source) chattername = string.gsub(chattername,"#%x%x%x%x%x%x","") if string.find(message,"!")==1 then -- team message (a '!' as character 1) message = string.sub(message,2) local team = getElementData(source,"ptpm_team") for index, player in ipairs(getElementsByType("player")) do if player then if SameTeam(getElementData(player,"ptpm_team"),team) then outputChatBox("(TEAM) "..chattername.."#FFFFFF: "..message,player,r,g,b,true) end end end else -- normal chat outputChatBox(chattername.."#FFFFFF: "..message,root,r,g,b,true) end elseif message_type == 1 then -- action cancelEvent() message = string.gsub(message, "#%x%x%x%x%x%x", "") local r,g,b = getPlayerNametagColor(source) local chattername = getClientName(source) chattername = string.gsub(chattername,"#%x%x%x%x%x%x","") outputChatBox(chattername.." "..message,root,r,g,b,true) elseif message_type == 2 then -- teamchat cancelEvent() outputChatBox("Use \"!message\" for team chat.",source) end end addEventHandler("onPlayerChat",root,OnPlayerChatFunc) function ChangePlayerNick(nick) setClientName(source,nick) end addEvent("ChangePlayerNick",true) addEventHandler("ChangePlayerNick",root,ChangePlayerNick) function OnPlayerWastedFunc(ammo,killer,weapon,bodypart) setElementData(source,"deaths",getElementData(source,"deaths")+1) setElementData(source,"ptpm_deaths",getElementData(source,"ptpm_deaths")+1) if killer then if (getElementType(killer)=="player") then setElementData(killer,"kills",getElementData(killer,"kills")+1) setElementData(killer,"ptpm_kills",getElementData(source,"ptpm_kills")+1) -- setElementData(killer,"ptpm_weapon_"..getWeaponNameFromID(weapon),getElementData(killer,"ptpm_weapon_"..getWeaponNameFromID(weapon))+1) end end if source == current_pm then EveryoneViewsBodyClientTrigger(current_pm) if (killer) then if (getElementType(killer)=="player") then local killer_team = getElementData(killer,"ptpm_team") if killer_team == TEAM_TERROR then outputChatBox("The Prime Minister was murdered by the Terrorists!",root) setElementData(killer,"ptpm_pmkills",getElementData(killer,"ptpm_pmkills")+1) elseif killer_team == TEAM_COP then outputChatBox("The Prime Minister was killed by the Cops!",root) elseif killer_team == TEAM_BODYGUARD then outputChatBox("The Prime Minister was killed by his treacherous bodyguards!",root) elseif killer_team == TEAM_PSYCHO then outputChatBox("The Prime Minister was killed by a Psycho!",root) setElementData(killer,"ptpm_pmkills",getElementData(killer,"ptpm_pmkills")+1) else outputChatBox("The Prime Minister was killed in an accident!",root) end else outputChatBox("The Prime Minister was killed in an accident!",root) end else outputChatBox("The Prime Minister was killed in an accident!",root) end else player_respawn_timer[source] = setTimer(SpawnPlayerFunc,5000,1,source,getElementData(source,"ptpm_team"),getElementData(source,"ptpm_class"),0) end end addEventHandler("onPlayerWasted",root,OnPlayerWastedFunc) function CalcTeamBalance(player,team) if ((team==TEAM_PRIMEMINISTER) and (countPlayersInTeam(game_teams[TEAM_PRIMEMINISTER].team)>0)) then return false end -- already 1 pm if ((team==TEAM_PRIMEMINISTER) and (countPlayersInTeam(game_teams[TEAM_PRIMEMINISTER].team)==0)) then return true end -- be the pm if getPlayerTeam(player) == team then return true end -- same team (not pm though) if getPlayerCount()<=100 then return true end -- less than 6 players if team==TEAM_PSYCHO then return true end -- psycho always works local t_count = countPlayersInTeam(game_teams[TEAM_TERROR].team) local b_count = countPlayersInTeam(game_teams[TEAM_BODYGUARD].team) local c_count = countPlayersInTeam(game_teams[TEAM_COP].team) local team_count = t_count + b_count + c_count -- if ((team+1~=3) and (team+1~=1)) then team_count = team_count + 1 end team_count = team_count + 1 if ((getPlayerTeam(player)~=TEAM_PRIMEMINISTER) and (getPlayerTeam(player)~=TEAM_PSYCHO)) then team_count = team_count - 1 end local prebalancedness = 0.0 -- current balance local postbalancedness = 0.0 -- requested balance if ((b_count*100)/team_count > 30) then return false end -- too many bguards prebalancedness = prebalancedness + 0.42 * b_count -- a bodyguard is worth 2 cops prebalancedness = prebalancedness + 0.28 * c_count prebalancedness = prebalancedness + -0.28 * t_count if team==TEAM_TERROR then t_count = t_count+1 elseif team==TEAM_BODYGUARD then b_count = b_count+1 elseif team==TEAM_COP then c_count = c_count+1 end postbalancedness = postbalancedness + 0.42 * b_count postbalancedness = postbalancedness + 0.28 * c_count postbalancedness = postbalancedness + -0.28 * t_count if team_count==0 then prebalancedness = 0 end -- no team players when request was made, so allow spawn local prepain = (math.abs(prebalancedness)*100) / team_count -- absolute value local postpain = (math.abs(postbalancedness)*100) / team_count prepain = math.ceil(prepain) postpain = math.ceil(postpain) if (((prepain<=10) or (postpain < prepain)) and (team~=TEAM_BODYGUARD)) then return true end -- everything ok -- not ok return false end function RoundTick() round_timer_counter = round_timer_counter + 1 if pm_health_bonus == 1 then if current_pm~=-1 then if round_timer_counter%5==0 then local health = getElementHealth(current_pm) if ((health+1)<=100) then setElementHealth(current_pm,health+1) else setElementHealth(current_pm,100) end end end end if medic_health_bonus == 1 then for index, player in ipairs(getElementsByType("player")) do if player then if getElementData(player,"ptpm_class_type")=="medic" then local health = getElementHealth(player) if ((health+1)<=100) then setElementHealth(player,health+1) else setElementHealth(player,100) end end end end end if round_timer_counter==round_time then EveryoneViewsBodyClientTrigger(current_pm) outputChatBox("The Prime Minister Survived!",root) if current_pm~=-1 then setElementData(current_pm,"ptpm_pmvictory",getElementData(current_pm,"ptpm_pmvictory")+1) end end if (round_timer_counter%150==0 and round_timer_counter>0 and round_timer_counter0 and round_timer_counter0 then pm_health_penalty_safe=pm_health_penalty_safe-1 end if pm_health_penalty_safe==0 then if round_timer_counter%pm_abandoned_health_penalty==0 then ChangeHealth(current_pm,-2) end end end end if current_pm~=-1 then if pm_health_increase_check==1 then if getElementHealth(current_pm)>0 then pm_health_increase_current = getElementHealth(current_pm) if pm_health_increase_current > pm_health_increase_previous and not getPlayerOccupiedVehicle(current_pm) then setElementHealth(current_pm,pm_health_increase_previous) end pm_health_increase_previous = pm_health_increase_current end end end end function BoundCheck() for index, player in ipairs(getElementsByType("player")) do if player then if getElementData(player,"ptpm_spawned")==true then local x,y,z = getElementPosition(player) if z<1000 then if player_boundary_safe[player]>0 then player_boundary_safe[player] = player_boundary_safe[player]-1 end if player_boundary_safe[player]==0 then if PlayerOutOfBounds(x,y)==true then outputChatBox("You are out of bounds!",player) local good_x = last_good_x[player] local good_y = last_good_y[player] local good_z = last_good_z[player] local vehicle = getPlayerOccupiedVehicle(player) if vehicle~=false and player==getVehicleController(vehicle) then setElementPosition(vehicle,good_x,good_y,good_z) local rx,ry,rz = getVehicleRotation(vehicle) setVehicleRotation(vehicle,rx,ry,(rz+180)%361) x,y,z = getElementVelocity(vehicle) setElementVelocity(vehicle,x-(x*2),y-(y*2),z-(z*2)) BoundarySafe(player,2) else setElementPosition(player,good_x,good_y,good_z) x,y,z = getElementVelocity(player) setElementVelocity(player,0,0,0) BoundarySafe(player,2) end else last_good_x[player] = x last_good_y[player] = y last_good_z[player] = z end end end end end end end function BoundarySafe(player,amount) player_boundary_safe[player] = amount end function ChangeHealth(player,amount) local health = getElementHealth(player) if ((health+amount)<=100 and (health+amount)>0) then setElementHealth(player,health+amount) elseif (health+amount<=0) then killPlayer(player) else setElementHealth(player,100) end end function Motd(player) outputChatBox("Welcome to "..ptpm_mode_name..".",player) outputChatBox("Select a character class, and have fun!",player) outputChatBox("Updates: Version 1.1 released!",player) outputChatBox("Please report all bugs to the forum (press f9 for url)",player) outputChatBox("Use /motd to see this \"message of the day\".",player) end function PlayerSwapclass(player,command,victim) if command_block==1 then return end if swapclass_victim~=nil then outputChatBox("You have already sent a swapclass offer to someone else.",player) return end local your_team = getElementData(player,"ptpm_team") if your_team ~= TEAM_PRIMEMINISTER then outputChatBox("Only the Prime Minister may use this command. (team: "..your_team..")",player) return end local your_class = getElementData(player,"ptpm_class") if your_class ~= 1 then outputChatBox("Only the Prime Minister may use this command. (class: "..your_class")",player) return end local victim_element = GetElementFromName(player,victim) if victim_element == false then return end if player == victim_element then outputChatBox("You may not swapclass with yourself.",player) return end local victim_team = getElementData(victim_element,"ptpm_team") if victim_team == -1 then outputChatBox("Invalid arguments. Usage: /swapclass ",player) return end local victim_class = getElementData(victim_element,"ptpm_class") if victim_class == -1 then outputChatBox("Invalid arguments. Usage: /swapclass ",player) return end -- both players are spawned with a valid team/class, so proceed to show message textItemSetText(swapclass_message,getClientName(player).." wants to swapclass with you. Type /y to accept & /n to decline") textDisplayAddObserver(swapclass_display,victim_element) outputChatBox("Swapclass offer sent to "..getClientName(victim_element),player) swapclass_victim = victim_element end function PrintTime(player) if command_block==1 then return end local minutes = math.floor((round_time - round_timer_counter) / 60) local seconds = math.floor((round_time - round_timer_counter) % 60) outputChatBox("Time left: "..minutes..":"..seconds,player) end function EveryoneViewsBodyClientTrigger(current_pm) for index, player in ipairs(getElementsByType("player")) do if player then if player_blip[player] then setBlipColor(player_blip[player],0,0,0,0) end removePlayerFromVehicle(player) end end if current_pm~=-1 then local x,y,z = getElementPosition(current_pm) triggerClientEvent(root,"EveryoneViewsBody",root,current_pm,x,y,z) else triggerClientEvent(root,"EveryoneViewsBody",root,current_pm,-1,-1,-1) end triggerClientEvent(root,"ForceMapvoteMenuShow",root) setTimer(OnRoundEnd,7000,1) command_block = 1 end function PrintPmName(player) if command_block==1 then return end if current_pm ~= -1 then local pm = getClientName(current_pm) if pm~=false then outputChatBox("Current Prime Minister: "..pm,player) end else outputChatBox("There is currently no Prime Minister.",player) end end function KillPlayer(player) if command_block==1 then return end if player == current_pm then outputChatBox("The Prime Minister may not kill himself.",player) return end killPlayer(player) end function ExplainRole(player) if command_block==1 then return end local team = getElementData(player,"ptpm_team") if team==TEAM_PSYCHO then outputChatBox("Nobody wants to be your friend. So trust noone. Kill them all.",player); elseif team==TEAM_TERROR then outputChatBox("Your role is to try and kill the Prime Minister(yellow) before the timer runs out. You must work with the",player) outputChatBox("other terrorists(pink) as a team. You must avoid the cops(blue) as they will hunt you.",player) outputChatBox("Beware of psychopaths(orange), they will kill anyone.",player) --if (obj_counter>0) then -- outputChatBox("The Prime Minister and his bodyguards will be visiting areas of the city. These",player); -- outputChatBox("are red on the radar. You should try and ambush him on his way there, siege him",player); -- outputChatBox("when he is there, and drive him away. If the Prime Minister achieves his objectives",player); -- outputChatBox("then you lose the game.",player); --end elseif team==TEAM_PRIMEMINISTER then --if (obj_counter==0) then outputChatBox("Your role is to avoid being killed by terrorists(pink) or psychopaths(orange) until the timer runs out.",player) outputChatBox("Use /timeleft to find out how long there is left.",player); --else --outputChatBox("Your role is to visit and each of the objectives in order. You must defend the objective",player); --outputChatBox("for the specified time before the next objective will be revealed. Terrorists(pink) and",player); --outputChatBox("psychopaths(orange) will try to kill you. If you die, the terrorists win.",player); --outputChatBox("THERE IS NO TIME LIMIT FOR THIS GAME!",player); --end --- outputChatBox("You must work with your loyal bodyguards(green), they will protect you.",player); -- outputChatBox("You are to co-operate with the local police(blue), who will hunt the terrorists.",player); elseif team==TEAM_BODYGUARD then outputChatBox("Your duty is to stay with the Prime Minister(yellow) and protect him from harm. Terrorists(pink) will soon",player) outputChatBox("try and murder him. Also beware of Psychopaths(orange). You are to co-operate with the local police(blue),",player) outputChatBox("who will hunt the terrorists.",player); --if (obj_counter>0) then -- outputChatBox("The Prime Minister will be visiting areas of the city. These are red on the radar.",player); -- outputChatBox("The terrorists know where he needs to go, so you must prevent them from ambushing or",player); --- outputChatBox("successfully sieging the Prime Minister. If he is killed, you lose the game.",player); --end elseif team==TEAM_COP then outputChatBox("Your orders are to kill the terrorists(pink) without harming the bodyguards(green) or the Prime Minister(yellow).",player) outputChatBox("Also beware of psychopaths(orange). Protect the Prime Minister!",player); --if (obj_counter>0) then -- outputChatBox("The Prime Minister and his bodyguards will be visiting areas of the city. These",player); -- outputChatBox("are red on the radar. You should focus your efforts there, clean out the terrorists",player); -- outputChatBox("so that the prime minister can go in. Then defend the area until he is done.",player); --end end local type = getElementData(player,"ptpm_class_type") if type=="medic" then outputChatBox("You are a medic, you can heal people with /heal.",player) end --if (safehouse_exists) then -- outputChatBox("Only terrorists and bodyguards may fly the hydra or seasparrow.",player); -- outputChatBox("The Prime Minister's safehouse (red) is a hydra/seasparrow free zone.",player); --end end function PrintHelp(player) outputChatBox("Press F9 or type /gamehelp to see the helpbox.",player) outputChatBox("/reclass (change class) /swapclass (for pm) /intel",player) outputChatBox("/help /duty /motd /pm /timeleft /kill /heal ",player) outputChatBox("/plan /plan (show plan) /knock /map",player) outputChatBox("/mapvote /register /players /callvote /endvote",player) end function GetCameraMode(player) local cam = getCameraMode(player) if cam~=false then outputChatBox("cam: "..cam,player) end end function PlayerHealPlayer(medic,command,intended_patient_name) if command_block==1 then return end if getElementData(medic,"ptpm_class_type")~="medic" then -- must be a medic outputChatBox("You are not a medic!",medic) return end local intended_patient = GetElementFromName(medic,intended_patient_name) if intended_patient == false then return end if medic==intended_patient then -- cant heal yourself outputChatBox("Physicians may not heal themselves!",medic) return end local mx,my,mz = getElementPosition(medic) local patient if intended_patient~=nil then -- if a name was specified, use that name patient = intended_patient else local d1 = 1000000.0 for index, player in ipairs(getElementsByType("player")) do -- otherwise loop through all players and find the closest one if player then if player~=medic then local x,y,z = getElementPosition(player) local d2 = getDistanceBetweenPoints3D(mx,my,mz,x,y,z) if d22.0 then outputChatBox("Too far from "..getClientName(patient),medic) return end local medic_health = getElementHealth(medic) local patient_health = getElementHealth(patient) if medic_health<2 then outputChatBox("Health too low.",medic) return end -- medic cant kill himself by healing someone if patient_health==100 then outputChatBox("There is nothing you can do.",medic) return end -- if patient has full health local medicine = math.floor((100 - patient_health)/2) if (medicine > (medic_health-1)) then medicine = medic_health-1 end outputChatBox(string.format("Initial health: medic: %.1f patient: %.1f medicine %.1f",medic_health,patient_health,medicine),medic) outputChatBox(string.format("Initial health: medic: %.1f patient: %.1f medicine %.1f",medic_health,patient_health,medicine),patient) -- outputChatBox(string.format("Final health: medic: %.1f patient: %.1f",medic_health-medicine,patient_health+(medicine*2)),medic) -- outputChatBox(string.format("Final health: medic: %.1f patient: %.1f",medic_health-medicine,patient_health+(medicine*2)),patient) if medicine<=0.0 then outputChatBox("There is nothing you can do.",medic) return end setElementHealth(medic,medic_health-medicine) setElementHealth(patient,patient_health+(medicine*2)) outputChatBox(string.format("Gave %.2f of health to patient.",medicine),medic) outputChatBox(string.format("You were healed by %.2f health.",medicine),patient) end function Plan(player,command,...) if command_block==1 then return end local team = getElementData(player,"ptpm_team") local plan_message = {...} if #plan_message == 0 then -- if no arguments were passed (ie: just viewing the plan) if ((team==TEAM_PRIMEMINISTER) or (team==TEAM_BODYGUARD) or (team==TEAM_COP)) then -- if they are a 'good guy' if plan_active == 1 then -- if there is a plan outputChatBox("Plan: "..plan_text,player) return -- show the plan else outputChatBox("The Prime Minister has not outlined a plan.",player) -- there is no plan end else outputChatBox("You are not allowed to see the plan.",player) return -- 'bad guys' cant see the plan end else -- if arguments were passed (ie: attempting to set the plan) if team==TEAM_PRIMEMINISTER then -- must be prime minister to set the plan plan_text = table.concat(plan_message," ") -- format the plan text with all the arguments plan_active = 1 -- set the plan to active for index, pplayer in ipairs(getElementsByType("player")) do -- loop all players if pplayer then local pteam = getElementData(pplayer,"ptpm_team") if ((pteam==TEAM_PRIMEMINISTER) or (pteam==TEAM_BODYGUARD) or (pteam==TEAM_COP)) then -- if they are a 'good guy' outputChatBox("New plan!",pplayer,255,0,0,true) -- show them the new plan outputChatBox("Plan: "..plan_text,pplayer) return end end end else outputChatBox("Only the Prime Minister can outline a plan.",player) end end end function PrintPlayers(player) outputChatBox("Players: "..getPlayerCount(),player) end -- returns 1 if x,y crosses the line on its way to -infinity,y function LeftIntersect(x,y,x1,y1,x2,y2) -- returns 1 if %2 is between %1 and %3 (y1,y,y2) if ((tonumber(y1)<=tonumber(y) and tonumber(y)<=tonumber(y2)) or (tonumber(y2)<=tonumber(y) and tonumber(y)<=tonumber(y1))) then else return 0 end -- x co-ord of point on the line, at height y local point = (tonumber(y)-tonumber(y1)) * (tonumber(x2)-tonumber(x1)) / (tonumber(y2)-tonumber(y1)) + tonumber(x1) if tonumber(x)>point then return 1 else return 0 end end function IsCoordInPolygon(x,y,xs,ys,num_edges) local c = 0 local j = num_edges-1 for i = 0,num_edges-1 do if i~=0 then j=i-1 end if (LeftIntersect(x,y,xs[i],ys[i],xs[j],ys[j])~= 0) then c = c+1 end end if num_edges == 0 then return 1 end if ((c%2)==1) then return 1 else return 0 end end function PlayerOutOfBounds(x,y) if IsCoordInPolygon(x,y,game_boundary_x,game_boundary_y,game_boundary_count)==1 then return false -- within bounds end return true -- out of bounds end function GetElementFromName(player,victim_name) if victim_name==nil then return end local victim_element local num_matches = 0 for index, player in ipairs(getElementsByType("player")) do if player then local name = getClientName(player) if string.find(string.lower(name),string.lower(victim_name))~=nil then victim_element = player num_matches = num_matches+1 end end end if num_matches == 0 then outputChatBox("No match for \""..victim_name.."\".",player) return false elseif num_matches == 1 then return victim_element elseif num_matches > 1 then outputChatBox("Too many matches ("..num_matches..") for \""..victim_name.."\".",player) return false end end function OnPlayerStartEnterVehicle(player,seat,jacked) if seat==0 then if cant_drive_vehicle[tonumber(getElementData(player,"ptpm_team"))][getVehicleID(source)]==1 then cancelEvent() outputChatBox("You are not qualified to use this vehicle!",player) end else if cant_passenger_vehicle[tonumber(getElementData(player,"ptpm_team"))][getVehicleID(source)]==1 then cancelEvent() outputChatBox("You are not qualified to enter this vehicle!",player) end end end addEventHandler("onVehicleStartEnter",root,OnPlayerStartEnterVehicle ) function OnPlayerVehicleEnter(vehicle,seat,jacked) if source==current_pm then pm_fresh = 0 end local map = current_map if getResourceName(map)=="ptpm_air_assault" then if getElementData(vehicle,"ptpm_vehicle_fresh")==1 then if getVehicleID(vehicle)==476 then -- rustler local team = getElementData(vehicle,"ptpm_vehicle_team") local x,y,z = getElementPosition(vehicle) if team==TEAM_TERROR then -- terror setElementPosition(vehicle,x,y,z+math.random(10,50)) setElementVelocity(vehicle,-4,0,0) setVehicleLandingGearDown(vehicle,false) elseif team==TEAM_BODYGUARD then -- bguard setElementPosition(vehicle,x,y,z+math.random(10,50)) setElementVelocity(vehicle,-5,0,0) setVehicleLandingGearDown(vehicle,false) elseif team==TEAM_COP then -- cop setElementPosition(vehicle,x,y,z+math.random(10,50)) setElementVelocity(vehicle,4.8,4.7,0) setVehicleLandingGearDown(vehicle,false) end end end end setElementData(vehicle,"ptpm_vehicle_fresh",0) if respawn_table[vehicle].timer then killTimer(respawn_table[vehicle].timer) respawn_table[vehicle].timer = nil end end addEventHandler("onPlayerVehicleEnter",root,OnPlayerVehicleEnter) function OnPlayerVehicleExit(vehicle,seat,jacker) local players_in_car = 0 for index,player in ipairs(getElementsByType("player")) do if player then if isPlayerInVehicle(player) and getPlayerOccupiedVehicle(player) == vehicle then players_in_car = players_in_car + 1 end end end if players_in_car == 0 then respawn_table[vehicle].timer = setTimer(RespawnVehicle,respawn_table[vehicle].delay,1,vehicle) end end addEventHandler("onPlayerVehicleExit",getRootElement(),OnPlayerVehicleExit) function RespawnVehicle(vehicle) respawnVehicle(vehicle) setElementData(vehicle,"ptpm_vehicle_fresh",1) respawn_table[vehicle].timer = nil PlayerVehicleDetach(vehicle) end function OnVehicleRespawn(explosion) setElementData(source,"ptpm_vehicle_fresh",1) PlayerVehicleDetach(source) end addEventHandler("onVehicleRespawn",root,OnVehicleRespawn) function PlayerVehicleDetach(vehicle) local elements = getAttachedElements(vehicle) if elements then for index, element in ipairs(elements) do if getElementType(element)=="player" then detachElementFromElement(element,vehicle) triggerClientEvent(element,"UnstickFromVehicle",root) end end end end function PlayerVehicleStickTrigger(stick,vehicle,x,y,z) if stick == 1 then -- stick attachElementToElement(source,vehicle,x,y,z) elseif stick == 0 then -- unstick detachElementFromElement(source,vehicle) end end addEvent("PlayerVehicleStickTrigger",true) addEventHandler("PlayerVehicleStickTrigger",root,PlayerVehicleStickTrigger) function SameTeam(team1,team2) if (team1==team2 and team1~=TEAM_PSYCHO) then return true end if ((team1==TEAM_PRIMEMINISTER and team2==TEAM_BODYGUARD) or (team1==TEAM_BODYGUARD and team2==TEAM_PRIMEMINISTER)) then return true end if ((team1==TEAM_PRIMEMINISTER and team2==TEAM_COP) or (team1==TEAM_COP and team2==TEAM_PRIMEMINISTER)) then return true end if ((team1==TEAM_BODYGUARD and team2==TEAM_COP) or (team1==TEAM_COP and team2==TEAM_BODYGUARD)) then return true end return false end function PlayerMapVoteCommand(player,command,...) local args = {...} if #args == 0 then ShowPlayerMapvoteMenuTrigger(player) elseif tonumber(args[1])~=nil and tonumber(args[1])>=1 and tonumber(args[1])<=12 then -- if its numerical if supported[tonumber(args[1])]==1 then -- if its supported PlayerMapVote(player,tonumber(args[1]),getElementData(player,"ptpm_mapvote"),3) -- player mapvote end else local map = args[1] local vote = -1 if map=="ls_hydra" or map=="ls_h" or map=="lshydra" or map=="lsh" then vote = 1 elseif map=="sf" or map=="sanfierro" or map=="sanf" then vote = 2 elseif map=="desert" or map=="d" then vote = 3 elseif map=="area51" or map=="a51" then vote = 4 elseif map=="lv_obj" or map=="lvobj" or map=="lvo" then vote = 5 elseif map=="air" or map=="air_assault" or map=="airassault" then vote = 6 elseif map=="chiliad" or map=="chilliad" or map=="chill" or map=="chil" then vote = 7 elseif map=="country" or map=="countryside" or map=="cs" then vote = 8 elseif map=="ls" or map=="los_santos" or map=="lossantos" then vote = 9 elseif map=="las_venturas" or map=="lv" or map=="lasventuras" then vote = 10 elseif map=="factory" or map=="fac" then vote = 11 elseif map=="bayside" or map=="bay" then vote = 12 end if vote~=-1 and supported[vote]==1 then PlayerMapVote(player,vote,getElementData(player,"ptpm_mapvote"),4) -- player mapvote end end end function ShowPlayerMapvoteMenuTrigger(player) if (player) then triggerClientEvent(player,"ShowPlayerMapvoteMenu",root) end end function PlayerMapVote(player,vote,previous_vote,via) if vote==previous_vote then return end local via_ if via==1 then via_ = "menu [single digit]" elseif via==2 then via_ = "menu [double digit]" elseif via==3 then via_ = "command [digit]" elseif via==4 then via_ = "command [text]" end -- outputChatBox("You voted for map # "..vote.." ("..via_..").",player) outputChatBox("You voted for map #"..vote..".",player) setElementData(player,"ptpm_mapvote",vote) -- update the new scores on every players client triggerClientEvent(player,"ResetMapvoteColours",root,vote,previous_vote) local vote_table = {0,0,0,0,0,0,0,0,0,0,0,0} for index, pplayer in ipairs(getElementsByType("player")) do if player then local vote_ = tonumber(getElementData(pplayer,"ptpm_mapvote")) if vote_~=-1 then vote_table[vote_] = vote_table[vote_] + 1 end end end triggerClientEvent(root,"UpdateMapVotesInMenu",root,vote_table) end addEvent("PlayerMapVote",true) addEventHandler("PlayerMapVote",root,PlayerMapVote) function PlayerReclassCommand(player,command,...) if command_block==1 then return end local args = {...} if getElementData(player,"ptpm_team")==3 then outputChatBox("The Prime Minister must use /swapclass.",player) return end if #args==0 then ClientSpawnMenuTrigger(player) else local team = args[1] local class = -1 local team_id = -1 if team=="psycho" or team=="p" or team=="psychopath" then local class_info = getElementByID("psychopath") local classes = getElementsByType("skin",class_info) class = math.random(1,#classes) team_id = 1 elseif team=="terror" or team=="t" or team=="terrorist" then local class_info = getElementByID("terrorist") local classes = getElementsByType("skin",class_info) class = math.random(1,#classes) team_id = 2 elseif team=="pm" or team=="prime_minister" or team=="primeminister" or team=="prime" then local class_info = getElementByID("prime minister") local classes = getElementsByType("skin",class_info) class = math.random(1,#classes) team_id = 3 elseif team=="bguard" or team=="b" or team=="bodyguard" or team=="bodyg" then local class_info = getElementByID("bodyguard") local classes = getElementsByType("skin",class_info) class = math.random(1,#classes) team_id = 4 elseif team=="cop" or team=="c" then local class_info = getElementByID("cop") local classes = getElementsByType("skin",class_info) class = math.random(1,#classes) team_id = 5 elseif team=="tm" or team=="tmedic" then team_id = 2 local class_info = getElementByID("terrorist") local classes = getElementsByType("skin",class_info) for index,the_class in ipairs(classes) do if string.find(getElementData(the_class,"type"),"medic") then class = index end end elseif team=="bm" or team=="bmedic" then team_id = 4 local class_info = getElementByID("bodyguard") local classes = getElementsByType("skin",class_info) for index,the_class in ipairs(classes) do if string.find(getElementData(the_class,"type"),"medic") then class = index end end elseif team=="cm" or team=="cmedic" then team_id = 5 local class_info = getElementByID("cop") local classes = getElementsByType("skin",class_info) for index,the_class in ipairs(classes) do if string.find(getElementData(the_class,"type"),"medic") then class = index end end end if class~=-1 then SpawnPlayerFunc(player,team_id,class,0) end end end function PlayerCallvoteCommand(player,command,victim_,...) local victim = GetElementFromName(player,victim_) if victim == false then return end local admins=ReturnOnlineAdmins() if #admins>0 then outputChatBox("Use /report to report a cheater to the admins.",player) return end local args = {...} if #args==0 then outputChatBox("You didnt enter a reason. Usage: /callvote ",player) return end local reason = table.concat(args," ") if string.len(reason)>60 then outputChatBox("Your reason must be less than 60 characters.",player) return end if vote_timer then outputChatBox("There is already a vote in progress.",player) return end -- begin vote vote_victim = victim vote_initiator = player vote_reason = reason vote_serial = getPlayerSerial(vote_victim) vote_victim_name = getClientName(vote_victim) votes_left = 1 + (getPlayerCount()*5)/10 if votes_left==getPlayerCount() then votes_left = votes_left - 1 end if votes_left<2 then votes_left = 2 end votes_left = math.floor(votes_left) vote_timer = setTimer(ResetVote,90000,1,1) -- log the callvote local init_serial = getPlayerSerial(vote_initiator) local vic_serial = getPlayerSerial(vote_victim) if init_serial~=false and vic_serial~=false then outputServerLog("CALLVOTE: "..getClientName(vote_initiator).." ("..getClientIP(vote_initiator)..")[account: "..getPlayerUserName(vote_initiator).." [serial: "..init_serial.."]] called a vote against "..vote_victim_name.." ("..getClientIP(vote_victim)..")[account: "..getPlayerUserName(vote_victim).." [serial: "..vic_serial.."]] with the reason: "..vote_reason) elseif init_serial==false and vic_serial==false then outputServerLog("CALLVOTE: "..getClientName(vote_initiator).."[account: "..getPlayerUserName(vote_initiator).."[serial: INVALID]] called a vote against "..vote_victim_name.." [account: "..getPlayerUserName(vote_victim).." [serial: INVALID]] with the reason: "..vote_reason) elseif init_serial~=false and vic_serial==false then outputServerLog("CALLVOTE: "..getClientName(vote_initiator).." ("..getClientIP(vote_initiator)..")[account: "..getPlayerUserName(vote_initiator).." [serial: "..init_serial.."]] called a vote against "..vote_victim_name.." [account: "..getPlayerUserName(vote_victim).." [serial: INVALID]] with the reason: "..vote_reason) elseif init_serial==false and vic_serial~=false then outputServerLog("CALLVOTE: "..getClientName(vote_initiator).."[account: "..getPlayerUserName(vote_initiator).." [serial: INVALID]] called a vote against "..vote_victim_name.." ("..getClientIP(vote_victim)..")[account: "..getPlayerUserName(vote_victim).." [serial: "..vic_serial.."]] with the reason: "..vote_reason) end triggerClientEvent(root,"UpdateCallvoteMenu",root,getClientName(vote_victim),vote_reason,votes_left) triggerClientEvent(root,"ShowCallvoteMenu",root) end function ResetVote(reason) if isElement(vote_initiator) then outputServerLog("CALLVOTE: vote by "..getClientName(vote_initiator).." on "..vote_victim_name.." closed.") else outputServerLog("CALLVOTE: vote on "..vote_victim_name.." closed.") end triggerClientEvent(root,"HideCallvoteMenu",root,nil,nil,reason) vote_victim = nil vote_initiator = nil killTimer(vote_timer) vote_timer = nil votes_left = nil vote_reason = nil vote_serial = nil vote_victim_name = nil if reason==1 then outputChatBox("Vote closed. Not enough votes.",root) elseif reason==2 then outputChatBox("Vote closed. Vote successful.",root) elseif reason==3 then outputChatBox("Vote closed by initiator.",root) elseif reason==4 then outputChatBox("Vote closed by admin.",root) end for index, player in ipairs(getElementsByType("player")) do if player then player_callvote_voted[player] = 0 end end end function AddVote(player) if not vote_timer then outputChatBox("There is no vote currently.",player) return end if player_callvote_voted[player]==1 then outputChatBox("You have already voted.",player) return end player_callvote_voted[player] = 1 votes_left = votes_left - 1 outputChatBox("Vote cast.",player) triggerClientEvent("UpdateCallvoteMenu",root,getClientName(vote_victim),vote_reason,votes_left) if votes_left<=0 then --kickPlayer(vote_victim,vote_initiator,vote_reason) outputServerLog("CALLVOTE: "..getClientName(vote_victim).." voted off the server by "..getClientName(vote_initiator)) local victim = vote_victim local serial = vote_serial local name = vote_victim_name local reason = vote_reason ResetVote(2) if isElement(victim) then kickPlayer(victim,root,"Voted off server. 10 minute ban.") banSerial(serial) else banSerial(serial) outputChatBox(""..name.." voted off server, 10 minute ban. Reason: "..reason..".",root) end local index = 1 while callvote_ban_tracker[index]~=nil do index = index+1 end if index > callvote_ban_max then callvote_ban_max = index end callvote_ban_tracker[index] = {} callvote_ban_tracker[index].serial = serial callvote_ban_tracker[index].name = name callvote_ban_tracker[index].timer = setTimer(CallvoteUnban,600000,1,serial,index) end end addEvent("AddVote",true) addEventHandler("AddVote",getRootElement(),AddVote) function CallvoteUnban(serial,index) unbanSerial(serial) outputServerLog("CALLVOTE: "..callvote_ban_tracker[index].name.." ("..serial..") unbanned.") callvote_ban_tracker[index].serial = nil callvote_ban_tracker[index].timer = nil callvote_ban_tracker[index].name = nil callvote_ban_tracker[index] = nil end function PlayerEndvoteCommand(player,command) if vote_timer then if vote_initiator==player then ResetVote(3) elseif (hasObjectPermissionTo(player,"function.kickPlayer",false)) then ResetVote(4) else outputChatBox("You are not the initiator.",player) return end end end function OnPlayerPickupPickup(pickup) -- outputChatBox("PICKUP: type: "..getPickupType(pickup).." weapon: "..getPickupWeapon(pickup),source) end addEventHandler("onPlayerPickupUse",root,OnPlayerPickupPickup) --[[ addEventHandler("onClientLogout",root, function (previous,current) setAccountData(previous,"ptpm_kills",getElementData(source,"ptpm_kills")) setAccountData(previous,"ptpm_deaths",getElementData(source,"ptpm_deaths")) setAccountData(previous,"ptpm_pmkills",getElementData(source,"ptpm_pmkills")) setAccountData(previous,"ptpm_pmvictory",getElementData(source,"ptpm_pmvictory")) setAccountData(previous,"ptpm_spawned1",getElementData(source,"ptpm_spawned1")) setAccountData(previous,"ptpm_spawned2",getElementData(source,"ptpm_spawned2")) setAccountData(previous,"ptpm_spawned3",getElementData(source,"ptpm_spawned3")) setAccountData(previous,"ptpm_spawned4",getElementData(source,"ptpm_spawned4")) setAccountData(previous,"ptpm_spawned5",getElementData(source,"ptpm_spawned5")) setAccountData(previous,"ptpm_mapcount1",getElementData(source,"ptpm_mapcount1")) setAccountData(previous,"ptpm_mapcount2",getElementData(source,"ptpm_mapcount2")) setAccountData(previous,"ptpm_mapcount3",getElementData(source,"ptpm_mapcount3")) setAccountData(previous,"ptpm_mapcount4",getElementData(source,"ptpm_mapcount4")) setAccountData(previous,"ptpm_mapcount5",getElementData(source,"ptpm_mapcount5")) setAccountData(previous,"ptpm_mapcount6",getElementData(source,"ptpm_mapcount6")) setAccountData(previous,"ptpm_mapcount7",getElementData(source,"ptpm_mapcount7")) setAccountData(previous,"ptpm_mapcount8",getElementData(source,"ptpm_mapcount8")) setAccountData(previous,"ptpm_mapcount9",getElementData(source,"ptpm_mapcount9")) setAccountData(previous,"ptpm_mapcount10",getElementData(source,"ptpm_mapcount10")) setAccountData(previous,"ptpm_mapcount11",getElementData(source,"ptpm_mapcount11")) setAccountData(previous,"ptpm_mapcount12",getElementData(source,"ptpm_mapcount12")) end)]] addEventHandler("onClientLogout",root, function (previous,current) player_admin[source] = false end) addEventHandler("onClientLogin",root, function (previous,current,auto) -- outputChatBox("Successfully logged in.",source) -- taken from 'admin' resource local group = aclGetGroup("Admin") if (group) then local user = "user."..getAccountName(current) for id, object in ipairs(aclGroupListObjects(group)) do if (object==user) then player_admin[source] = true end end else outputChatBox ( "ERROR: Admin group not initialized." ) end --[[ local blur = getAccountData(current,"ptpm.blur") local acallv = getAccountData(current,"ptpm.callvote.alpha") local amapv = getAccountData(current,"ptpm.mapvote.alpha") local aset = getAccountData(current,"ptpm.settings.alpha") local akey = getAccountData(current,"ptpm.keys.alpha") local action1 = getAccountData(current,"ptpm.action1.key") local action2 = getAccountData(current,"ptpm.action2.key") local vstick = getAccountData(current,"ptpm.stick.key") setElementData(source,"ptpm_kills",getAccountData(current,"ptpm_kills")) setElementData(source,"ptpm_deaths",getAccountData(current,"ptpm_deaths")) setElementData(source,"ptpm_pmkills",getAccountData(current,"ptpm_pmkills")) setElementData(source,"ptpm_pmvictory",getAccountData(current,"ptpm_pmvictory")) setElementData(source,"ptpm_spawned1",getAccountData(current,"ptpm_spawned1")) setElementData(source,"ptpm_spawned2",getAccountData(current,"ptpm_spawned2")) setElementData(source,"ptpm_spawned3",getAccountData(current,"ptpm_spawned3")) setElementData(source,"ptpm_spawned4",getAccountData(current,"ptpm_spawned4")) setElementData(source,"ptpm_spawned5",getAccountData(current,"ptpm_spawned5")) setElementData(source,"ptpm_mapcount1",getAccountData(current,"ptpm_mapcount1")) setElementData(source,"ptpm_mapcount2",getAccountData(current,"ptpm_mapcount2")) setElementData(source,"ptpm_mapcount3",getAccountData(current,"ptpm_mapcount3")) setElementData(source,"ptpm_mapcount4",getAccountData(current,"ptpm_mapcount4")) setElementData(source,"ptpm_mapcount5",getAccountData(current,"ptpm_mapcount5")) setElementData(source,"ptpm_mapcount6",getAccountData(current,"ptpm_mapcount6")) setElementData(source,"ptpm_mapcount7",getAccountData(current,"ptpm_mapcount7")) setElementData(source,"ptpm_mapcount8",getAccountData(current,"ptpm_mapcount8")) setElementData(source,"ptpm_mapcount9",getAccountData(current,"ptpm_mapcount9")) setElementData(source,"ptpm_mapcount10",getAccountData(current,"ptpm_mapcount10")) setElementData(source,"ptpm_mapcount11",getAccountData(current,"ptpm_mapcount11")) setElementData(source,"ptpm_mapcount12",getAccountData(current,"ptpm_mapcount12")) triggerClientEvent(source,"UpdateSettings",root,false,blur,acallv,amapv,aset,akey,action1,action2,vstick,false,false,false)]] end) function ToggleSettingsWindowTrigger(player) local account = getClientAccount(player) if isGuestAccount(account) then outputChatBox("You must be logged into an account to access your settings.",player) return end triggerClientEvent(player,"ToggleSettingsWindow",root,getAccountData(account,"ptpm.blur"), getAccountData(account,"ptpm.callvote.alpha"), getAccountData(account,"ptpm.mapvote.alpha"), getAccountData(account,"ptpm.settings.alpha"), getAccountData(account,"ptpm.keys.alpha"), getAccountData(account,"ptpm.action1.key"), getAccountData(account,"ptpm.action2.key"), getAccountData(account,"ptpm.stick.key")) end function UpdatePlayerSettings(blur,acallv,amapv,aset,akey,action1,action2,vstick) local account = getClientAccount(source) setPlayerBlurLevel(source,blur) setAccountData(account,"ptpm.blur",blur) setAccountData(account,"ptpm.callvote.alpha",acallv) setAccountData(account,"ptpm.mapvote.alpha",amapv) setAccountData(account,"ptpm.settings.alpha",aset) setAccountData(account,"ptpm.keys.alpha",akey) setAccountData(account,"ptpm.action1.key",action1) setAccountData(account,"ptpm.action2.key",action2) setAccountData(account,"ptpm.stick.key",vstick) outputChatBox("Settings updated & saved.",source) end addEvent("UpdatePlayerSettings",true) addEventHandler("UpdatePlayerSettings",root,UpdatePlayerSettings) function PlayerRegister(player,command,password) if password ~= "" and password ~= nil then if string.len(password)>=5 then local user = string.lower(getClientName(player)) if getAccount(user) then outputChatBox("Account with that username already exists!",player) else local account = addAccount(user,password) if account then outputChatBox("Sucessfully registered. Username: '"..user.."' Password: '"..password.."'",player) outputChatBox("Use /login to log in and /settings to access your PTPM settings.") local acc = getAccount(user,password) setAccountData(acc,"ptpm.blur","50") setAccountData(acc,"ptpm.callvote.alpha","0.5") setAccountData(acc,"ptpm.mapvote.alpha","0.8") setAccountData(acc,"ptpm.settings.alpha","0.8") setAccountData(acc,"ptpm.keys.alpha","0.8") setAccountData(acc,"ptpm.action1.key","lshift") setAccountData(acc,"ptpm.action2.key","rshift") setAccountData(acc,"ptpm.stick.key","insert") setAccountData(acc,"ptpm_kills",0) setAccountData(acc,"ptpm_deaths",0) setAccountData(acc,"ptpm_pmkills",0) setAccountData(acc,"ptpm_pmvictory",0) setAccountData(acc,"ptpm_spawned1",0) setAccountData(acc,"ptpm_spawned2",0) setAccountData(acc,"ptpm_spawned3",0) setAccountData(acc,"ptpm_spawned4",0) setAccountData(acc,"ptpm_spawned5",0) setAccountData(acc,"ptpm_mapcount1",0) setAccountData(acc,"ptpm_mapcount2",0) setAccountData(acc,"ptpm_mapcount3",0) setAccountData(acc,"ptpm_mapcount4",0) setAccountData(acc,"ptpm_mapcount5",0) setAccountData(acc,"ptpm_mapcount6",0) setAccountData(acc,"ptpm_mapcount7",0) setAccountData(acc,"ptpm_mapcount8",0) setAccountData(acc,"ptpm_mapcount9",0) setAccountData(acc,"ptpm_mapcount10",0) setAccountData(acc,"ptpm_mapcount11",0) setAccountData(acc,"ptpm_mapcount12",0) else outputChatBox("Error creating account.",player) end end else outputChatBox("Password must be at least 5 characters.",player) end else outputChatBox("Error creating account, Usage: /register ",player) end end function ChangePassword(oldpass,newpass) local account = getAccount(string.lower(getPlayerUserName(source)),oldpass) if account then SetPassword(account,newpass) else outputChatBox("Settings: Old password invalid.",source) end end addEvent("ChangePassword",true) addEventHandler("ChangePassword",root,ChangePassword) function SetPassword(account,pass) setAccountPassword(account,pass) end function PlayerPullPlayer(player,command,helper_,liftee_) if command_block==1 then return end local helper = GetElementFromName(player,helper_) if helper == false then return end local liftee = GetElementFromName(player,liftee_) if liftee == false then return end if helper == player then outputChatBox("You must select a second person to help you lift.",player) return end if liftee == player or liftee==helper then outputChatBox("You cannot lift one of the lifters.",player) outputChatBox("You cannot lift one of the lifters.",helper) return end local px,py,pz = getElementPosition(player) local hx,hy,hz = getElementPosition(helper) local lx,ly,lz = getElementPosition(liftee) local dist = getDistanceBetweenPoints3D(px,py,pz,hx,hy,hz) local diffz = pz-hz local centrex,centrey,centrez if px>hx then centrex = (math.abs(px-hx)/2)+hx else centrex = (math.abs(px-hx)/2)+px end if py>hy then centrey = (math.abs(py-hy)/2)+hy else centrey = (math.abs(py-hy)/2)+py end if pz>hz then centrez = (math.abs(pz-hz)/2)+hz else centrez = (math.abs(pz-hz)/2)+pz end local range = getDistanceBetweenPoints3D(lx,ly,lz,centrex,centrey,centrez) if dist>1 and dist<3 then -- distance between 2 lifters if diffz>=-0.3 and diffz<=0.3 then -- z difference between lifters if range<5 and range>3 then -- if liftee is within range setElementPosition(liftee,centrex,centrey,centrez) outputChatBox("You were lifted by "..getClientName(player).." and "..getClientName(helper)..".",liftee) outputChatBox("You extend your arm and with "..getClientName(helper).."'s help pull "..getClientName(liftee).." up.",player) outputChatBox("You extend your arm and with "..getClientName(player).."'s help pull "..getClientName(liftee).." up.",helper) else if range>5 then outputChatBox(getClientName(liftee).." is not within your reach. ("..range..")",player) outputChatBox(getClientName(liftee).." is not within your reach. ("..range..")",helper) else outputChatBox(getClientName(liftee).." does not need your help. ("..range..")",player) outputChatBox(getClientName(liftee).." does not need your help. ("..range..")",helper) end end else outputChatBox("Both lifters must be at the same height. ("..diffz..")",player) outputChatBox("Both lifters must be at the same height. ("..diffz..")",helper) end else if dist<1 then outputChatBox("You must be further from "..getClientName(helper)..". ("..dist..")",player) outputChatBox("You must be further from "..getClientName(player)..". ("..dist..")",helper) else outputChatBox("You must be closer to "..getClientName(helper)..". ("..dist..")",player) outputChatBox("You must be closer to "..getClientName(player)..". ("..dist..")",helper) end end end function GetVelocity(player,command) local x,y,z if getPlayerOccupiedVehicle(player)~=false then x,y,z = getElementVelocity(getPlayerOccupiedVehicle(player)) else x,y,z = getElementVelocity(player) end outputChatBox("VELOCITY: x: "..x.." y: "..y.." z: "..z,player) -- outputServerLog("VELOCITY: x: "..x.." y: "..y.." z: "..z) end function Accept(player,command) if command_block==1 then return end if current_pm~=-1 then if player==swapclass_victim then local victim_team = getElementData(player,"ptpm_team") if victim_team == -1 then outputChatBox("Invalid team.",player) return end local victim_class = getElementData(player,"ptpm_class") if victim_class == -1 then outputChatBox("Invalid class.",player) return end BoundarySafe(current_pm,10) BoundarySafe(player,10) SpawnPlayerFunc(current_pm,victim_team,victim_class,0) SpawnPlayerFunc(player,TEAM_PRIMEMINISTER,1,0) textDisplayRemoveObserver(swapclass_display,player) swapclass_victim = nil outputChatBox(getClientName(player).." accepted your swapclass offer.",current_pm) else outputChatBox("You have not been sent a swapclass offer.",player) end else outputChatBox("There is no Prime Minister.",player) end end function Decline(player,command) if command_block==1 then return end if swapclass_victim==player then textDisplayRemoveObserver(swapclass_display,player) swapclass_victim = nil if current_pm~=-1 then outputChatBox(getClientName(player).." declined your swapclass offer.",current_pm) end else outputChatBox("You have not been sent a swapclass offer.",player) end end function KnockPlayerFromVehicle(player,command,victim) if command_block==1 then return end local vehicle = getPlayerOccupiedVehicle(player) local seat = getPlayerOccupiedVehicleSeat(player) local rand = math.random(3) if player_knock[player]==true then if vehicle~=false then if seat==0 then local elements = getAttachedElements(vehicle) if #elements==1 then if rand==2 then detachElementFromElement(elements[1],vehicle) triggerClientEvent(elements[1],"UnstickFromVehicle",root) outputChatBox("You reach out and knock "..getClientName(elements[1]).." off your vehicle.",player) outputChatBox(getClientName(player).." knocks you off his vehicle.",elements[1]) else outputChatBox("You reach out and try to knock "..getClientName(elements[1]).." off your vehicle, but you miss.",player) outputChatBox(getClientName(player).." attempts to knock you off his vehicle but misses. Your adrenaline levels increase.",elements[1]) triggerClientEvent(elements[1],"ChangeAdrenaline",root,20) end player_knock[player] = false setTimer(function() player_knock[player] = true end,30000,1) elseif #elements>1 then local victim_element = getElementFromName(player,victim) if victim_element==false then return end for index, element in ipairs(elements) do if getElementType(element)=="player" then if element==victim_element then if rand==2 then detachElementFromElement(victim_element,vehicle) triggerClientEvent(victim_element,"UnstickFromVehicle",root) outputChatBox("You reach out and knock "..getClientName(victim_element).." off your vehicle.",player) outputChatBox(getClientName(player).." knocks you off his vehicle.",victim_element) player_knock[player] = false setTimer(function() player_knock[player] = true end,30000,1) else outputChatBox("You reach out and try to knock "..getClientName(victim_element).." off your vehicle, but you miss.",player) outputChatBox(getClientName(player).." attempts to knock you off his vehicle but misses. Your adrenaline levels increase.",victim_element) triggerClientEvent(victim_element,"ChangeAdrenaline",root,20) player_knock[player] = false setTimer(function() player_knock[player] = true end,30000,1) end end end end else outputChatBox("There is nobody stuck to your vehicle",player) end else outputChatBox("You are not the driver",player) end else outputChatBox("You are not in a vehicle",player) end else outputChatBox("You must regain full control of the vehicle again before attempting to knock someone off (30 secs)",player) end end function TellPlayerIntel(player,command) if command_block==1 then return end if current_pm~=-1 then outputChatBox(getClientName(current_pm).." is in "..getElementZoneName(current_pm),player) else outputChatBox("There is currently no Prime Minister",player) end end function PrintMapName(player,command) if command_block==1 then return end outputChatBox("Current map: "..getResourceInfo(current_map, "name"),player) end function ReturnOnlineAdmins() local admins = {} for index, player in ipairs(getElementsByType("player")) do if player then if player_admin[player]==true then table.insert(admins,player) end end end return admins end function PrintOnlineAdmins(player,command) local admins = ReturnOnlineAdmins() local admin_names = "" for i, player in ipairs (admins) do admin_names = admin_names..getClientName(player)..", " end outputChatBox("Admins: "..admin_names,player) end function RestartRound(player,command) if player_admin[player]==1 then setTimer(OnRoundEnd,1000,1) command_block = 1 end end function Commands() addCommandHandler("reclass",PlayerReclassCommand) addCommandHandler("rc",PlayerReclassCommand) addCommandHandler("motd",Motd) addCommandHandler("swapclass",PlayerSwapclass) addCommandHandler("timeleft",PrintTime) addCommandHandler("tl",PrintTime) addCommandHandler("pm",PrintPmName) addCommandHandler("kill",KillPlayer) -- addCommandHandler("ward",SetupWardrobeForPlayerClientTrigger) addCommandHandler("cam",GetCameraMode) addCommandHandler("duty",ExplainRole) addCommandHandler("help",PrintHelp) addCommandHandler("cmds",PrintHelp) addCommandHandler("commands",PrintHelp) addCommandHandler("heal",PlayerHealPlayer) addCommandHandler("h",PlayerHealPlayer) addCommandHandler("plan",Plan) addCommandHandler("players",PrintPlayers) addCommandHandler("mapvote",PlayerMapVoteCommand) addCommandHandler("mv",PlayerMapVoteCommand) addCommandHandler("callvote",PlayerCallvoteCommand) addCommandHandler("endvote",PlayerEndvoteCommand) -- addCommandHandler("settings",ToggleSettingsWindowTrigger) -- addCommandHandler("stats",ToggleSettingsWindowTrigger) -- addCommandHandler("register",PlayerRegister) addCommandHandler("y",Accept) addCommandHandler("n",Decline) addCommandHandler("knock",KnockPlayerFromVehicle) addCommandHandler("intel",TellPlayerIntel) addCommandHandler("map",PrintMapName) addCommandHandler("admins",PrintOnlineAdmins) addCommandHandler("ptpmrestart",RestartRound) -- addCommandHandler("pull",PlayerPullPlayer) addCommandHandler("getvel",GetVelocity) --[[ addCommandHandler("obj",command_obj,false); addCommandHandler("getweather",command_getweather,false); addCommandHandler("tk",betena,false ) addCommandHandler("pinfo",betena,false ) addCommandHandler("vinfo",betena,false )--]] end addEvent("createCrouchObject",true) function createCrouchObject(crouch) if crouch == false then -- create the platform local x,y,z = getElementPosition(source) crouchObject[source] = createObject(1249,x,y,z+0.4) if crouchObject[source]==false then outputChatBox("PLATFORM: not created",source) else outputChatBox("PLATFORM: created",source) end local r,g,b = getPlayerNametagColor(source) crouchCorona[source] = createMarker(x,y,z+0.3,"arrow",0.5,r,g,b,255) -- local at = attachElementToElement(crouchObject[source],source,0,0,0.4) -- if at == true then outputChatBox("PLATFORM: attached") else outputChatBox("PLATFORM: not attached") end -- outputChatBox("PLATFORM: created",source) elseif crouch == true then -- remove the platform -- detachElementFromElement(crouchObject[source]) -- detachElementFromElement(crouchCorona[player]) -- setElementPosition(crouchCorona[source],0,0,1000) local des = destroyElement(crouchObject[source]) if des == true then outputChatBox("DESTROY: true",source) else outputChatBox("DESTROY: false",source) end destroyElement(crouchCorona[source]) crouchObject[source] = nil crouchCorona[source] = nil outputChatBox("PLATFORM: destroyed",source) end end addEventHandler("createCrouchObject",root,createCrouchObject)