Modding
More actions
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,
}