• Making players spectate on death, then respawn next round
    1 replies, posted
I've decided to make a gamemode for learning purposes and to practice GLUA, I'm have issues setting up spectating and team switching on death. Basically I'm trying to make a dead player change to a different team then spectate, then when the round ends change them back to the "alive" team and let them spawn again. Also I don't want players who join in the middle of the round so I want them to join in on the spectator team so that people can't abuse it. init.lua [CODE]local fol = GM.FolderName.."/gamemode/modules/" local files, folders = file.Find(fol .. "*", "LUA") for k,v in pairs(files) do include(fol .. v) end for _, folder in SortedPairs(folders, true) do if folder == "." or folder == ".." then continue end for _, File in SortedPairs(file.Find(fol .. folder .."/sh_*.lua", "LUA"), true) do AddCSLuaFile(fol..folder .. "/" ..File) include(fol.. folder .. "/" ..File) end end for _, folder in SortedPairs(folders, true) do if folder == "." or folder == ".." then continue end for _, File in SortedPairs(file.Find(fol .. folder .."/sv_*.lua", "LUA"), true) do include(fol.. folder .. "/" ..File) end end for _, folder in SortedPairs(folders, true) do if folder == "." or folder == ".." then continue end for _, File in SortedPairs(file.Find(fol .. folder .."/cl_*.lua", "LUA"), true) do AddCSLuaFile(fol.. folder .. "/" ..File) end end local TEAM_SPEC, TEAM_NEUTRAL = 1, 2 local alivePlayers = 0 round = {} round.Break = 10 round.Time = 20 round.TimeLeft = -1 round.Breaking = false function GM:PlayerSpawn( ply ) --if !round.Breaking then --ply:SetTeam(TEAM_SPEC) --else --ply:SetTeam(TEAM_NEUTRAL) --end if ply:Team() == TEAM_NEUTRAL then ply:SetModel("models/player/pheonix.mdl") ply:SetGravity(1) ply:SetWalkSpeed(250) ply:SetRunSpeed(500) ply:SetCrouchedWalkSpeed(0.5) ply:SetDuckSpeed(0.5) end end function GM:DoPlayerDeath( ply, wep, killer ) ply:Spectate( OBS_MODE_CHASE ) ply:SpectateEntity( killer ) end function round.Broadcast(Text) for k, v in pairs(player.GetAll()) do v:ConCommand("play buttons/button17.wav") v:ChatPrint(Text) end end function round.Begin(ply) for _, v in pairs(player.GetAll()) do AddSpawnpoints() if not v:Alive() then if ply:Team() != 2 then ply:SetTeam(2) end --v:Spawn() end end round.Broadcast("Round starting! Round ends in " .. round.Time .. " seconds!") round.TimeLeft = round.Time end function round.End() round.Broadcast("Round over! Next round in " .. round.Break .. " seconds!") ply:KillSilent() GAMEMODE:ClearClientState() GAMEMODE:CleanUpMap() ply:Spectate( OBS_MODE_NONE ) round.TimeLeft = round.Break end function round.Handle() if (round.TimeLeft == -1) then if ( alivePlayers >= 1) then round.Begin() return end end round.TimeLeft = round.TimeLeft - 1 if (round.TimeLeft == 0) then if (round.Breaking) then if ( alivePlayers >= 2) then round.Begin() round.Breaking = false end else round.End() round.Breaking = true end end end timer.Create("round.Handle", 1, 0, round.Handle) function GM:PlayerSelectSpawn(ply) local spawnpoints local i spawnpoints = ents.FindByClass("spawns") i = math.random(#spawnpoints) return spawnpoints[i] end function AddSpawnpoints() local spawn_points = { Vector(-11431.851563, 11290.193359, 353.031250), Vector(-9055.885742, 13388.874023, 217.037521), Vector(-11781.977539, 11343.624023, 353.031250) } local map = { "rp_headattackcity_v1" } timer.Simple(3, function() if game.GetMap() == table.Random(map) then local crate = ents.Create("spawns") if not crate:IsValid() then return end crate:SetPos(table.Random(spawn_points)) crate:Spawn() crate:DropToFloor() end end) end hook.Add("InitPostEntity", "AddSpawnpoints", AddSpawnpoints) local function AlivePlayers() for k,v in pairs(player.GetAll()) do if v:Alive() then alivePlayers = alivePlayers + 1 end end return alivePlayers end hook.Add("PlayerDeath", "checkAlivePlayers", function() if AlivePlayers() <= 1 then round.End() end end)[/CODE] I don't understand this. I have mixed this code around at least 10 times trying to get players spectating on death and respawn when the round ends. The code is probably kind of messed up because of the many times I've tried new things to get it working. If anyone has any suggestions please feel free to share. Thank you all so much for the help you provide and the time you take to aid us that have less knowledge.
I've tried more things lol. [CODE]PLAYER = FindMetaTable( "Player" ); local TEAM_SPEC, TEAM_NEUTRAL = 1, 2 local alivePlayers = 0 round = {} round.Break = 10 round.Time = 20 round.TimeLeft = -1 round.Breaking = false function PLAYER:Unassigned( ) if ( self:Team( ) == TEAM_UNASSIGNED || self:Team( ) == TEAM_SPECTATOR ) then return true; end return false; end function PLAYER:CanRespawn( ) if ( self:Unassigned( ) ) then return false; end return true; end function GM:PlayerSpawn( ply ) if round.Breaking then ply:SetTeam( TEAM_NEUTRAL ) else ply:SetTeam( TEAM_SPECTATOR ) end if ply:Team() == TEAM_NEUTRAL then ply:SetModel("models/player/pheonix.mdl") ply:SetGravity(1) ply:SetWalkSpeed(250) ply:SetRunSpeed(500) ply:SetCrouchedWalkSpeed(0.5) ply:SetDuckSpeed(0.5) end if ( PLAYER:Unassigned( ) ) then Player:StripAmmo( ) Player:StripWeapons( ); Player:Spectate( OBS_MODE_ROAMING ) return false; else Player:UnSpectate() end end function GM:PlayerDeath( victim, weapon, killer ) if ( victim:Unassigned( ) ) then return; end end function GM:PlayerDeathThink( Player ) if ( !Player:CanRespawn( ) ) then return false; else Player:Spawn( ) end end function round.Broadcast(Text) for k, v in pairs(player.GetAll()) do v:ChatPrint(Text) end end function round.Begin(ply) for _, v in pairs(player.GetAll()) do if not v:Alive() then v:Spawn() end end round.Broadcast("Round starting! Round ends in " .. round.Time .. " seconds!") round.TimeLeft = round.Time end function round.End() round.Broadcast("Round over! Next round in " .. round.Break .. " seconds!") round.TimeLeft = round.Break end function round.Handle() if (round.TimeLeft == -1) then if ( alivePlayers >= 1) then round.Begin() return end end round.TimeLeft = round.TimeLeft - 1 if (round.TimeLeft == 0) then if (round.Breaking) then if ( alivePlayers >= 2) then round.Begin() round.Breaking = false end else round.End() round.Breaking = true end end end timer.Create("round.Handle", 1, 0, round.Handle) function GM:PlayerSelectSpawn(ply) if ( PLAYER:Unassigned( ) ) then return; end local spawnpoints local i spawnpoints = ents.FindByClass("spawns") i = math.random(#spawnpoints) return spawnpoints[i] end function AddSpawnpoints() local spawn_points = { Vector(-11431.851563, 11290.193359, 353.031250), Vector(-9055.885742, 13388.874023, 217.037521), Vector(-11781.977539, 11343.624023, 353.031250) } local map = { "rp_headattackcity_v1" } timer.Simple(3, function() if game.GetMap() == table.Random(map) then local crate = ents.Create("spawns") if not crate:IsValid() then return end crate:SetPos(table.Random(spawn_points)) crate:Spawn() crate:DropToFloor() end end) end hook.Add("InitPostEntity", "AddSpawnpoints", AddSpawnpoints) local function AlivePlayers() for k,v in pairs(player.GetAll()) do if v:Alive() then alivePlayers = alivePlayers + 1 end end return alivePlayers end hook.Add("PlayerDeath", "checkAlivePlayers", function() if AlivePlayers() <= 1 then round.End() end end) [/CODE] Very strange. None of this is working.
Sorry, you need to Log In to post a reply to this thread.