Export/Import

RaMero

Известный
Автор темы
445
131
Версия MoonLoader
.026-beta
Всем привет! Разрабатываю библиотеку ForgeMap для создания кастомных карт (на замену стандартной карте gta). Суть библиотеки: она предоставляет API для создания, рендера (mimgui) и управления интерактивной картой. Я хочу дать возможность разработчикам расширять функционал друг друга.

  • Скрипт А: Разработчик подключает эту библиотеку, создает экземпляр карты (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

Насколько я понял, экземпляры нельзя экспортировать. Т.е экземпляр должен жить там, где был создан, а скрипт должен экспортировать только апи для взаимодействия с этим экземпляром? Я просто уже очень устал, мне надоело уже, подскажите как нужно правильно сделать)