This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Interfejs API składa się tylko z kilku funkcji:
liveupdate.add_mount()liveupdate.remove_mount()liveupdate.get_mounts().Jeśli używasz więcej niż jednego archiwum Live update, zalecamy przejść po każdym mouncie przy starcie i sprawdzić, czy nadal powinien być używany.
Jest to ważne, ponieważ zawartość może już nie być poprawna dla silnika z powodu zmian formatu plików.
local function remove_old_mounts()
local mounts = liveupdate.get_mounts() -- tabela z mountami
-- Każdy mount ma: mount.uri, mount.priority, mount.name
for _,mount in ipairs(mounts) do
-- Wymaga to, aby nazwa pliku była unikalna, dzięki czemu nie pobierzemy pliku z innego archiwum.
-- Te dane są tworzone przez twórcę gry jako sposób na określenie metadanych archiwum.
local version_data = sys.load_resource("/version_" .. mount.name .. ".json")
if version_data then
version_data = json.decode(version_data)
else
version_data = {version = 0} -- jeśli nie ma pliku wersji, prawdopodobnie jest to stare lub nieprawidłowe archiwum
end
-- Sprawdź wersję archiwum względem wersji obsługiwanej przez grę.
if version_data.version < sys.get_config_int("game.minimum_lu_version") then
-- Było nieprawidłowe, więc je odmontujemy!
liveupdate.remove_mount(mount.name)
end
end
end
Pełnomocnik kolekcji, który został wykluczony z bundlowania, działa jak zwykły pełnomocnik kolekcji, z jedną ważną różnicą. Wysłanie do niego wiadomości load, kiedy nadal ma zasoby niedostępne w magazynie bundla, spowoduje błąd.
W przepływie opartym na archiwach zwykle z góry decydujesz, którego archiwum lub archiwów potrzebuje proxy, i montujesz je przed wczytaniem. Jeśli musisz sprawdzić, czy proxy ma wykluczoną zawartość, użyj collectionproxy.get_resources().
Gdy włączona jest opcja Strip Live Update Entries from Main Manifest, domyślna przy publikowaniu archiwalnej zawartości Live Update:
collectionproxy.get_resources("#proxy") zwraca pustą tabelę {}.collectionproxy.get_resources("#proxy") zwraca niepustą tabelę hashy zasobów dla danego proxy, na przykład:{
"a1b2c3...",
"d4e5f6...",
"7890ab...",
...
}
Poniższy przykład zakłada, że zasoby są dostępne pod adresem URL podanym w ustawieniu game.http_url.
-- Musisz śledzić, które archiwum zawiera jaką zawartość
-- W tym przykładzie używamy tylko jednego archiwum liveupdate, które zawiera wszystkie brakujące zasoby.
-- Jeśli używasz wielu archiwów, musisz odpowiednio zorganizować pobieranie
local lu_infos = {
liveupdate = {
name = "liveupdate",
priority = 10,
}
}
local function get_lu_info_for_level(level_name)
if level_name == "level1" then
return lu_infos['liveupdate']
end
end
local function mount_zip(self, name, priority, path, callback)
liveupdate.add_mount(name, "zip:" .. path, priority, function(_uri, _path, _status) -- <1>
callback(_uri, _path, _status)
end)
end
local function has_mount(name)
for _, mount in ipairs(liveupdate.get_mounts()) do
if mount.name == name then
return true
end
end
return false
end
function init(self)
self.http_url = sys.get_config_string("game.http_url", nil) -- <2>
local level_name = "level1"
local info = get_lu_info_for_level(level_name) -- <3>
msg.post("#", "load_level", {level = "level1", info = info }) -- <4>
end
function on_message(self, message_id, message, sender)
if message_id == hash("load_level") then
local proxy_resources = collectionproxy.get_resources("#" .. message.level) -- <5>
-- Gdy Strip Live Update Entries from Main Manifest jest włączone, ta tabela
-- jest pusta, dopóki odpowiednie archiwum nie zostanie zamontowane. Po
-- zamontowaniu zawiera hashe zasobów należące do proxy.
if message.info and #proxy_resources == 0 and not has_mount(message.info.name) then
msg.post("#", "download_archive", message) -- <6>
else
msg.post("#" .. message.level, "load")
end
elseif message_id == hash("download_archive") then
local zip_filename = message.info.name .. ".zip"
local download_path = sys.get_save_file("mygame", zip_filename)
local url = self.http_url .. "/" .. zip_filename
-- Wykonaj żądanie. Możesz użyć poświadczeń.
http.request(url, "GET", function(self, id, response) -- <7>
if response.status == 200 or response.status == 304 then
mount_zip(self, message.info.name, message.info.priority, download_path, function(uri, path, status) -- <8>
msg.post("#", "load_level", message) -- spróbuj ponownie wczytać poziom
end)
else
print("Failed to download archive ", download_path, "from", url, ":", response.status)
end
end, nil, nil, {path=download_path})
elseif message_id == hash("proxy_loaded") then -- Poziom jest wczytany, więc możemy go włączyć.
msg.post(sender, "init")
msg.post(sender, "enable")
end
end
liveupdate.add_mount() montuje jedno archiwum, używając podanej nazwy, priorytetu i pliku zip. Dane stają się wtedy natychmiast dostępne do wczytania, bez potrzeby restartowania silnika. Informacja o mouncie jest zapisywana i zostanie automatycznie dodana ponownie przy następnym uruchomieniu silnika, więc nie trzeba wywoływać ponownie liveupdate.add_mount() dla tego samego mounta.collectionproxy.get_resources(), aby sprawdzić wykluczoną zawartość proxy. Przy domyślnie włączonym ustawieniu usuwania wpisów z manifestu zwraca {}, dopóki odpowiednie archiwum nie zostanie zamontowane, a po zamontowaniu zwraca niepustą tabelę hashy zasobów.download_path.Gdy kod wczytywania jest już gotowy, możemy przetestować aplikację. Jednak uruchamianie jej z poziomu edytora nie pobierze żadnych zasobów. Dzieje się tak dlatego, że Live update jest funkcją bundla. Gdy uruchamiasz w środowisku edytora, żadne zasoby nigdy nie są wykluczane. Aby upewnić się, że wszystko działa poprawnie, musimy utworzyć bundle.