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('/data/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 if g_game.getFeature(GameProficiency) and not g_things.resolveProficienciesFile(filePath) then g_logger.warning(string.format( "[game_things.load()] Couldn't load /data/things/%d/proficiencies-.json", version)) 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('/data/things/%d/appearances', version)) if not g_things.loadAppearances(staticPath) then g_logger.warning(string.format( "[game_things.load()] Couldn't load /data/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('/data/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