2023-11-14 01:13:12 -05:00
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 )
2023-11-14 01:30:49 -05:00
local checkerinterval = 12
2023-11-14 01:13:12 -05:00
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