mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-30 19:29:21 +02:00
160 lines
4.0 KiB
Lua
160 lines
4.0 KiB
Lua
local settings = {}
|
|
ChangedProfile = false
|
|
|
|
function init()
|
|
connect(g_game, {
|
|
onGameStart = online,
|
|
onGameEnd = offline
|
|
})
|
|
|
|
end
|
|
|
|
function terminate()
|
|
disconnect(g_game, {
|
|
onGameStart = online,
|
|
onGameEnd = offline
|
|
})
|
|
end
|
|
|
|
-- loads settings on character login
|
|
function online()
|
|
ChangedProfile = false
|
|
|
|
-- startup arguments has higher priority than settings
|
|
local index = getProfileFromStartupArgument()
|
|
if index then
|
|
setProfileOption(index)
|
|
end
|
|
|
|
load()
|
|
|
|
if not index then
|
|
setProfileOption(getProfileFromSettings() or 1)
|
|
end
|
|
|
|
-- create main settings dir
|
|
if not g_resources.directoryExists("/settings/") then
|
|
g_resources.makeDir("/settings/")
|
|
end
|
|
|
|
-- create profiles dirs
|
|
for i=1,10 do
|
|
local path = "/settings/profile_"..i
|
|
|
|
if not g_resources.directoryExists(path) then
|
|
g_resources.makeDir(path)
|
|
end
|
|
end
|
|
end
|
|
|
|
function setProfileOption(index)
|
|
local currentProfile = g_settings.getNumber('profile')
|
|
currentProfile = tostring(currentProfile)
|
|
index = tostring(index)
|
|
|
|
if currentProfile ~= index then
|
|
ChangedProfile = true
|
|
return modules.client_options.setOption('profile', index)
|
|
end
|
|
|
|
end
|
|
|
|
-- load profile number from settings
|
|
function getProfileFromSettings()
|
|
-- settings should save per character, return if not online
|
|
if not g_game.isOnline() then return end
|
|
|
|
local index = g_game.getCharacterName()
|
|
local savedData = settings[index]
|
|
|
|
return savedData
|
|
end
|
|
|
|
-- option to launch client with hardcoded profile
|
|
function getProfileFromStartupArgument()
|
|
local startupOptions = string.split(g_app.getStartupOptions(), " ")
|
|
if #startupOptions < 2 then
|
|
return false
|
|
end
|
|
|
|
for index, option in ipairs(startupOptions) do
|
|
if option == "--profile" then
|
|
local profileIndex = startupOptions[index + 1]
|
|
if profileIndex == nil then
|
|
return g_logger.info("Startup arguments incomplete: missing profile index.")
|
|
end
|
|
|
|
g_logger.info("Startup options: Forced profile: "..profileIndex)
|
|
-- set value in options
|
|
return profileIndex
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
-- returns string path ie. "/settings/1/actionbar.json"
|
|
function getSettingsFilePath(fileNameWithFormat)
|
|
local currentProfile = g_settings.getNumber('profile')
|
|
|
|
return "/settings/profile_"..currentProfile.."/"..fileNameWithFormat
|
|
end
|
|
|
|
function offline()
|
|
onProfileChange(true)
|
|
end
|
|
|
|
-- profile change callback (called in options), saves settings & reloads given module configs
|
|
function onProfileChange(offline)
|
|
if not offline then
|
|
if not g_game.isOnline() then return end
|
|
-- had to apply some delay
|
|
scheduleEvent(collectiveReload, 100)
|
|
end
|
|
|
|
local currentProfile = g_settings.getNumber('profile')
|
|
local index = g_game.getCharacterName()
|
|
|
|
if index then
|
|
settings[index] = currentProfile
|
|
save()
|
|
end
|
|
end
|
|
|
|
-- collection of refresh functions from different modules
|
|
function collectiveReload()
|
|
modules.game_topbar.refresh(true)
|
|
modules.game_actionbar.refresh(true)
|
|
modules.game_bot.refresh()
|
|
end
|
|
|
|
-- json handlers
|
|
function load()
|
|
local file = "/settings/profiles.json"
|
|
if g_resources.fileExists(file) then
|
|
local status, result = pcall(function()
|
|
return json.decode(g_resources.readFileContents(file))
|
|
end)
|
|
if not status then
|
|
return onError(
|
|
"Error while reading profiles file. To fix this problem you can delete storage.json. Details: " ..
|
|
result)
|
|
end
|
|
settings = result
|
|
end
|
|
end
|
|
|
|
function save()
|
|
local file = "/settings/profiles.json"
|
|
local status, result = pcall(function() return json.encode(settings, 2) end)
|
|
if not status then
|
|
return onError(
|
|
"Error while saving profile settings. Data won't be saved. Details: " ..
|
|
result)
|
|
end
|
|
if result:len() > 100 * 1024 * 1024 then
|
|
return onError(
|
|
"Something went wrong, file is above 100MB, won't be saved")
|
|
end
|
|
g_resources.writeFileContents(file, result)
|
|
end |