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
Docelowa nazwa zmiennej powinna pokrywać się z nazwą modułu.
Dla przykładu w
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)
Table of Contents