Inventory checker with vile mode
This commit is contained in:
parent
f8cb3fedc5
commit
a6fea06a9d
|
@ -0,0 +1,170 @@
|
|||
|
||||
local easywaycvar = CreateConVar( "benny_net_easyway", 0, FCVAR_ARCHIVE + FCVAR_REPLICATED, "Use a disgusting way of networking inventories for maximum duplication." )
|
||||
local easyway = easywaycvar:GetBool()
|
||||
local UINTBITS = 8
|
||||
|
||||
if easyway then
|
||||
if SERVER then
|
||||
gameevent.Listen( "player_activate" )
|
||||
hook.Add( "player_activate", "Benny_Activate", function( data )
|
||||
Player(data.userid).CheckerReady = true
|
||||
end )
|
||||
|
||||
local checkerinterval = 1
|
||||
util.AddNetworkString( "Benny_Checker" )
|
||||
|
||||
hook.Add( "PlayerTick", "Benny_Checker", function( ply )
|
||||
if ply.CheckerReady then
|
||||
if (ply.CheckerLast or 0) + checkerinterval <= CurTime() then
|
||||
local inv = ply:INV_Get()
|
||||
net.Start( "Benny_Checker" )
|
||||
net.WriteUInt( table.Count(inv), UINTBITS )
|
||||
for i, v in pairs( inv ) do
|
||||
net.WriteString( i )
|
||||
net.WriteTable( v )
|
||||
end
|
||||
print( net.BytesWritten() )
|
||||
net.Send( ply )
|
||||
ply.CheckerLast = CurTime()
|
||||
end
|
||||
end
|
||||
end)
|
||||
else -- client begin
|
||||
net.Receive( "Benny_Checker", function( len, ply )
|
||||
local ply = LocalPlayer()
|
||||
|
||||
local inv = ply:INV_Get()
|
||||
local amt = net.ReadUInt( UINTBITS )
|
||||
for i=1, amt do
|
||||
local id = net.ReadString()
|
||||
inv[id] = net.ReadTable()
|
||||
end
|
||||
end)
|
||||
end -- client end
|
||||
|
||||
else -- hardway
|
||||
|
||||
if SERVER then
|
||||
gameevent.Listen( "player_activate" )
|
||||
hook.Add( "player_activate", "Benny_Activate", function( data )
|
||||
Player(data.userid).CheckerReady = true
|
||||
end )
|
||||
|
||||
local checkerinterval = 1
|
||||
util.AddNetworkString( "Benny_Checker" )
|
||||
util.AddNetworkString( "Benny_Checker_CL_Request" )
|
||||
|
||||
hook.Add( "PlayerTick", "Benny_Checker", function( ply )
|
||||
if ply.CheckerReady then
|
||||
if (ply.CheckerLast or 0) + checkerinterval <= CurTime() then
|
||||
local inv = ply:INV_Get()
|
||||
net.Start( "Benny_Checker" )
|
||||
net.WriteUInt( table.Count(inv), UINTBITS )
|
||||
for i, v in pairs( inv ) do
|
||||
net.WriteString( i )
|
||||
end
|
||||
net.Send( ply )
|
||||
ply.CheckerLast = CurTime()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
net.Receive("Benny_Checker_CL_Request", function( len, ply )
|
||||
if (ply.CheckerRequestBan or 0) <= CurTime() then
|
||||
local amt = net.ReadUInt( UINTBITS )
|
||||
|
||||
local inv = ply:INV_Get()
|
||||
local regenlist = {}
|
||||
|
||||
-- Make sure they all exist first
|
||||
for i=1, amt do
|
||||
local id = net.ReadString()
|
||||
if inv[id] then
|
||||
table.insert( regenlist, id )
|
||||
else
|
||||
-- Punish
|
||||
print( "The item the client requested didn't exist. Malicious? Not supporting for 30 seconds." )
|
||||
ply.CheckerRequestBan = CurTime() + 30
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
net.Start("Benny_Checker_CL_Request")
|
||||
net.WriteUInt( #regenlist, UINTBITS )
|
||||
for i, id in ipairs( regenlist ) do
|
||||
if inv[id] then
|
||||
print( "Doing " .. id )
|
||||
net.WriteString( id )
|
||||
net.WriteTable( inv[id] )
|
||||
end
|
||||
end
|
||||
net.Send( ply )
|
||||
end
|
||||
end)
|
||||
else
|
||||
net.Receive( "Benny_Checker", function( len, ply )
|
||||
local ply = LocalPlayer()
|
||||
-- Get started
|
||||
local amt = net.ReadUInt( UINTBITS )
|
||||
local evallist = {}
|
||||
for i=1, amt do
|
||||
evallist[net.ReadString()] = true
|
||||
end
|
||||
|
||||
local inv = ply:INV_Get()
|
||||
|
||||
-- Check which items DO NOT exist
|
||||
local missinglist = {}
|
||||
for i, v in pairs( evallist ) do
|
||||
if inv[i] then
|
||||
-- Success
|
||||
else
|
||||
missinglist[i] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- Check any ghost items we have
|
||||
local ghostlist = {}
|
||||
for i, v in pairs( inv ) do
|
||||
if evallist[i] then
|
||||
-- Success
|
||||
else
|
||||
ghostlist[i] = true
|
||||
end
|
||||
end
|
||||
|
||||
-- Regenerate missing items
|
||||
if table.Count(missinglist) > 0 then
|
||||
local concat = ""
|
||||
for i, v in pairs( missinglist ) do
|
||||
concat = concat .. "'" .. i .. "' "
|
||||
end
|
||||
print( "[".. string.FormattedTime( CurTime(), "%02i:%02i") .. "] [Checker]: You are missing items " .. concat )
|
||||
net.Start( "Benny_Checker_CL_Request" )
|
||||
net.WriteUInt( table.Count( missinglist ), UINTBITS )
|
||||
for i, v in pairs( missinglist ) do
|
||||
net.WriteString( i )
|
||||
end
|
||||
net.SendToServer()
|
||||
end
|
||||
|
||||
-- Remove ghost items
|
||||
for i, v in pairs( ghostlist ) do
|
||||
inv[i] = nil
|
||||
print( "[".. string.FormattedTime( CurTime(), "%02i:%02i") .. "] [Checker]: Removed a ghost item with ID '" .. i .. "'" )
|
||||
end
|
||||
end )
|
||||
net.Receive( "Benny_Checker_CL_Request", function( len, ply )
|
||||
local ply = LocalPlayer()
|
||||
|
||||
local inv = ply:INV_Get()
|
||||
local amt = net.ReadUInt( UINTBITS )
|
||||
for i=1, amt do
|
||||
local id = net.ReadString()
|
||||
print( "[".. string.FormattedTime( CurTime(), "%02i:%02i") .. "] [Checker]: Restoring " .. id )
|
||||
inv[id] = net.ReadTable()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
end -- hardway
|
Loading…
Reference in New Issue