- 445
- 131
- Версия MoonLoader
- .026-beta
Всем привет! Разрабатываю библиотеку ForgeMap для создания кастомных карт (на замену стандартной карте gta). Суть библиотеки: она предоставляет API для создания, рендера (mimgui) и управления интерактивной картой. Я хочу дать возможность разработчикам расширять функционал друг друга.
В теории всё звучит гладко, но на практике при попытке получить экземпляр и взаимодействовать с ним из Скрипта Б, я получаю разные ошибки.
ScriptB падает:
Насколько я понял, экземпляры нельзя экспортировать. Т.е экземпляр должен жить там, где был создан, а скрипт должен экспортировать только апи для взаимодействия с этим экземпляром? Я просто уже очень устал, мне надоело уже, подскажите как нужно правильно сделать)
- Скрипт А: Разработчик подключает эту библиотеку, создает экземпляр карты (
map = ForgeMap:new()), настраивает его и рендерит в своем окне. Он экспортирует функциюgetMapInstance(), чтобы отдать ссылку на этот объект наружу. - Скрипт Б: Другой разработчик пишет отдельный скрипт. Он импортирует Скрипт А, получает доступ к уже созданному экземпляру карты и вызывает его методы (например
map:createBlip(...)). - Итог: Маркера из Скрипта Б появляются на карте, которую рендерит Скрипт А.
В теории всё звучит гладко, но на практике при попытке получить экземпляр и взаимодействовать с ним из Скрипта Б, я получаю разные ошибки.
ScriptA:
local imgui = require("mimgui")
local fMap = require("ForgeMap")
local testWindow = imgui.new.bool(true)
local defaultMap = fMap:new()
local playerBlip = defaultMap:createBlip({
x = 0, y = 0, z = 0,
sprite = "radar_centre",
size = 32,
color = 0xFF00FFFF
})
imgui.OnInitialize(function()
defaultMap:loadTextures()
end)
local newFrame = imgui.OnFrame(
function() return testWindow[0] end,
function(player)
imgui.Begin("ForgeMap Debug", testWindow, imgui.WindowFlags.NoMove)
defaultMap:renderWidget()
imgui.End()
end
)
function main()
while not isSampAvailable() do wait(0) end
while true do
wait(0)
local x, y, z = getCharCoordinates(PLAYER_PED)
playerBlip:setPos(x, y, z)
end
end
EXPORTS.getMapInstance = function()
return defaultMap
end
ScriptB:
local fMap = import("ScriptA")
local defaultMap = fMap.getMapInstance()
function main()
while not isSampAvailable() do wait(0) end
sampRegisterChatCommand("mark", function ()
defaultMap:createBlip({
x = 0, y = 0, z = 0,
sprite = "radar_cash",
size = 32,
color = 0xFF00FFFF
})
end)
wait(-1)
end
ScriptB падает:
JavaScript:
[ML] (error) ScriptB.lua: unknown object type
stack traceback:
[C]: in function 'getMapInstance'
C:\Games\GTA San Andreas\moonloader\ScriptB.lua:3: in main chunk
[ML] (error) ScriptB.lua: Script died due to an error. (14D851FC)
init.lua (ForgeMap):
local Engine = require("ForgeMap.core.engine")
local Renderer = require("ForgeMap.core.renderer")
local Objects = require("ForgeMap.core.objects")
local Assets = require("ForgeMap.core.assets")
local Events = require("ForgeMap.core.events")
local ForgeMap = {}
ForgeMap.__index = ForgeMap
function ForgeMap:new(opts)
local self = setmetatable({}, ForgeMap)
self._assets = Assets:new()
self._engine = Engine:new()
self._events = Events:new()
self._objects = Objects:new(self._assets)
self._renderer = Renderer:new(self._assets)
return self
end
-- API
function ForgeMap:renderWidget()
self._engine:update()
self._renderer:drawMap(self._engine)
self._objects:drawAll(self._engine, self._renderer)
end
function ForgeMap:createBlip(params)
return self._objects:createBlip(params)
end
function ForgeMap:loadTextures(customTXDPath, customList)
self._assets:loadTextures(customTXDPath, customList)
end
return ForgeMap
Насколько я понял, экземпляры нельзя экспортировать. Т.е экземпляр должен жить там, где был создан, а скрипт должен экспортировать только апи для взаимодействия с этим экземпляром? Я просто уже очень устал, мне надоело уже, подскажите как нужно правильно сделать)