Praca z modułami

Moduły są głównym mechanizmem używanym w kodzie BetterLife.

Modułem nazywany jest skrypt który udostępnia swoje API dla innych skryptów.

Format importowania modułu

Syntax
ModuleName = exports['bl-resource_name'].ImportName()

Example
-- local script file scoped import
local Player = exports['bl-base'].Player()

-- global script scope import
Net = exports['bl-base'].Net()
Chat = exports['bl-chat'].Chat()
Interaction = exports['bl-interaction'].Interaction()

Format tworzenia modułu

Załóżmy że tworzysz skrypt o nazwie bl-module, i chcesz w nim udostępnić API dla innych skryptów. Aby tego dokonać potrzebny ci będzie następujący fragment kodu.

bl-module/client/module.c.lua
Module = {}

exports('Module', function()
    return Module
end)
Warto pamiętać, że zmienna Module jest tylko w celach pokazowych.

Docelowa nazwa zmiennej powinna pokrywać się z nazwą modułu.
Dla przykładu w Interaction nazwa funkcji do importu, tak samo jak globalnej zmiennej jest taka sama (Interaction)

Implementujemy funkcjonalność w API

Aby zaimplementować nową funkcjonalność będziemy posługiwać się zapisem metody w lua.

bl-module/client/module.c.lua
Module = {}

function Module:CallMe()
    -- do something special
end

exports('Module', function()
    return Module
end)

Cache dla modułu

Przyjełó się, że w modułach część związana z cache trzymana jest w obiekcie o zmiennej z prefixem _, w naszym przypadku będzie to _Module

Zaimplementujmy teraz metodę która będzie ustawiała zmienną w cache'u.

bl-module/client/module.c.lua
Module = {}
local _Module = {
    something = nil
}

function Module:CallMe()
    -- do something special
end

function Module:SetSmth(newValue)
    -- do something special
    _Module.something = newValue
end

exports('Module', function()
    return Module
end)

Typy

W projekcie używamy zapisu typów dla lua-language-server aby uprościć pracę.

Dokumentacja annotacji dla LuaLS

Dodajmy teraz typy danych dla naszego kodu

bl-module/client/module.c.lua
Module = {}
local _Module = {
    something = nil ---@type string
}

function Module:CallMe()
    -- do something special
end

---@param newValue string
function Module:SetSmth(newValue)
    assert(type(newValue) == 'string')
    _Module.something = newValue
end

exports('Module', function()
    return Module
end)