1+ local SCRIPTING_EXTENSIONS
2+
13local DESTROYED_ELEMENT_DIMENSION = getWorkingDimension () + 1
24function toAttribute (value )
35 if type (value ) == " table" then
@@ -193,37 +195,55 @@ function dumpMeta ( xml, extraNodes, resource, filename, test )
193195 end
194196 end
195197
196- -- Add the mapEditorScriptingExtension scripts to meta
197- local scriptName = " mapEditorScriptingExtension_s.lua"
198+ -- Add the map editor scripting extension scripts to meta
199+ local scriptName = " newMapEditorScriptingExtension_s.lua"
200+ local scriptContent = SCRIPTING_EXTENSIONS [" server" ]
198201 local foundScriptInMeta = false
199202 for i , child in ipairs (xmlNodeGetChildren (xml )) do
200203 if (xmlNodeGetAttribute (child , " src" ) == scriptName ) then
201204 foundScriptInMeta = true
202205 break
203206 end
204207 end
205- if (not foundScriptInMeta ) then
208+ -- If for some reason the file fails to create, we won't add it to meta.xml
209+ local scriptExtFile = fileCreate (" :" .. getResourceName (resource ).. " /" .. scriptName )
210+ local scriptExtFileSuccess = false
211+ if scriptExtFile then
212+ if fileWrite (scriptExtFile , scriptContent ) then
213+ scriptExtFileSuccess = true
214+ end
215+ fileClose (scriptExtFile )
216+ end
217+ if scriptExtFileSuccess and (not foundScriptInMeta ) then
206218 local scriptNode = xmlCreateChild (xml , " script" )
207219 xmlNodeSetAttribute (scriptNode , " src" , scriptName )
208220 xmlNodeSetAttribute (scriptNode , " type" , " server" )
209221 end
210- fileCopy (" server/" .. scriptName , " :" .. getResourceName (resource ).. " /" .. scriptName , true )
211222
212- scriptName = " mapEditorScriptingExtension_c.lua"
223+ scriptName = " newMapEditorScriptingExtension_c.lua"
224+ scriptContent = SCRIPTING_EXTENSIONS [" client" ]
213225 foundScriptInMeta = false
214226 for i , child in ipairs (xmlNodeGetChildren (xml )) do
215227 if (xmlNodeGetAttribute (child , " src" ) == scriptName ) then
216228 foundScriptInMeta = true
217229 break
218230 end
219231 end
220- if (not foundScriptInMeta ) then
232+ -- If for some reason the file fails to create, we won't add it to meta.xml
233+ scriptExtFile = fileCreate (" :" .. getResourceName (resource ).. " /" .. scriptName )
234+ scriptExtFileSuccess = false
235+ if scriptExtFile then
236+ if fileWrite (scriptExtFile , scriptContent ) then
237+ scriptExtFileSuccess = true
238+ end
239+ fileClose (scriptExtFile )
240+ end
241+ if scriptExtFileSuccess and (not foundScriptInMeta ) then
221242 local scriptNode = xmlCreateChild (xml , " script" )
222243 xmlNodeSetAttribute (scriptNode , " src" , scriptName )
223244 xmlNodeSetAttribute (scriptNode , " type" , " client" )
224245 xmlNodeSetAttribute (scriptNode , " validate" , " false" )
225246 end
226- fileCopy (" client/" .. scriptName , " :" .. getResourceName (resource ).. " /" .. scriptName , true )
227247
228248 return xmlSaveFile (xml )
229249end
@@ -239,3 +259,104 @@ function getMapElementData ( element )
239259 end
240260 return elementData
241261end
262+
263+ SCRIPTING_EXTENSIONS = {
264+ [" client" ] = [[ -- FILE: newMapEditorScriptingExtension_c.lua
265+ -- PURPOSE: Prevent the map editor feature set being limited by what MTA can load from a map file by adding a script file to maps
266+ -- VERSION: 11/October/2024
267+ -- IMPORTANT: Check the resource 'editor_main' at https://github.com/mtasa-resources/ for updates
268+
269+ local resourceName = getResourceName(resource)
270+ local updatedLodDistances = {}
271+
272+ local function setLODsClient(lodTbl)
273+ for model in pairs(lodTbl) do
274+ updatedLodDistances[model] = true
275+ engineSetModelLODDistance(model, 300)
276+ end
277+ end
278+ addEvent(resourceName..":setLODsClient", true)
279+ addEventHandler(resourceName..":setLODsClient", resourceRoot, setLODsClient)
280+
281+ local function handleClientResourceStop()
282+ for model in pairs(updatedLodDistances) do
283+ engineResetModelLODDistance(model)
284+ end
285+ end
286+ addEventHandler("onClientResourceStop", resourceRoot, handleClientResourceStop, false)]] ,
287+
288+ [" server" ] = [[ -- FILE: newMapEditorScriptingExtension_s.lua
289+ -- PURPOSE: Prevent the map editor feature set being limited by what MTA can load from a map file by adding a script file to maps
290+ -- VERSION: 11/October/2024
291+ -- IMPORTANT: Check the resource 'editor_main' at https://github.com/mtasa-resources/ for updates
292+
293+ local resourceName = getResourceName(resource)
294+ local usedLODModels = {}
295+ local LOD_MAP_NEW = {}
296+
297+ local function onResourceStartOrStop(startedResource)
298+ local startEvent = eventName == "onResourceStart"
299+ local removeObjects = getElementsByType("removeWorldObject", source)
300+
301+ for removeID = 1, #removeObjects do
302+ local objectElement = removeObjects[removeID]
303+ local objectModel = getElementData(objectElement, "model")
304+ local objectLODModel = getElementData(objectElement, "lodModel")
305+ local posX = getElementData(objectElement, "posX")
306+ local posY = getElementData(objectElement, "posY")
307+ local posZ = getElementData(objectElement, "posZ")
308+ local objectInterior = getElementData(objectElement, "interior") or 0
309+ local objectRadius = getElementData(objectElement, "radius")
310+
311+ if startEvent then
312+ removeWorldModel(objectModel, objectRadius, posX, posY, posZ, objectInterior)
313+ removeWorldModel(objectLODModel, objectRadius, posX, posY, posZ, objectInterior)
314+ else
315+ restoreWorldModel(objectModel, objectRadius, posX, posY, posZ, objectInterior)
316+ restoreWorldModel(objectLODModel, objectRadius, posX, posY, posZ, objectInterior)
317+ end
318+ end
319+
320+ if startEvent then
321+ local useLODs = get(resourceName..".useLODs")
322+
323+ if useLODs then
324+ local objectsTable = getElementsByType("object", source)
325+
326+ for objectID = 1, #objectsTable do
327+ local objectElement = objectsTable[objectID]
328+ local objectModel = getElementModel(objectElement)
329+ local lodModel = LOD_MAP_NEW[objectModel]
330+
331+ if lodModel then
332+ local objectX, objectY, objectZ = getElementPosition(objectElement)
333+ local objectRX, objectRY, objectRZ = getElementRotation(objectElement)
334+ local objectInterior = getElementInterior(objectElement)
335+ local objectDimension = getElementDimension(objectElement)
336+ local lodObject = createObject(lodModel, objectX, objectY, objectZ, objectRX, objectRY, objectRZ, true)
337+
338+ setElementInterior(lodObject, objectInterior)
339+ setElementDimension(lodObject, objectDimension)
340+
341+ setElementParent(lodObject, objectElement)
342+ setLowLODElement(objectElement, lodObject)
343+
344+ usedLODModels[lodModel] = true
345+ end
346+ end
347+ end
348+ end
349+ end
350+ addEventHandler("onResourceStart", resourceRoot, onResourceStartOrStop, false)
351+ addEventHandler("onResourceStop", resourceRoot, onResourceStartOrStop, false)
352+
353+ local function onPlayerResourceStart(res)
354+ if res ~= resource then return end
355+ triggerClientEvent(source, resourceName..":setLODsClient", resourceRoot, usedLODModels)
356+ end
357+ addEventHandler("onPlayerResourceStart", root, onPlayerResourceStart)
358+
359+ -- MTA LOD Table [object] = [lodmodel]]
360+ }
361+
362+ SCRIPTING_EXTENSIONS [" server" ] = SCRIPTING_EXTENSIONS [" server" ] .. " \n " .. getLodsLuaTableString ()
0 commit comments