Jump to content
Toggle menu
  • 3 articles
  • 22 files
  • 3 users
  • 2.5K edits
Shroudforge
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Modding

From Shroudforge
Revision as of 01:35, 7 November 2026 by Bonsaibauer (talk | contribs) (Importing a new version from external source)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)


Modding



Odczytuj stan menu głównego i nazwę wybranej lokalnej postaci za pomocą runtime'u Lua. Oba zapytania korzystają z tych samych danych natywnych co Modloader i nie wymagają dostępu do świata.

Wymagania wstępne

Włącz mod i zadeklaruj możliwość runtime w pliku mod.json:

{
  "capabilities": ["runtime"]
}

W przypadku tych zapytań klienta ustaw targets na ["client"] w pliku extended.mod.json. Wywołuj funkcje z aktywnych callbacków runtime'u, takich jak on_load i on_update. runtime.phase == "ingame" oznacza uruchomiony runtime moda, ale nie potwierdza wejścia do świata. Żadne z tych zapytań nie wymaga profilu wykonania. Pozostałe operacje dotyczące świata zachowują własne wymagania.

Wykrywanie menu głównego

local in_menu, reason = runtime.is_main_menu()
Zwracana wartość Znaczenie
true, nil Potwierdzono menu główne, w tym wybór postaci, świata i serwera.
false, nil Zweryfikowano inny pierwotny stan gry.
nil, reason Stan jest nieznany, zmienia się lub zapytanie jest niedostępne.

Jawnie sprawdzaj in_menu == true lub in_menu == false. nil nie jest potwierdzonym stanem. Samo false również nie potwierdza dostępności świata do odczytu. Osobno sprawdź wymaganą operację, na przykład runtime.has("runtime.ecs.read").

Odczyt nazwy postaci

local name, reason = runtime.player.name()
local display_name = name or "Flameborn"

name, nil zwraca jako ciąg UTF-8 nazwę postaci wybranej w lokalnym menu głównym. Znaki Unicode, na przykład w Ikiju 育樹, są zachowywane. nil, reason oznacza, że nazwa nie jest jeszcze dostępna albo dostęp jest niedostępny lub niedozwolony.

Mod sam wybiera nazwę zastępczą. API nie dodaje wartości domyślnej i nie używa ręcznego wyboru nazwy z Modloadera. Ta wartość nie identyfikuje zdalnego gracza i nie jest SteamID ani nazwą wyświetlaną przez Steam. Serwer dedykowany nie ma lokalnej nazwy postaci klienta.

Wspólna pamięć podręczna

Lua i Modloader odczytują tę samą pamięć podręczną natywną. Istniejący tick runtime'u odświeża stan menu. Istniejąca integracja menu zapisuje nazwę przy pierwszym dostępnym wyborze, a następnie ponownie po zmianie wyboru lub metadanych nazwy. Zapytania Lua nie uruchamiają osobnego wykrywania ani nie odczytują logów.

Ostatnia poprawnie odczytana nazwa pozostaje w pamięci podręcznej po wejściu do świata. Dlatego sama obecność nazwy w pamięci nie potwierdza, że menu jest otwarte. runtime.has("runtime.is_main_menu") i runtime.has("runtime.player.name") informują o dostępności poszczególnych zapytań. runtime.status(...) również podaje przyczynę.

Przykład dla src/mod.lua

Ten przykład odczytuje pamięć podręczną przy ładowaniu, a następnie co 500 ms. Wybiera nazwę zastępczą i zapisuje w logu tylko zmiany:

runtime.require("runtime.lifecycle")

local previous_message = nil

local function refresh()
    local in_menu = runtime.is_main_menu()
    local name = runtime.player.name()
    local state = "unknown"
    if in_menu == true then
        state = "menu"
    elseif in_menu == false then
        state = "other"
    end

    local message = state .. ": " .. (name or "Flameborn")
    if message ~= previous_message then
        previous_message = message
        shroudforge.log.info(message)
    end
end

return {
    on_load = refresh,
    on_update = function()
        refresh()
    end,
    update_interval_ms = 500,
}