otclient-redemption/modules/game_things/things.lua

106 lines
3.1 KiB
Lua

ThingsLoaderController = Controller:new()
local filename = nil
local loaded = false
function setFileName(name)
filename = name
end
function isLoaded()
return loaded
end
local function tryLoadDatWithFallbacks(datPath)
if g_things.loadDat(datPath) then
return true
end
local featureFlags = {
GameSpritesU32,
GameEnhancedAnimations,
GameIdleAnimations
}
local combinations = {
{ 1 }, { 2 }, { 3 },
{ 1, 2 }, { 1, 3 }, { 2, 3 },
{ 1, 2, 3 }
}
for _, combo in ipairs(combinations) do
for _, idx in ipairs(combo) do
g_game.enableFeature(featureFlags[idx])
end
if g_things.loadDat(datPath) then
return true
end
end
return false
end
local function load(version)
local errorList = {}
if version >= 1281 and not g_game.getFeature(GameLoadSprInsteadProtobuf) then
local filePath = resolvepath(string.format('/things/%d/', version))
if not g_things.loadAppearances(filePath) then
errorList[#errorList + 1] = "Couldn't load assets"
end
if not g_things.loadStaticData(filePath) then
errorList[#errorList + 1] = "Couldn't load staticdata"
end
else
local datPath, sprPath
if filename then
datPath = resolvepath('/data/things/' .. filename)
sprPath = resolvepath('/data/things/' .. filename)
else
datPath = resolvepath('/data/things/' .. version .. '/Tibia')
sprPath = resolvepath('/data/things/' .. version .. '/Tibia')
end
g_logger.setLevel(5)
if not tryLoadDatWithFallbacks(datPath) then
errorList[#errorList + 1] = tr('Unable to load dat file, please place a valid dat in \'%s.dat\'', datPath)
end
g_logger.setLevel(1)
if not g_sprites.loadSpr(sprPath) then
errorList[#errorList + 1] = tr('Unable to load spr file, please place a valid spr in \'%s.spr\'', sprPath)
end
if g_game.getFeature(GameLoadSprInsteadProtobuf) and version >= 1281 then
local staticPath = resolvepath(string.format('/things/%d/appearances', version))
if not g_things.loadAppearances(staticPath) then
g_logger.warning(string.format(
"[game_things.load()] Couldn't load /things/%d/appearances.dat, possible packets error.", version))
end
end
end
loaded = #errorList == 0
if loaded then
-- loading client files was successful, try to load sounds now
-- sound files are optional, this means that failing to load them
-- will not block logging into game
g_sounds.loadClientFiles(resolvepath(string.format('/sounds/%d/', version)))
return
end
local messageBox = displayErrorBox(tr('Error'), table.concat(errorList, "\n"))
addEvent(function()
messageBox:raise()
messageBox:focus()
end)
g_game.setClientVersion(0)
g_game.setProtocolVersion(0)
end
function ThingsLoaderController:onInit()
self:registerEvents(g_game, {
onClientVersionChange = load
})
end