mirror of
https://github.com/wiremod/advdupe2.git
synced 2025-03-04 03:03:05 -05:00
commit
58f9acb723
@ -8,19 +8,7 @@
|
||||
Version: 2.0
|
||||
]]
|
||||
|
||||
local REVISION = 4
|
||||
local hasModule = false
|
||||
if(SERVER)then
|
||||
if(system.IsWindows())then
|
||||
hasModule = file.Exists("lua/bin/gmsv_ad2filestream_win32.dll", "GAME")
|
||||
print(hasModule)
|
||||
if(!hasModule)then
|
||||
print("[AdvDupe2Notify]\tMODULE NOT INSTALLED CORRECTLY. SAVING WILL BE SLOW.")
|
||||
else
|
||||
require("ad2filestream")
|
||||
end
|
||||
end
|
||||
end
|
||||
local REVISION = 5
|
||||
|
||||
include "sh_codec_legacy.lua"
|
||||
AddCSLuaFile "sh_codec_legacy.lua"
|
||||
@ -100,126 +88,65 @@ end
|
||||
|
||||
local len
|
||||
local tables,tablesLookup
|
||||
if(not system.IsWindows() or not hasModule)then
|
||||
enc[TYPE_TABLE] = function(obj) --table
|
||||
tables = tables + 1
|
||||
if not tablesLookup[obj] then
|
||||
tablesLookup[obj] = tables
|
||||
else
|
||||
buff:WriteByte(247)
|
||||
buff:WriteShort(tablesLookup[obj])
|
||||
return
|
||||
|
||||
enc[TYPE_TABLE] = function(obj) --table
|
||||
tables = tables + 1
|
||||
if not tablesLookup[obj] then
|
||||
tablesLookup[obj] = tables
|
||||
else
|
||||
buff:WriteByte(247)
|
||||
buff:WriteShort(tablesLookup[obj])
|
||||
return
|
||||
end
|
||||
|
||||
if isArray(obj) then
|
||||
buff:WriteByte(254)
|
||||
for i,v in pairs(obj) do
|
||||
write(v)
|
||||
end
|
||||
|
||||
if isArray(obj) then
|
||||
buff:WriteByte(254)
|
||||
for i,v in pairs(obj) do
|
||||
else
|
||||
buff:WriteByte(255)
|
||||
for k,v in pairs(obj) do
|
||||
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
|
||||
write(k)
|
||||
write(v)
|
||||
end
|
||||
else
|
||||
buff:WriteByte(255)
|
||||
for k,v in pairs(obj) do
|
||||
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
|
||||
write(k)
|
||||
write(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
buff:WriteByte(0)
|
||||
end
|
||||
enc[TYPE_BOOL] = function(obj) --boolean
|
||||
buff:WriteByte(obj and 253 or 252)
|
||||
end
|
||||
enc[TYPE_NUMBER] = function(obj) --number
|
||||
buff:WriteByte(251)
|
||||
buff:WriteDouble(obj)
|
||||
end
|
||||
enc[TYPE_VECTOR] = function(obj) --vector
|
||||
buff:WriteByte(250)
|
||||
buff:WriteDouble(obj.x)
|
||||
buff:WriteDouble(obj.y)
|
||||
buff:WriteDouble(obj.z)
|
||||
end
|
||||
enc[TYPE_ANGLE] = function(obj) --angle
|
||||
buff:WriteByte(249)
|
||||
buff:WriteDouble(obj.p)
|
||||
buff:WriteDouble(obj.y)
|
||||
buff:WriteDouble(obj.r)
|
||||
end
|
||||
enc[TYPE_STRING] = function(obj) --string
|
||||
|
||||
len = #obj
|
||||
|
||||
if len > 0 and len < 247 then
|
||||
buff:WriteByte(len)
|
||||
buff:Write(obj)
|
||||
else
|
||||
buff:WriteByte(248)
|
||||
buff:Write(obj)
|
||||
buff:WriteByte(0)
|
||||
end
|
||||
|
||||
end
|
||||
else
|
||||
enc[TYPE_TABLE] = function(obj) --table
|
||||
tables = tables + 1
|
||||
if not tablesLookup[obj] then
|
||||
tablesLookup[obj] = tables
|
||||
else
|
||||
AdvDupe2_WriteByte(247)
|
||||
AdvDupe2_WriteShort(tablesLookup[obj])
|
||||
return
|
||||
end
|
||||
|
||||
if isArray(obj) then
|
||||
AdvDupe2_WriteByte(254)
|
||||
for i,v in pairs(obj) do
|
||||
write(v)
|
||||
end
|
||||
else
|
||||
AdvDupe2_WriteByte(255)
|
||||
for k,v in pairs(obj) do
|
||||
if(enc[TypeID(k)]!=noserializer and enc[TypeID(v)]!=noserializer)then
|
||||
write(k)
|
||||
write(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
AdvDupe2_WriteByte(0)
|
||||
end
|
||||
enc[TYPE_BOOL] = function(obj) --boolean
|
||||
AdvDupe2_WriteByte(obj and 253 or 252)
|
||||
end
|
||||
enc[TYPE_NUMBER] = function(obj) --number
|
||||
AdvDupe2_WriteByte(251)
|
||||
AdvDupe2_WriteDouble(obj)
|
||||
end
|
||||
enc[TYPE_VECTOR] = function(obj) --vector
|
||||
AdvDupe2_WriteByte(250)
|
||||
AdvDupe2_WriteDouble(obj.x)
|
||||
AdvDupe2_WriteDouble(obj.y)
|
||||
AdvDupe2_WriteDouble(obj.z)
|
||||
end
|
||||
enc[TYPE_ANGLE] = function(obj) --angle
|
||||
AdvDupe2_WriteByte(249)
|
||||
AdvDupe2_WriteDouble(obj.p)
|
||||
AdvDupe2_WriteDouble(obj.y)
|
||||
AdvDupe2_WriteDouble(obj.r)
|
||||
end
|
||||
enc[TYPE_STRING] = function(obj) --string
|
||||
|
||||
len = #obj
|
||||
|
||||
if len > 0 and len < 247 then
|
||||
AdvDupe2_WriteByte(len)
|
||||
AdvDupe2_WriteString(obj)
|
||||
else
|
||||
AdvDupe2_WriteByte(248)
|
||||
AdvDupe2_WriteString(obj)
|
||||
AdvDupe2_WriteByte(0)
|
||||
end
|
||||
|
||||
buff:WriteByte(246)
|
||||
end
|
||||
enc[TYPE_BOOL] = function(obj) --boolean
|
||||
buff:WriteByte(obj and 253 or 252)
|
||||
end
|
||||
enc[TYPE_NUMBER] = function(obj) --number
|
||||
buff:WriteByte(251)
|
||||
buff:WriteDouble(obj)
|
||||
end
|
||||
enc[TYPE_VECTOR] = function(obj) --vector
|
||||
buff:WriteByte(250)
|
||||
buff:WriteDouble(obj.x)
|
||||
buff:WriteDouble(obj.y)
|
||||
buff:WriteDouble(obj.z)
|
||||
end
|
||||
enc[TYPE_ANGLE] = function(obj) --angle
|
||||
buff:WriteByte(249)
|
||||
buff:WriteDouble(obj.p)
|
||||
buff:WriteDouble(obj.y)
|
||||
buff:WriteDouble(obj.r)
|
||||
end
|
||||
enc[TYPE_STRING] = function(obj) --string
|
||||
|
||||
len = #obj
|
||||
|
||||
if len < 246 then
|
||||
buff:WriteByte(len)
|
||||
buff:Write(obj)
|
||||
else
|
||||
buff:WriteByte(248)
|
||||
buff:WriteULong(len)
|
||||
buff:Write(obj)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function error_nodeserializer()
|
||||
@ -227,131 +154,174 @@ local function error_nodeserializer()
|
||||
error(format("couldn't find deserializer for type {typeid:%d}", buff:ReadByte()))
|
||||
end
|
||||
|
||||
local dec = {}
|
||||
local reference = 0
|
||||
for i=1,255 do dec[i] = error_nodeserializer end
|
||||
local read4, read5
|
||||
|
||||
local function read()
|
||||
local tt = buff:ReadByte()
|
||||
|
||||
if not tt then
|
||||
error("expected value, got EOF")
|
||||
local reference = 0
|
||||
do --Version 4
|
||||
local dec = {}
|
||||
for i=1,255 do dec[i] = error_nodeserializer end
|
||||
|
||||
local function read()
|
||||
local tt = buff:ReadByte()
|
||||
if not tt then
|
||||
error("expected value, got EOF")
|
||||
end
|
||||
if tt == 0 then
|
||||
return nil
|
||||
end
|
||||
return dec[tt]()
|
||||
end
|
||||
|
||||
if tt == 0 then
|
||||
return nil
|
||||
read4 = read
|
||||
|
||||
dec[255] = function() --table
|
||||
local t = {}
|
||||
local k
|
||||
reference = reference + 1
|
||||
local ref = reference
|
||||
repeat
|
||||
k = read()
|
||||
if k ~= nil then
|
||||
t[k] = read()
|
||||
end
|
||||
until (k == nil)
|
||||
tables[ref] = t
|
||||
return t
|
||||
end
|
||||
|
||||
return dec[tt]()
|
||||
|
||||
|
||||
dec[254] = function() --array
|
||||
local t = {}
|
||||
local k,v = 0
|
||||
reference = reference + 1
|
||||
local ref = reference
|
||||
repeat
|
||||
k = k + 1
|
||||
v = read()
|
||||
if(v != nil) then
|
||||
t[k] = v
|
||||
end
|
||||
|
||||
until (v == nil)
|
||||
tables[ref] = t
|
||||
return t
|
||||
end
|
||||
|
||||
dec[253] = function()
|
||||
return true
|
||||
end
|
||||
dec[252] = function()
|
||||
return false
|
||||
end
|
||||
dec[251] = function()
|
||||
return buff:ReadDouble()
|
||||
end
|
||||
dec[250] = function()
|
||||
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[249] = function()
|
||||
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[248] = function() --null-terminated string
|
||||
local start = buff:Tell()
|
||||
local slen = 0
|
||||
|
||||
while buff:ReadByte() != 0 do
|
||||
slen = slen + 1
|
||||
end
|
||||
|
||||
buff:Seek(start)
|
||||
|
||||
local retv = buff:Read(slen)
|
||||
if(not retv)then retv="" end
|
||||
buff:ReadByte()
|
||||
|
||||
return retv
|
||||
end
|
||||
dec[247] = function() --table reference
|
||||
reference = reference + 1
|
||||
return tables[buff:ReadShort()]
|
||||
end
|
||||
|
||||
for i=1,246 do dec[i] = function() return buff:Read(i) end end
|
||||
end
|
||||
|
||||
dec[255] = function() --table
|
||||
local t = {}
|
||||
local k
|
||||
reference = reference + 1
|
||||
local ref = reference
|
||||
do --Version 5
|
||||
local dec = {}
|
||||
for i=1,255 do dec[i] = error_nodeserializer end
|
||||
|
||||
repeat
|
||||
|
||||
k = read()
|
||||
|
||||
if k ~= nil then
|
||||
local function read()
|
||||
local tt = buff:ReadByte()
|
||||
if not tt then
|
||||
error("expected value, got EOF")
|
||||
end
|
||||
return dec[tt]()
|
||||
end
|
||||
read5 = read
|
||||
|
||||
dec[255] = function() --table
|
||||
local t = {}
|
||||
reference = reference + 1
|
||||
tables[reference] = t
|
||||
|
||||
for k in read do
|
||||
t[k] = read()
|
||||
end
|
||||
|
||||
until (k == nil)
|
||||
|
||||
tables[ref] = t
|
||||
|
||||
return t
|
||||
|
||||
end
|
||||
|
||||
dec[254] = function() --array
|
||||
local t = {}
|
||||
local k,v = 0
|
||||
reference = reference + 1
|
||||
local ref = reference
|
||||
|
||||
repeat
|
||||
k = k + 1
|
||||
v = read()
|
||||
|
||||
if(v != nil) then
|
||||
t[k] = v
|
||||
end
|
||||
|
||||
until (v == nil)
|
||||
|
||||
tables[ref] = t
|
||||
|
||||
return t
|
||||
|
||||
end
|
||||
|
||||
dec[253] = function()
|
||||
return true
|
||||
end
|
||||
dec[252] = function()
|
||||
return false
|
||||
end
|
||||
dec[251] = function()
|
||||
return buff:ReadDouble()
|
||||
end
|
||||
dec[250] = function()
|
||||
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[249] = function()
|
||||
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[248] = function() --null-terminated string
|
||||
local start = buff:Tell()
|
||||
local slen = 0
|
||||
|
||||
while buff:ReadByte() != 0 do
|
||||
slen = slen + 1
|
||||
return t
|
||||
end
|
||||
|
||||
buff:Seek(start)
|
||||
|
||||
local retv = buff:Read(slen)
|
||||
if(not retv)then retv="" end
|
||||
buff:ReadByte()
|
||||
|
||||
return retv
|
||||
end
|
||||
dec[247] = function() --table reference
|
||||
reference = reference + 1
|
||||
return tables[buff:ReadShort()]
|
||||
end
|
||||
dec[254] = function() --array
|
||||
local t = {}
|
||||
reference = reference + 1
|
||||
tables[reference] = t
|
||||
|
||||
local function vsr()
|
||||
|
||||
buff:Seek(buff:Tell() - 1)
|
||||
|
||||
slen = buff:ReadByte()
|
||||
|
||||
return buff:Read(slen)
|
||||
|
||||
end
|
||||
local k = 1
|
||||
for v in read do
|
||||
t[k] = v
|
||||
k = k + 1
|
||||
end
|
||||
|
||||
for i=1,246 do dec[i] = vsr end
|
||||
return t
|
||||
end
|
||||
|
||||
dec[253] = function()
|
||||
return true
|
||||
end
|
||||
dec[252] = function()
|
||||
return false
|
||||
end
|
||||
dec[251] = function()
|
||||
return buff:ReadDouble()
|
||||
end
|
||||
dec[250] = function()
|
||||
return Vector(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[249] = function()
|
||||
return Angle(buff:ReadDouble(),buff:ReadDouble(),buff:ReadDouble())
|
||||
end
|
||||
dec[248] = function() -- Length>246 string
|
||||
local slen = buff:ReadULong()
|
||||
local retv = buff:Read(slen)
|
||||
if(not retv)then retv="" end
|
||||
return retv
|
||||
end
|
||||
dec[247] = function() --table reference
|
||||
return tables[buff:ReadShort()]
|
||||
end
|
||||
dec[246] = function() --nil
|
||||
return
|
||||
end
|
||||
|
||||
for i=1,245 do dec[i] = function() return buff:Read(i) end end
|
||||
dec[0] = function() return "" end
|
||||
end
|
||||
|
||||
local function serialize(tbl)
|
||||
tables = 0
|
||||
tablesLookup = {}
|
||||
|
||||
if(not system.IsWindows() or not hasModule)then
|
||||
buff = file.Open("ad2temp.txt", "wb", "DATA")
|
||||
write(tbl)
|
||||
buff:Close()
|
||||
else
|
||||
if(not AdvDupe2_OpenStream)then print("[AdvDupe2Notify]\tMODULE NOT INSTALLED CORRECTLY. YOU WILL NOT BE ABLE TO SAVE.") return "" end
|
||||
if(not AdvDupe2_OpenStream())then error("Filestream could not be opened.") return "" end
|
||||
write(tbl)
|
||||
AdvDupe2_CloseStream()
|
||||
end
|
||||
buff = file.Open("ad2temp.txt", "wb", "DATA")
|
||||
write(tbl)
|
||||
buff:Close()
|
||||
|
||||
buff = file.Open("ad2temp.txt","rb","DATA")
|
||||
local ret = buff:Read(buff:Size())
|
||||
@ -360,7 +330,7 @@ local function serialize(tbl)
|
||||
end
|
||||
|
||||
|
||||
local function deserialize(str)
|
||||
local function deserialize(str, read)
|
||||
|
||||
if(str==nil)then
|
||||
error("File could not be decompressed.")
|
||||
@ -439,9 +409,12 @@ end
|
||||
|
||||
versions[4] = function(encodedDupe)
|
||||
local info, dupestring = getInfo(encodedDupe:sub(7))
|
||||
return deserialize(
|
||||
decompress(dupestring)
|
||||
), info
|
||||
return deserialize(decompress(dupestring), read4), info
|
||||
end
|
||||
|
||||
versions[5] = function(encodedDupe)
|
||||
local info, dupestring = getInfo(encodedDupe:sub(7))
|
||||
return deserialize(decompress(dupestring), read5), info
|
||||
end
|
||||
|
||||
--[[
|
||||
@ -477,7 +450,7 @@ function AdvDupe2.Decode(encodedDupe, callback, ...)
|
||||
error("unknown duplication format")
|
||||
end
|
||||
elseif rev > REVISION then
|
||||
error(format("this install lacks the codec version to parse the dupe (have rev %u, need rev %u)",REVISION,rev))
|
||||
error(format("Newer codec needed. (have rev %u, need rev %u) Update Advdupe2.",REVISION,rev))
|
||||
elseif rev < 1 then
|
||||
error(format("attempt to use an invalid format revision (rev %d)", rev))
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user