From 93d125ff2d8e42ba5269c07c2184625e120db69b Mon Sep 17 00:00:00 2001 From: Fierelier Date: Fri, 10 Sep 2021 16:44:43 +0200 Subject: [PATCH] Add support for registering .COL libraries --- baseResource/client.lua | 48 +++++++++++++++++++++++++++++++---------- baseResource/col.lua | 34 +++++++++++++++++++++++++++++ sa2mta.py | 3 ++- 3 files changed, 73 insertions(+), 12 deletions(-) create mode 100644 baseResource/col.lua diff --git a/baseResource/client.lua b/baseResource/client.lua index a428791..7faef40 100644 --- a/baseResource/client.lua +++ b/baseResource/client.lua @@ -4,6 +4,7 @@ objectsToPlace = {} objectRegister = {} modelRegister = {} textureRegister = {} +collisionRegister = {} blacklistObjects = {} -- Blacklist for SanVice: -- blacklistObjects[7479] = true @@ -24,6 +25,18 @@ logpath = "log.txt" if fileExists(logpath) then fileDelete(logpath) end logfile = fileCreate(logpath) +function registerCollisionArchive(path) + cols = engineGetCOLsFromLibrary(path) + for colName,colData in pairs(cols) do + colNameStd = string.lower(colName) + if collisionRegister[colNameStd] == nil then + collisionRegister[colNameStd] = engineLoadCOL(colData) + else + outputChatBox("Warning: Duplicate collision: " ..colName) + end + end +end + function displayStatus(text) if debugToggle == false then return end x,y = guiGetScreenSize() @@ -41,26 +54,37 @@ function registerObject(...) -- id,model,texture,drawDistance end function registerObjectNow(id,model,texture,drawDistance) + modelStd = string.lower(model) + textureStd = string.lower(texture) + if blacklistObjects[id] then debugWrite("Skipping object " ..tostring(id).. " (" ..texture.. " + " ..model.. ") - Blacklisted.\n") return end - if textureRegister[texture] == nil then + + if textureRegister[textureStd] == nil then debugWrite("Loading texture: " ..texture.. "\n") - textureRegister[texture] = engineLoadTXD(texture) + textureRegister[textureStd] = engineLoadTXD("img/" ..texture.. ".txd") end - if modelRegister[model] == nil then + if modelRegister[modelStd] == nil then debugWrite("Loading model: " ..model.. "\n") - modelRegister[model] = engineLoadDFF(model) + modelRegister[modelStd] = engineLoadDFF("img/" ..model.. ".dff") end realID = engineRequestModel("object",10768) debugWrite("Making object " ..tostring(id).. ": " ..texture.. " + " ..model.. " = " ..tostring(realID).. "\n") - engineImportTXD(textureRegister[texture],realID) - engineReplaceModel(modelRegister[model],realID) + colAvailable = false + if collisionRegister[modelStd] ~= nil then + engineReplaceCOL(collisionRegister[modelStd],realID) + colAvailable = true + end + engineImportTXD(textureRegister[textureStd],realID) + engineReplaceModel(modelRegister[modelStd],realID) engineSetModelLODDistance(realID,drawDistance) - objectRegister[id] = realID + objectRegister[id] = {} + objectRegister[id]["realID"] = realID + objectRegister[id]["colAvailable"] = colAvailable if tempObj then destroyElement(tempObj) @@ -82,9 +106,11 @@ end function placeObjectNow(id,interior,x,y,z,rx,ry,rz,rw,lod) if objectRegister[id] == nil then return end erx,ery,erz = fromQuaternion(rx,ry,rz,rw) - obj = createObject(objectRegister[id],x,y + 6000,z,erx,ery,erz) + obj = createObject(objectRegister[id]["realID"],x,y + 6000,z,erx,ery,erz) setElementInterior(obj,interior) - setElementCollisionsEnabled(obj,false) + if not objectRegister[id]["colAvailable"] then + setElementCollisionsEnabled(obj,false) + end displayStatus("Placed model: " ..tostring(id).. ", " ..tostring(#objectsToPlace).. " remaining...") end @@ -124,8 +150,8 @@ addEventHandler("onClientRender",root,handleLoading) addEventHandler("onClientResourceStop",root,function(res) if res == resource then - for _,value in pairs(objectRegister) do - engineFreeModel(value) + for key,_ in pairs(objectRegister) do + engineFreeModel(objectRegister[key]["realID"]) end end end) \ No newline at end of file diff --git a/baseResource/col.lua b/baseResource/col.lua new file mode 100644 index 0000000..2f4f871 --- /dev/null +++ b/baseResource/col.lua @@ -0,0 +1,34 @@ +-- Author: thisdp +-- Source: https://wiki.multitheftauto.com/wiki/EngineGetCOLsFromLibrary + +local matchedCOLVer = { + COLL = "COLL", + COL2 = "COL2", + COL3 = "COL3", +} +function engineGetCOLsFromLibrary(file) + assert(type(file) == "string","Bad argument @'engineGetCOLsFromLibrary' expected a string at argument 1, got "..type(file)) + if fileExists(file) then --COL Library + local f = fileOpen(file) + local str = fileRead(f,fileGetSize(f)) + fileClose(f) + return engineGetCOLsFromLibrary(str) + else + local cols = {} + while true do + local colVer = file:sub(1,4) + if matchedCOLVer[colVer] then + local a,b,c,d = file:byte(5,8) + local colSize = a+b*0x100+c*0x10000+d*0x1000000 + local col = file:sub(1,colSize+8) + local colName = col:sub(9,29) + local zeroPoint = colName:find("\0") + cols[colName:sub(1,zeroPoint-1)] = col + file = file:sub(colSize+9) + else + break + end + end + return cols + end +end \ No newline at end of file diff --git a/sa2mta.py b/sa2mta.py index b119292..03457b9 100644 --- a/sa2mta.py +++ b/sa2mta.py @@ -185,6 +185,7 @@ def main(): fileMeta.write("\n") fileMeta.write('\n') fileMeta.write('-1\n') + fileMeta.write('