mirror of
https://github.com/JDM170/model_coder
synced 2025-12-10 05:57:19 +07:00
Added lua-side for decode and load model in MTA
Signed-off-by: Lev Rusanov <30170278+JDM170@users.noreply.github.com>
This commit is contained in:
@@ -1,40 +0,0 @@
|
|||||||
local pass = nil
|
|
||||||
local function loadFile(path)
|
|
||||||
local file = fileOpen(path)
|
|
||||||
if not file then
|
|
||||||
return error("No such file ".. path)
|
|
||||||
end
|
|
||||||
|
|
||||||
local data = fileRead(file, fileGetSize(file))
|
|
||||||
fileClose(file)
|
|
||||||
return data
|
|
||||||
end
|
|
||||||
|
|
||||||
function include(file_name)
|
|
||||||
local file = loadFile(file_name)
|
|
||||||
|
|
||||||
return assert(loadstring(file))
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function decodeLoadTXD(filename)
|
|
||||||
return engineLoadTXD(decodeString("tea", loadFile(filename .. 'c'), {key = pass}))
|
|
||||||
end
|
|
||||||
|
|
||||||
function decodeLoadDFF(filename)
|
|
||||||
return engineLoadDFF(decodeString("tea", loadFile(filename .. 'c'), {key = pass}))
|
|
||||||
end
|
|
||||||
|
|
||||||
function decodeLoadCOL(filename)
|
|
||||||
return engineLoadCOL(decodeString("tea", loadFile(filename .. 'c'), {key = pass}))
|
|
||||||
end
|
|
||||||
|
|
||||||
addEvent("setPass", true)
|
|
||||||
addEventHandler("setPass", resourceRoot, function(new_pass)
|
|
||||||
pass = new_pass
|
|
||||||
--CLIENT CONTENT HERE
|
|
||||||
end)
|
|
||||||
|
|
||||||
triggerServerEvent("requestPass", resourceRoot)
|
|
||||||
|
|
||||||
addDebugHook("preFunction", function(_, _, _, _, _, ...) return "skip" end, {"addDebugHook"})
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
addEvent("requestPass", true)
|
|
||||||
addEventHandler("requestPass", resourceRoot, function()
|
|
||||||
triggerClientEvent(client, "setPass", resourceRoot, sha256(get("pass")))
|
|
||||||
end)
|
|
||||||
9
lua/meta.xml
Normal file
9
lua/meta.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<meta>
|
||||||
|
<info author="JDM17" name="Decoder for XaskeL's locked cars" type="script" />
|
||||||
|
<min_mta_version client="1.5.6-9.18728" />
|
||||||
|
|
||||||
|
<script src="stub.lua" type="client" cache="false" />
|
||||||
|
|
||||||
|
<export function="fileDecode" type="client" />
|
||||||
|
<export function="safetyDelete" type="client" />
|
||||||
|
</meta>
|
||||||
62
lua/stub.lua
Normal file
62
lua/stub.lua
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
local blockSize = 12
|
||||||
|
local encodeSize = 3000 * blockSize
|
||||||
|
|
||||||
|
local symbolsTable = {}
|
||||||
|
for i=48, 122 do
|
||||||
|
if (i <= 57) or (i >= 65) and (i <= 90) or (i >= 97) then
|
||||||
|
table.insert(symbolsTable, string.char(i))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function lFileDecode(path, password, useRAM)
|
||||||
|
if not fileExists(path) then
|
||||||
|
return false, "File not found"
|
||||||
|
end
|
||||||
|
local encodedFile = fileOpen(path)
|
||||||
|
if (not encodedFile) then
|
||||||
|
return false, "File corrupted"
|
||||||
|
end
|
||||||
|
local encodedData = fileRead(encodedFile, encodeSize)
|
||||||
|
fileSetPos(encodedFile, encodeSize)
|
||||||
|
local origData = fileRead(encodedFile, fileGetSize(encodedFile) - encodeSize)
|
||||||
|
fileClose(encodedFile)
|
||||||
|
local truePassword = string.sub(utf8.lower(md5(password)), 1, 16)
|
||||||
|
local block
|
||||||
|
local decoded = ""
|
||||||
|
for i = 1, encodeSize, blockSize do
|
||||||
|
block = teaDecode(string.sub(encodedData, i, i + blockSize), truePassword)
|
||||||
|
if type(tonumber(block)) ~= "number" then
|
||||||
|
return false, "Wrong password"
|
||||||
|
end
|
||||||
|
decoded = decoded..string.char(block)
|
||||||
|
end
|
||||||
|
if (not useRAM) then
|
||||||
|
local decodedFileName = ""
|
||||||
|
for i = 1, 64 do
|
||||||
|
decodedFileName = decodedFileName..symbolsTable[math.random(#symbolsTable)]
|
||||||
|
end
|
||||||
|
local decodedFile = fileCreate(decodedFileName)
|
||||||
|
fileWrite(decodedFile, decoded..origData)
|
||||||
|
fileClose(decodedFile)
|
||||||
|
return true, string.format(":%s/%s", getResourceName(getThisResource()), decodedFileName)
|
||||||
|
else
|
||||||
|
return true, decoded..origData
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function lSafetyDelete(path)
|
||||||
|
local file = fileCreate(path)
|
||||||
|
fileWrite(file, "PROTECTED BY XASKEL")
|
||||||
|
fileClose(file)
|
||||||
|
setTimer(fileDelete, 100, 1, path)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Экспортные функции
|
||||||
|
function fileDecode(pt, ps, rm)
|
||||||
|
return lFileDecode(pt, ps, rm)
|
||||||
|
end
|
||||||
|
function safetyDelete(pt)
|
||||||
|
lSafetyDelete(pt)
|
||||||
|
end
|
||||||
|
|
||||||
|
addDebugHook("preFunction", function(_, _, _, _, _, ...) return "skip" end, {"addDebugHook"})
|
||||||
Reference in New Issue
Block a user