View difference between Paste ID: 4fUPVY82 and TW19Yxqw
SHOW: | | - or go back to the newest paste.
1
if SERVER then
2
	
3
	--Edit here:
4
	
5
	local addicts = 0
6
	local weeks = 0
7
	local days = 1
8
	local hours = 6
9
	local min = 0
10
	
11
	local max_tries = 3	--how many times it will retry to get a players time before kicking for timeout
12
	local check_interval = 60 --(sec) interval for retrying
13
	
14
	local WhiteList = {"STEAM_0:1:7099"} --add SteamIDs here in "" seperated by ,
15
	
16
	local function isanywayallowed(ply)
17
		if ply.EV_GetRank and ply:EV_GetRank() ~= "guest" then print("!guest"); return true end
18
		if ply:IsAdmin() then print("admin"); return true end
19
		if table.HasValue(WhiteList, ply:SteamID()) then print("wl"); return true end
20
		--add your custom exception rules here if you're more familiar with lua
21
22
		return false
23
	end
24
	
25
	--editing down here is not recommended if you didn't even know what going on above
26
	
27
	local req_h = math.min(addicts*8765.8+weeks*168+days*24+hours+min/60, 8765.8 ) --can only check for 1 year so every greater value would just kick everyone
28
	
29
	print("/-----------------------------------\\")
30
	print("|Antinoob minimum required hours: "..req_h)
31
	print("\\----------------Uke----------------/")
32
	
33
	util.AddNetworkString("noobcheck_playtime")
34
	
35
	local function check(ply)
36
		--if not isanywayallowed(ply) then
37
		local nwstr = ""
38
		if ply.anoobkey == nil or ply.anoobkey == "" then
39
			local r = {{48,57},{65,90},{97,122}} --[%w]
40
			for i = 1, 7 do -- you're more likely to win the lottery
41
				local n = math.random(1,#r)
42
				nwstr = nwstr..string.char(math.random(r[n][1],r[n][2]))
43
			end
44
		else
45
			nwstr = ply.anoobkey
46
		end
47
		ply.anoobtry = ply.anoobtry + 1 or 1
48
		ply.anoobkey = nwstr
49
		
50
		ply:SendLua("net.Start(\"noobcheck_playtime\"); net.WriteString(\""..nwstr.."\"); net.WriteFloat(achievements.GetCount(5)); net.SendToServer()")
51
		print("[Antinoob] Checking: "..ply:Name().." (attempt: "..ply.anoobtry.."/"..max_tries..")")
52
		timer.Simple(check_interval,function()
53
			if ply == nil or not IsValid(ply) then return end
54
			if ply.noobcheckpassed ~= true and not isanywayallowed(ply) then
55
				if ply.anoobtry < max_tries then
56
					check(ply)
57
				else
58
					local name = ply:Name()
59
					ply:Kick("Noobcheck timed out. Try again.")
60
					for k, v in pairs(player.GetAll()) do
61
						if v ~= ply then
62
							v:PrintMessage(3,"Couldn't check for "..name.."'s playtime.")
63
						end
64
					end
65
				end
66
			end
67
		end)
68
		--else
69
		--	ply.noobcheckpassed = true
70
		--	but wouldnt print the time into the chat
71
		--end
72
	end
73
		
74
	hook.Add( "PlayerInitialSpawn", "noobcheck_spawnzhook",function(ply)
75
		ply.anoobtry = 0
76
		check(ply)
77
	end)
78
	
79
	local function can(ply)
80
		if ply == nil or not IsValid(ply) then return false end
81
		if (ply.noobcheckpassed and ply:Alive()) or isanywayallowed(ply) then return true end
82
		return false
83
	end
84
	
85
	--Block regular guests from spamming while dead:
86
	hook.Add("PlayerSpawnEffect","noobcheck",function(ply)
87
		if not can(ply) then return false end
88
	end)
89
	hook.Add("PlayerSpawnNPC","noobcheck",function(ply)
90
		if not can(ply) then return false end
91
	end)
92
	hook.Add("PlayerSpawnObject","noobcheck",function(ply)
93
		if not can(ply) then return false end
94
	end)
95
	hook.Add("PlayerSpawnProp","noobcheck",function(ply)
96
		if not can(ply) then return false end
97
	end)
98
	hook.Add("PlayerSpawnRagdoll","noobcheck",function(ply)
99
		if not can(ply) then return false end
100
	end)
101
	hook.Add("PlayerSpawnSENT","noobcheck",function(ply)
102
		if not can(ply) then return false end
103
	end)
104
	hook.Add("PlayerSpawnSWEP","noobcheck",function(ply)
105
		if not can(ply) then return false end
106
	end)
107
	hook.Add("PlayerSpawnVehicle","noobcheck",function(ply)
108
		if not can(ply) then return false end
109
	end)
110
	
111
	net.Receive( "noobcheck_playtime" , function(ley, ply)
112
		if ply == nil or not IsValid(ply) or ply.noobcheckpassed == true then return end
113
		local key = net.ReadString()
114
		local ti = math.floor(net.ReadFloat()/0.6)/100
115
116
		print(ply:Name().." ("..ply:SteamID()..") played GMod for "..ti.." hours. ("..req_h.."h needed to stay)")
117
			
118
		if (ti < req_h or ply.anoobkey != key) and not isanywayallowed(ply) then
119
			--local txt = "You need "..req_h.."h to play here. You've got "..ti.."h."
120
			local txt = "You need "..(req_h-ti).." more hours to play here."
121
			if ply.anoobkey != key then txt = "" end
122
			ply:Kick(txt)
123
		else
124
			ply.noobcheckpassed = true
125
		end
126
		--print the time for everyone:
127
		for k, v in pairs(player.GetAll()) do
128-
			if v ~= ply then
128+
			if v ~= nil and IsValid(v) then
129-
				v:PrintMessage(3,ply:Name().." played GMod for "..ti.." hours. ("..req_h.."h needed to stay)")
129+
				if v ~= ply then
130-
			else
130+
					v:PrintMessage(3,ply:Name().." played GMod for "..ti.." hours. ("..req_h.."h needed to stay)")
131-
				v:PrintMessage(3,"You played GMod for "..ti.." hours. ("..req_h.."h needed to stay)")
131+
132
					v:PrintMessage(3,"You played GMod for "..ti.." hours. ("..req_h.."h needed to stay)")
133
				end
134
			end
135
		end
136
		--
137
	end)	
138
end