Skip to content

Commit b6673ae

Browse files
remake map editor script extensions & fix LODs not creating in editor
1 parent 86b5ead commit b6673ae

File tree

6 files changed

+596
-526
lines changed

6 files changed

+596
-526
lines changed

[editor]/edf/edf.lua

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ local edfCreateBasic = {
2828
object = function(cdata)
2929
local object = createObject(cdata.model, cdata.position[1], cdata.position[2], cdata.position[3], cdata.rotation[1], cdata.rotation[2], cdata.rotation[3])
3030
setObjectScale(object, cdata.scale)
31+
if exports.editor_main:getMapSettingValue("useLODs") == true then
32+
local lodModel = exports.editor_main:getLODModelFromObjectModel(cdata.model)
33+
if lodModel then
34+
local lodObject = createObject(lodModel, cdata.position[1], cdata.position[2], cdata.position[3], cdata.rotation[1], cdata.rotation[2], cdata.rotation[3], true)
35+
setObjectScale(lodObject, cdata.scale)
36+
setLowLODElement(object, lodObject)
37+
setElementParent(lodObject, object)
38+
end
39+
end
3140
return object
3241
end,
3342
vehicle = function(cdata)

[editor]/editor_main/client/mapEditorScriptingExtension_c.lua

Lines changed: 0 additions & 11 deletions
This file was deleted.

[editor]/editor_main/meta.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
<!-- Utils -->
2424
<script src="client/controlinterface.lua" type="client" />
2525
<script src="server/util.lua" type="server" />
26+
<script src="server/lods.lua" type="server" />
27+
<export function="getLODModelFromObjectModel" type="server" />
2628
<script src="server/orderedPairs.lua" type="server" />
2729
<script src="client/matrix.lua" type="client" />
2830
<script src="client/complex.lua" type="client" />
@@ -50,6 +52,7 @@
5052
<script src="server/synchronization.lua" type="server" />
5153
<script src="server/locking.lua" type="server" />
5254
<script src="server/mapsettingssync.lua" type="server" />
55+
<export function="getMapSettingValue" type="server" />
5356
<script src="server/definitionssync.lua" type="server" />
5457

5558
<!-- ID assignment handling code -->

[editor]/editor_main/server/dumpxml.lua

Lines changed: 128 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
local SCRIPTING_EXTENSIONS
2+
13
local DESTROYED_ELEMENT_DIMENSION = getWorkingDimension() + 1
24
function 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)
229249
end
@@ -239,3 +259,104 @@ function getMapElementData ( element )
239259
end
240260
return elementData
241261
end
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

Comments
 (0)