Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- AddCSLuaFile("cl_init.lua")
- AddCSLuaFile("shared.lua")
- include('shared.lua')
- util.AddNetworkString("tankgame_sync")
- util.AddNetworkString("tankgame_upsync")
- util.AddNetworkString("tankgame_upload")
- util.AddNetworkString("tankgame_init")
- util.AddNetworkString("tankgame_projectile")
- util.AddNetworkString("tankgame_projectilespawn")
- util.AddNetworkString("tankgame_projectilespawn_cl")
- function SetupTankGame()
- for k,v in pairs(ents.FindByClass("tankgame_manager"))do
- v:Remove()
- end
- for k,v in pairs(ents.FindByClass("info_target"))do
- if(string.find(v:GetName(),"tankgame_"))then
- MakeTankGame(v)
- print("Found tank game "..v:GetName())
- end
- end
- end
- hook.Add("PostCleanupMap","PostCleanupMap_TankGame",SetupTankGame)
- hook.Add("InitPostEntity","InitPostEntity_TankGame",SetupTankGame)
- function MakeTankGame(ent)
- timer.Simple(0.5,function()
- if(IsValid(ent))then
- local name = ent:GetName()
- print("preparing "..name)
- local p1 = ents.FindByName(name.."_p1")[1]
- local p2 = ents.FindByName(name.."_p2")[1]
- local p3 = ents.FindByName(name.."_p3")[1]
- local p4 = ents.FindByName(name.."_p4")[1]
- local p5 = ents.FindByName(name.."_p5")[1]
- local p6 = ents.FindByName(name.."_p6")[1]
- local p7 = ents.FindByName(name.."_p7")[1]
- local p8 = ents.FindByName(name.."_p8")[1]
- local screen = ents.FindByName(name.."_screen")[1]
- if(IsValid(p1) and IsValid(p2) and IsValid(p3) and IsValid(p4))then
- print(name.." successfully constructed")
- local mngr = ents.Create("tankgame_manager")
- mngr:SetPos(ent:GetPos() + Vector(0,0,0))
- mngr:SetAngles(ent:GetAngles())
- mngr:SetNWVector("ScreenPos",ent:GetPos())
- mngr:SetNWAngle("ScreenAng",ent:GetAngles())
- mngr:SetName(name)
- mngr:Spawn()
- for i,v in pairs({p1,p2,p3,p4,p5,p6,p7,p8})do
- mngr["Seat"..i] = ents.Create("prop_vehicle_prisoner_pod")
- mngr["Seat"..i]:SetModel("models/nova/chair_office02.mdl")
- mngr["Seat"..i]:SetPos(v:GetPos() + v:GetAngles():Up()*-16 + v:GetAngles():Forward()*-32)
- mngr["Seat"..i]:SetAngles(v:GetAngles() + Angle(0,-90,0))
- mngr["Seat"..i].IsGameSeat = true
- mngr["Seat"..i]:Spawn()
- mngr["Seat"..i]:SetColor(mngr.TeamColors[0])
- mngr["Seat"..i]:SetNWEntity("SourceGame",mngr)
- mngr["Seat"..i]:GetPhysicsObject():EnableMotion(false)
- mngr:SetNWEntity("GameSeat"..i,mngr["Seat"..i])
- end
- else
- print(name.." Failed to construct")
- end
- end
- end)
- end
- hook.Add("CanPlayerEnterVehicle", "TankGame_SeatEntry", function(ply, vehicle)
- if vehicle.IsGameSeat then return true end
- end)
- TANKGAME_NET_LIST = TANKGAME_NET_LIST or {}
- net.Receive("tankgame_sync",function(len,ply)
- TANKGAME_NET_LIST = TANKGAME_NET_LIST or {}
- local ent = net.ReadEntity()
- local tank = net.ReadInt(16)
- local time = net.ReadFloat()
- local data = net.ReadTable()
- local delay = time - CurTime()
- net.Start("tankgame_upsync")
- net.WriteEntity(ent)
- net.WriteInt(tank,16)
- net.WriteTable(data)
- net.Send(TANKGAME_NET_LIST)
- end)
- hook.Add("PlayerChangeLocation","tankgame_tracknetworkingresidents",function( ply, newloc, oldloc )
- TANKGAME_NET_LIST = TANKGAME_NET_LIST or {}
- local network_location = 0 //set this pls
- ply.bInArcade = ply.bInArcade or false
- local bInArcade = newloc == network_location
- if(bInArcade != ply.bInArcade)then //on the condition that a player starts or stops being in the arcade, rebuild the list of people in there
- ply.bInArcade = bInArcade
- local gaymers = {}
- for _,ply in pairs(player.GetAll())do
- if(ply.bInArcade)then
- table.insert(gaymers,ply)
- end
- end
- TANKGAME_NET_LIST = gaymers
- end
- end)
- net.Receive("tankgame_projectile",function(len,ply)
- local ent = net.ReadEntity()
- local tank = net.ReadInt(16)
- ent:SetNWInt("Health"..tank,math.Clamp(ent:GetNWInt("Health"..tank)-1,0,10))
- if(ent:GetNWInt("Health"..tank) == 0)then
- //ent:SetNWEntity("Player"..tank,NULL)
- ent:HandleTankDeath(tank)
- end
- print(ent:GetNWInt("Health"..tank))
- print("ow, i got fuckin' hit man")
- --[[
- net.Start("tankgame_upsync")
- net.WriteEntity(ent)
- net.WriteInt(tank,16)
- net.WriteTable(data)
- net.Broadcast()
- ]]
- end)
- function ENT:HandleTankDeath(ind)
- local grps = {}
- local liv = -1
- for i=1,self.TankAmount do
- if(IsValid(self:GetNWEntity("Player"..i)) and self:GetNWInt("Health"..i) > 0 and !table.HasValue(grps,self:GetNWInt("Team"..i)))then
- table.insert(grps,self:GetNWInt("Team"..i))
- liv = self:GetNWInt("Team"..i)
- end
- end
- if(table.Count(grps) == 1)then
- for i=1,self.TankAmount do
- if(self:GetNWInt("Team"..i) == liv and IsValid(self:GetNWEntity("Player"..i)))then
- local ply = self:GetNWEntity("Player"..i)
- self.PrizeOutput = self.PrizeOutput or 2
- end
- end
- end
- if(table.Count(grps) <=1)then
- self:EndGame()
- end
- end
- function ENT:EndGame()
- timer.Simple(0.5,function()
- if(IsValid(self))then
- self:SetNWBool("GameOn",self.GameStarted)
- for i=1,self.TankAmount do
- if(IsValid(self:GetNWEntity("Player"..i)))then
- local ply = self:GetNWEntity("Player"..i)
- if(ply.ACV_Increase != nil)then
- ply:ACV_Increase("ACV_Tanks_Play_50",1)
- end
- end
- self:SetNWEntity("Player"..i,NULL)
- self:SetNWInt("Health"..i,0)
- self:SetNWInt("Mines"..i,0)
- self:SetNWInt("Team"..i,0)
- self["Seat"..i]:SetColor(self.TeamColors[0])
- end
- self.GameStarted = false
- end
- end)
- end
- net.Receive("tankgame_projectilespawn",function(len,ply)
- local ent = net.ReadEntity()
- local tank = net.ReadInt(16)
- local ject = net.ReadTable()
- net.Start("tankgame_projectilespawn_cl")
- net.WriteEntity(ent)
- net.WriteInt(tank,16)
- net.WriteTable(ject)
- net.Send(TANKGAME_NET_LIST)
- end)
- function ENT:Think()
- local seats = 0
- for i=1,self.TankAmount do
- if(IsValid(self["Seat"..i]) and IsValid(self["Seat"..i]:GetDriver()))then
- seats = seats + 1
- end
- end
- if(self.GameStarted and seats <= 1)then
- self:EndGame()
- end
- if(!self.GameStarted and seats > 1)then
- self:StartGame()
- end
- end
- function ENT:Initialize()
- self.Entity:SetModel("models/pyroteknik/redbutton/techbutton.mdl");
- self:SetSolid( SOLID_NONE )
- self.GameStarted = false
- self:SetNWBool("GameOn",self.GameStarted)
- self:SetNWInt("GameMap",1)
- end
- ENT.GamePrice = 5
- function ENT:StartGame()
- self.GameStarted = true
- local mode = 3
- local map = math.random(1,#self.Maps)
- local teams = {}
- local players = {}
- for i=1,self.TankAmount do
- if(IsValid(self["Seat"..i]) and IsValid(self["Seat"..i]:GetDriver()))then
- local ply = self["Seat"..i]:GetDriver()
- players[i] = ply
- end
- end
- self.PrizeOutput = table.Count(players)
- if(table.Count(players) == 2)then mode = 0 end
- if(table.Count(players) == 3)then mode = 0 end
- if(table.Count(players) == 4)then mode = 3 end
- if(table.Count(players) == 5)then mode = 0 end
- if(table.Count(players) == 6)then mode = 2 end
- if(table.Count(players) == 7)then mode = 0 end
- if(table.Count(players) == 8)then mode = 1 end
- if(table.Count(players) > 0)then
- self:SetNWBool("GameOn",self.GameStarted)
- self:SetNWInt("GameMap",map)
- self:SetNWFloat("GameScale",self.MapSizes[map])
- local ateams = {1,2,3,4,5,6,7,8}
- local groups = 8
- if(mode == 1)then groups = 4 end
- if(mode == 2)then groups = 3 end
- if(mode == 3)then groups = 2 end
- local td = {}
- local tp = {}
- for i=1,groups do
- local sel = math.random(1,table.Count(ateams))
- tp[i] = ateams[sel]
- table.remove(ateams,sel)
- end
- for i=1,groups do
- td[i] = td[i] or {tp[i],{}}
- end
- local ct = math.random(1,groups)
- for k,v in pairs(players)do
- table.insert(td[ct][2],k)
- ct = ct + 1
- if(ct > groups)then ct = 1 end
- end
- for i=1,self.TankAmount do
- local teet = 0
- for _,v in pairs(td)do
- for _,x in pairs(v[2])do
- if(x == i)then
- teet = v[1]
- end
- end
- end
- teams[i] = teet
- self:SetNWInt("Team"..i,teet)
- if(IsValid(self["Seat"..i]))then
- self["Seat"..i]:SetColor(self.TeamColors[teet])
- end
- if(IsValid(self["Seat"..i]) and IsValid(players[i]))then
- self:SetNWEntity("Player"..i,players[i])
- else
- self:SetNWEntity("Player"..i,NULL)
- end
- self:SetNWInt("Mines"..i,5)
- self:SetNWInt("Health"..i,4)
- end
- self.TeamSet = teams
- end
- timer.Simple(0.5,function()
- if(IsValid(self))then
- net.Start("tankgame_init")
- net.WriteEntity(self)
- net.WriteTable(teams)
- net.Broadcast()
- end
- end)
- end
- concommand.Add("StartTankGame",function(ply,cmd,args)
- if(ply:IsSuperAdmin())then
- for k,v in pairs(ents.FindByClass("tankgame_manager"))do
- v:StartGame()
- end
- end
- end)
- function ENT:Use(user)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement