diff --git a/doc/en/scripting.md b/doc/en/scripting.md index 9b2a0297a..a21b959ed 100644 --- a/doc/en/scripting.md +++ b/doc/en/scripting.md @@ -37,6 +37,7 @@ Subsections: - [quat](scripting/builtins/libquat.md) - [random](scripting/builtins/librandom.md) - [rules](scripting/builtins/librules.md) + - [session](scripting/builtins/libsession.md) - [time](scripting/builtins/libtime.md) - [utf8](scripting/builtins/libutf8.md) - [vec2, vec3, vec4](scripting/builtins/libvecn.md) diff --git a/doc/en/scripting/builtins/libsession.md b/doc/en/scripting/builtins/libsession.md new file mode 100644 index 000000000..bf2086096 --- /dev/null +++ b/doc/en/scripting/builtins/libsession.md @@ -0,0 +1,18 @@ +# *session* Library + +This library is used to store data that is not reset when loading/unloading content, and is a recommended alternative to using the `_G` table. + +The stored data is not saved when the engine terminates. + +To minimize the risk of name collisions, it is recommended to use pack prefixes (`pack_id:table_name`), or, if a pack stores a single table in *session*, use the pack name as the entry name. + +```lua +-- Returns a table by name. Creates an empty table if it does not exist. +session.get(name: str) -> table + +-- Deletes a table by name. +session.reset(name: str) + +-- Returns true if the table has already been created by calling session.get +session.has(name: str) -> boolean +``` diff --git a/doc/ru/scripting.md b/doc/ru/scripting.md index 95a62007c..cd8a3b00a 100644 --- a/doc/ru/scripting.md +++ b/doc/ru/scripting.md @@ -37,6 +37,7 @@ - [quat](scripting/builtins/libquat.md) - [random](scripting/builtins/librandom.md) - [rules](scripting/builtins/librules.md) + - [session](scripting/builtins/libsession.md) - [time](scripting/builtins/libtime.md) - [utf8](scripting/builtins/libutf8.md) - [vec2, vec3, vec4](scripting/builtins/libvecn.md) diff --git a/doc/ru/scripting/builtins/libsession.md b/doc/ru/scripting/builtins/libsession.md new file mode 100644 index 000000000..17bc218cd --- /dev/null +++ b/doc/ru/scripting/builtins/libsession.md @@ -0,0 +1,18 @@ +# Библиотека *session* + +Библиотека используется для хранения данных, не сбрасывающихся при загрузке/выгрузке контента, являясь рекомендованной альтернативой использованию таблицы `_G`. + +Хранимые данные не сохраняются при завершении работы движка. + +Для минимизации риска коллизий имён рекомендуется использовать префиксы паков (`id_пака:имя_таблицы`), либо, если пак хранит одну таблицу в *session*, использовать имя пака как имя записи. + +```lua +-- Возвращает таблицу по имени. Создаёт пустую таблицу при отсутствии. +session.get(name: str) -> table + +-- Удаляет таблицу по имени. +session.reset(name: str) + +-- Возвращает true если таблица уже была создана вызовом session.get +session.has(name: str) -> boolean +``` diff --git a/doc/ru/scripting/builtins/libtime.md b/doc/ru/scripting/builtins/libtime.md index c4be679be..81bae58f7 100644 --- a/doc/ru/scripting/builtins/libtime.md +++ b/doc/ru/scripting/builtins/libtime.md @@ -1,4 +1,4 @@ -# Библиотека time +# Библиотека *time* ```lua -- Возвращает время с момента запуска движка в секундах и милисекундах. @@ -15,4 +15,4 @@ time.local_time() -> int -- Возвращает смещение локального времени от UTC в секундах time.utc_offset() -> int -``` \ No newline at end of file +``` diff --git a/res/layouts/console.xml.lua b/res/layouts/console.xml.lua index f7e47d9bb..edb03d977 100644 --- a/res/layouts/console.xml.lua +++ b/res/layouts/console.xml.lua @@ -1,6 +1,6 @@ console_mode = "console" -history = session.get_entry("commands_history") +history = session.get("commands_history") history_pointer = #history events.on("core:open_traceback", function() diff --git a/res/layouts/pages/generators.xml.lua b/res/layouts/pages/generators.xml.lua index 64649cd52..157b7e9b9 100644 --- a/res/layouts/pages/generators.xml.lua +++ b/res/layouts/pages/generators.xml.lua @@ -1,4 +1,4 @@ -settings = session.get_entry('new_world') +settings = session.get('new_world') function on_open() local names = generation.get_generators() diff --git a/res/layouts/pages/new_world.xml.lua b/res/layouts/pages/new_world.xml.lua index ad95aad0d..7e3421ff8 100644 --- a/res/layouts/pages/new_world.xml.lua +++ b/res/layouts/pages/new_world.xml.lua @@ -1,4 +1,4 @@ -settings = session.get_entry('new_world') +settings = session.get('new_world') function world_name_validator(name) return name:match("^[%w-\\.\\ ]+$") ~= nil and not world.exists(name) @@ -20,7 +20,7 @@ function create_world() local name = document.name_box.text local seed = document.seed_box.text local generator = settings.generator - session.reset_entry('new_world') + session.reset('new_world') app.new_world(name, seed, generator) end diff --git a/res/modules/internal/session.lua b/res/modules/internal/session.lua new file mode 100644 index 000000000..466094332 --- /dev/null +++ b/res/modules/internal/session.lua @@ -0,0 +1,21 @@ +local entries = {} +local this = {} + +function this.get(name) + local entry = entries[name] + if entry == nil then + entry = {} + entries[name] = entry + end + return entry +end + +function this.has(name) + return entries[name] ~= nil +end + +function this.reset(name) + entries[name] = nil +end + +return this diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 3aa149972..900b71b2e 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -345,23 +345,7 @@ function gui.template(name, params) return text end -session = { - entries={} -} - -function session.get_entry(name) - local entry = session.entries[name] - if entry == nil then - entry = {} - session.entries[name] = entry - end - return entry -end - -function session.reset_entry(name) - session.entries[name] = nil -end - +session = require "core:internal/session" stdcomp = require "core:internal/stdcomp" entities.get = stdcomp.get_Entity entities.get_all = function(uids)