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