mirror of
https://github.com/OTCv8/otclientv8.git
synced 2025-04-29 18:59:20 +02:00
1326 lines
36 KiB
Lua
1326 lines
36 KiB
Lua
local window = nil
|
|
|
|
local appearanceGroup = nil
|
|
local colorModeGroup = nil
|
|
local colorBoxGroup = nil
|
|
|
|
local floor = nil
|
|
local movementCheck = nil
|
|
local showFloorCheck = nil
|
|
local showOutfitCheck = nil
|
|
local showMountCheck = nil
|
|
local showWingsCheck = nil
|
|
local showAuraCheck = nil
|
|
local showShaderCheck = nil
|
|
local showBarsCheck = nil
|
|
|
|
local colorBoxes = {}
|
|
local currentColorBox = nil
|
|
|
|
ignoreNextOutfitWindow = 0
|
|
local floorTiles = 7
|
|
local settingsFile = "/settings/outfit.json"
|
|
local settings = {}
|
|
|
|
local tempOutfit = {}
|
|
local ServerData = {
|
|
currentOutfit = {},
|
|
outfits = {},
|
|
mounts = {},
|
|
wings = {},
|
|
auras = {},
|
|
shaders = {},
|
|
healthBars = {},
|
|
manaBars = {}
|
|
}
|
|
|
|
local AppearanceData = {
|
|
"preset",
|
|
"outfit",
|
|
"mount",
|
|
"wings",
|
|
"aura",
|
|
"shader",
|
|
"healthBar",
|
|
"manaBar"
|
|
}
|
|
|
|
function init()
|
|
connect(
|
|
g_game,
|
|
{
|
|
onOpenOutfitWindow = create,
|
|
onGameEnd = destroy
|
|
}
|
|
)
|
|
end
|
|
|
|
function terminate()
|
|
disconnect(
|
|
g_game,
|
|
{
|
|
onOpenOutfitWindow = create,
|
|
onGameEnd = destroy
|
|
}
|
|
)
|
|
destroy()
|
|
end
|
|
|
|
function onMovementChange(checkBox, checked)
|
|
previewCreature:setAnimate(checked)
|
|
settings.movement = checked
|
|
end
|
|
|
|
function onShowFloorChange(checkBox, checked)
|
|
if checked then
|
|
floor:show()
|
|
|
|
-- Magic!
|
|
local delay = 50
|
|
periodicalEvent(
|
|
function()
|
|
if movementCheck:isChecked() then
|
|
local direction = previewCreature:getDirection()
|
|
if direction == Directions.North then
|
|
local newMargin = floor:getMarginTop() + 8
|
|
floor:setMarginTop(newMargin)
|
|
if newMargin >= 96 then
|
|
for i = 1, floorTiles do
|
|
floor:moveChildToIndex(floor:getChildByIndex(floorTiles * floorTiles), 1)
|
|
end
|
|
floor:setMarginTop(32)
|
|
end
|
|
elseif direction == Directions.South then
|
|
local newMargin = floor:getMarginBottom() + 8
|
|
floor:setMarginBottom(newMargin)
|
|
if newMargin >= 64 then
|
|
for i = 1, floorTiles do
|
|
floor:moveChildToIndex(floor:getChildByIndex(1), floorTiles * floorTiles)
|
|
end
|
|
floor:setMarginBottom(0)
|
|
end
|
|
elseif direction == Directions.East then
|
|
local newMargin = floor:getMarginRight() + 8
|
|
floor:setMarginRight(newMargin)
|
|
if newMargin >= 64 then
|
|
for i = 1, floorTiles do
|
|
local sprites = {}
|
|
local startIndex = 1 + ((i - 1) * floorTiles)
|
|
local endIndex = i * floorTiles
|
|
|
|
for k = startIndex, endIndex do
|
|
sprites[#sprites + 1] = floor:getChildByIndex(k):getSpriteId()
|
|
end
|
|
|
|
table.insert(sprites, #sprites, table.remove(sprites, 1))
|
|
|
|
local sid = 1
|
|
for k = startIndex, endIndex do
|
|
floor:getChildByIndex(k):setSpriteId(sprites[sid])
|
|
sid = sid + 1
|
|
end
|
|
end
|
|
floor:setMarginRight(0)
|
|
end
|
|
elseif direction == Directions.West then
|
|
local newMargin = floor:getMarginLeft() + 8
|
|
floor:setMarginLeft(newMargin)
|
|
if newMargin >= 64 then
|
|
for i = 1, floorTiles do
|
|
local sprites = {}
|
|
local startIndex = 1 + ((i - 1) * floorTiles)
|
|
local endIndex = i * floorTiles
|
|
|
|
for k = startIndex, endIndex do
|
|
sprites[#sprites + 1] = floor:getChildByIndex(k):getSpriteId()
|
|
end
|
|
|
|
table.insert(sprites, 1, table.remove(sprites, #sprites))
|
|
|
|
local sid = 1
|
|
for k = startIndex, endIndex do
|
|
floor:getChildByIndex(k):setSpriteId(sprites[sid])
|
|
sid = sid + 1
|
|
end
|
|
end
|
|
floor:setMarginLeft(0)
|
|
end
|
|
end
|
|
else
|
|
floor:setMargin(0)
|
|
end
|
|
end,
|
|
function()
|
|
return window and floor and showFloorCheck:isChecked()
|
|
end,
|
|
delay,
|
|
delay
|
|
)
|
|
else
|
|
floor:hide()
|
|
end
|
|
|
|
settings.showFloor = checked
|
|
end
|
|
|
|
function onShowMountChange(checkBox, checked)
|
|
settings.showMount = checked
|
|
updatePreview()
|
|
end
|
|
|
|
function onShowOutfitChange(checkBox, checked)
|
|
settings.showOutfit = checked
|
|
showMountCheck:setEnabled(settings.showOutfit)
|
|
showWingsCheck:setEnabled(settings.showOutfit)
|
|
showAuraCheck:setEnabled(settings.showOutfit)
|
|
showShaderCheck:setEnabled(settings.showOutfit)
|
|
showBarsCheck:setEnabled(settings.showOutfit)
|
|
updatePreview()
|
|
end
|
|
|
|
function onShowAuraChange(checkBox, checked)
|
|
settings.showAura = checked
|
|
updatePreview()
|
|
end
|
|
|
|
function onShowWingsChange(checkBox, checked)
|
|
settings.showWings = checked
|
|
updatePreview()
|
|
end
|
|
|
|
function onShowShaderChange(checkBox, checked)
|
|
settings.showShader = checked
|
|
updatePreview()
|
|
end
|
|
|
|
function onShowBarsChange(checkBox, checked)
|
|
settings.showBars = checked
|
|
updatePreview()
|
|
end
|
|
|
|
local PreviewOptions = {
|
|
["showFloor"] = onShowFloorChange,
|
|
["showOutfit"] = onShowOutfitChange,
|
|
["showMount"] = onShowMountChange,
|
|
["showWings"] = onShowWingsChange,
|
|
["showAura"] = onShowAuraChange,
|
|
["showShader"] = onShowShaderChange,
|
|
["showBars"] = onShowBarsChange
|
|
}
|
|
|
|
function create(currentOutfit, outfitList, mountList, wingList, auraList, shaderList, healthBarList, manaBarList)
|
|
if ignoreNextOutfitWindow and g_clock.millis() < ignoreNextOutfitWindow + 1000 then
|
|
return
|
|
end
|
|
|
|
if window then
|
|
destroy()
|
|
end
|
|
|
|
if currentOutfit.shader == "" then
|
|
currentOutfit.shader = "outfit_default"
|
|
end
|
|
|
|
loadSettings()
|
|
|
|
ServerData = {
|
|
currentOutfit = currentOutfit,
|
|
outfits = outfitList,
|
|
mounts = mountList,
|
|
wings = wingList,
|
|
auras = auraList,
|
|
shaders = shaderList,
|
|
healthBars = healthBarList,
|
|
manaBars = manaBarList
|
|
}
|
|
|
|
window = g_ui.displayUI("outfitwindow")
|
|
|
|
floor = window.preview.panel.floor
|
|
for i = 1, floorTiles * floorTiles do
|
|
local tile = g_ui.createWidget("UISprite", floor)
|
|
tile:setSpriteId(math.random(10057, 10064))
|
|
end
|
|
floor:hide()
|
|
|
|
for _, appKey in ipairs(AppearanceData) do
|
|
updateAppearanceText(appKey, "None")
|
|
end
|
|
|
|
previewCreature = window.preview.panel.creature
|
|
|
|
if settings.currentPreset > 0 then
|
|
local preset = settings.presets[settings.currentPreset]
|
|
tempOutfit = table.copy(preset.outfit)
|
|
|
|
updateAppearanceText("preset", preset.title)
|
|
else
|
|
tempOutfit = currentOutfit
|
|
end
|
|
|
|
updatePreview()
|
|
|
|
updateAppearanceTexts(currentOutfit)
|
|
|
|
local isMount = g_game.getLocalPlayer():isMounted()
|
|
if isMount then
|
|
window.configure.mount.check:setEnabled(true)
|
|
window.configure.mount.check:setChecked(true)
|
|
else
|
|
window.configure.mount.check:setEnabled(currentOutfit.mount > 0)
|
|
window.configure.mount.check:setChecked(isMount and currentOutfit.mount > 0)
|
|
end
|
|
|
|
if currentOutfit.addons == 3 then
|
|
window.configure.addon1.check:setChecked(true)
|
|
window.configure.addon2.check:setChecked(true)
|
|
elseif currentOutfit.addons == 2 then
|
|
window.configure.addon1.check:setChecked(false)
|
|
window.configure.addon2.check:setChecked(true)
|
|
elseif currentOutfit.addons == 1 then
|
|
window.configure.addon1.check:setChecked(true)
|
|
window.configure.addon2.check:setChecked(false)
|
|
end
|
|
window.configure.addon1.check.onCheckChange = onAddonChange
|
|
window.configure.addon2.check.onCheckChange = onAddonChange
|
|
|
|
configureAddons(currentOutfit.addons)
|
|
|
|
movementCheck = window.preview.panel.movement
|
|
showFloorCheck = window.preview.options.showFloor.check
|
|
showOutfitCheck = window.preview.options.showOutfit.check
|
|
showMountCheck = window.preview.options.showMount.check
|
|
showWingsCheck = window.preview.options.showWings.check
|
|
showAuraCheck = window.preview.options.showAura.check
|
|
showShaderCheck = window.preview.options.showShader.check
|
|
showBarsCheck = window.preview.options.showBars.check
|
|
|
|
movementCheck.onCheckChange = onMovementChange
|
|
for _, option in ipairs(window.preview.options:getChildren()) do
|
|
option.check.onCheckChange = PreviewOptions[option:getId()]
|
|
end
|
|
|
|
movementCheck:setChecked(settings.movement)
|
|
showFloorCheck:setChecked(settings.showFloor)
|
|
|
|
if not settings.showOutfit then
|
|
showMountCheck:setEnabled(false)
|
|
showWingsCheck:setEnabled(false)
|
|
showAuraCheck:setEnabled(false)
|
|
showShaderCheck:setEnabled(false)
|
|
showBarsCheck:setEnabled(false)
|
|
end
|
|
|
|
showOutfitCheck:setChecked(settings.showOutfit)
|
|
showMountCheck:setChecked(settings.showMount)
|
|
showWingsCheck:setChecked(settings.showWings)
|
|
showAuraCheck:setChecked(settings.showAura)
|
|
showShaderCheck:setChecked(settings.showShader)
|
|
showBarsCheck:setChecked(settings.showBars)
|
|
|
|
colorBoxGroup = UIRadioGroup.create()
|
|
for j = 0, 6 do
|
|
for i = 0, 18 do
|
|
local colorBox = g_ui.createWidget("ColorBox", window.appearance.colorBoxPanel)
|
|
local outfitColor = getOutfitColor(j * 19 + i)
|
|
colorBox:setImageColor(outfitColor)
|
|
colorBox:setId("colorBox" .. j * 19 + i)
|
|
colorBox.colorId = j * 19 + i
|
|
|
|
if colorBox.colorId == currentOutfit.head then
|
|
currentColorBox = colorBox
|
|
colorBox:setChecked(true)
|
|
end
|
|
colorBoxGroup:addWidget(colorBox)
|
|
end
|
|
end
|
|
|
|
colorBoxGroup.onSelectionChange = onColorCheckChange
|
|
|
|
appearanceGroup = UIRadioGroup.create()
|
|
appearanceGroup:addWidget(window.appearance.settings.preset.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.outfit.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.mount.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.aura.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.wings.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.shader.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.healthBar.check)
|
|
appearanceGroup:addWidget(window.appearance.settings.manaBar.check)
|
|
|
|
appearanceGroup.onSelectionChange = onAppearanceChange
|
|
appearanceGroup:selectWidget(window.appearance.settings.preset.check)
|
|
|
|
colorModeGroup = UIRadioGroup.create()
|
|
colorModeGroup:addWidget(window.appearance.colorMode.head)
|
|
colorModeGroup:addWidget(window.appearance.colorMode.primary)
|
|
colorModeGroup:addWidget(window.appearance.colorMode.secondary)
|
|
colorModeGroup:addWidget(window.appearance.colorMode.detail)
|
|
|
|
colorModeGroup.onSelectionChange = onColorModeChange
|
|
colorModeGroup:selectWidget(window.appearance.colorMode.head)
|
|
|
|
window.preview.options.showMount:setVisible(g_game.getFeature(GamePlayerMounts))
|
|
window.preview.options.showWings:setVisible(g_game.getFeature(GameWingsAndAura))
|
|
window.preview.options.showAura:setVisible(g_game.getFeature(GameWingsAndAura))
|
|
window.preview.options.showShader:setVisible(g_game.getFeature(GameOutfitShaders))
|
|
|
|
window.appearance.settings.mount:setVisible(g_game.getFeature(GamePlayerMounts))
|
|
window.appearance.settings.wings:setVisible(g_game.getFeature(GameWingsAndAura))
|
|
window.appearance.settings.aura:setVisible(g_game.getFeature(GameWingsAndAura))
|
|
window.appearance.settings.shader:setVisible(g_game.getFeature(GameOutfitShaders))
|
|
window.appearance.settings.healthBar:setVisible(g_game.getFeature(GameHealthInfoBackground))
|
|
window.appearance.settings.manaBar:setVisible(g_game.getFeature(GameHealthInfoBackground))
|
|
|
|
window.configure.mount:setVisible(g_game.getFeature(GamePlayerMounts))
|
|
end
|
|
|
|
function destroy()
|
|
if window then
|
|
window:destroy()
|
|
window = nil
|
|
|
|
floor = nil
|
|
movementCheck = nil
|
|
showFloorCheck = nil
|
|
showOutfitCheck = nil
|
|
showMountCheck = nil
|
|
showWingsCheck = nil
|
|
showAuraCheck = nil
|
|
showShaderCheck = nil
|
|
showBarsCheck = nil
|
|
|
|
colorBoxes = {}
|
|
currentColorBox = nil
|
|
|
|
appearanceGroup:destroy()
|
|
appearanceGroup = nil
|
|
colorModeGroup:destroy()
|
|
colorModeGroup = nil
|
|
colorBoxGroup:destroy()
|
|
colorBoxGroup = nil
|
|
|
|
ServerData = {
|
|
currentOutfit = {},
|
|
outfits = {},
|
|
mounts = {},
|
|
wings = {},
|
|
auras = {},
|
|
shaders = {},
|
|
healthBars = {},
|
|
manaBars = {}
|
|
}
|
|
|
|
saveSettings()
|
|
settings = {}
|
|
end
|
|
end
|
|
|
|
function configureAddons(addons)
|
|
local hasAddon1 = addons == 1 or addons == 3
|
|
local hasAddon2 = addons == 2 or addons == 3
|
|
window.configure.addon1.check:setEnabled(hasAddon1)
|
|
window.configure.addon2.check:setEnabled(hasAddon2)
|
|
|
|
window.configure.addon1.check.onCheckChange = nil
|
|
window.configure.addon2.check.onCheckChange = nil
|
|
window.configure.addon1.check:setChecked(false)
|
|
window.configure.addon2.check:setChecked(false)
|
|
if tempOutfit.addons == 3 then
|
|
window.configure.addon1.check:setChecked(true)
|
|
window.configure.addon2.check:setChecked(true)
|
|
elseif tempOutfit.addons == 2 then
|
|
window.configure.addon1.check:setChecked(false)
|
|
window.configure.addon2.check:setChecked(true)
|
|
elseif tempOutfit.addons == 1 then
|
|
window.configure.addon1.check:setChecked(true)
|
|
window.configure.addon2.check:setChecked(false)
|
|
end
|
|
window.configure.addon1.check.onCheckChange = onAddonChange
|
|
window.configure.addon2.check.onCheckChange = onAddonChange
|
|
end
|
|
|
|
function newPreset()
|
|
if not settings.presets then
|
|
settings.presets = {}
|
|
end
|
|
|
|
local presetWidget = g_ui.createWidget("PresetButton", window.presetsList)
|
|
local presetId = #settings.presets + 1
|
|
presetWidget:setId(presetId)
|
|
presetWidget.title:setText("New Preset")
|
|
local outfitCopy = table.copy(tempOutfit)
|
|
presetWidget.creature:setOutfit(outfitCopy)
|
|
presetWidget.creature:setCenter(true)
|
|
|
|
settings.presets[presetId] = {
|
|
title = "New Preset",
|
|
outfit = outfitCopy,
|
|
mounted = window.configure.mount.check:isChecked()
|
|
}
|
|
|
|
presetWidget:focus()
|
|
window.presetsList:ensureChildVisible(presetWidget, {x = 0, y = 196})
|
|
end
|
|
|
|
function deletePreset()
|
|
local presetId = settings.currentPreset
|
|
if presetId == 0 then
|
|
local focused = window.presetsList:getFocusedChild()
|
|
if focused then
|
|
presetId = tonumber(focused:getId())
|
|
end
|
|
end
|
|
|
|
if not presetId or presetId == 0 then
|
|
return
|
|
end
|
|
|
|
table.remove(settings.presets, presetId)
|
|
window.presetsList[presetId]:destroy()
|
|
settings.currentPreset = 0
|
|
local newId = 1
|
|
for _, child in ipairs(window.presetsList:getChildren()) do
|
|
child:setId(newId)
|
|
newId = newId + 1
|
|
end
|
|
updateAppearanceText("preset", "None")
|
|
end
|
|
|
|
function savePreset()
|
|
local presetId = settings.currentPreset
|
|
if presetId == 0 then
|
|
local focused = window.presetsList:getFocusedChild()
|
|
if focused then
|
|
presetId = tonumber(focused:getId())
|
|
end
|
|
end
|
|
|
|
if not presetId or presetId == 0 then
|
|
return
|
|
end
|
|
|
|
local outfitCopy = table.copy(tempOutfit)
|
|
window.presetsList[presetId].creature:setOutfit(outfitCopy)
|
|
window.presetsList[presetId].creature:setCenter(true)
|
|
settings.presets[presetId].outfit = outfitCopy
|
|
settings.presets[presetId].mounted = window.configure.mount.check:isChecked()
|
|
settings.currentPreset = presetId
|
|
end
|
|
|
|
function renamePreset()
|
|
local presetId = settings.currentPreset
|
|
if presetId == 0 then
|
|
local focused = window.presetsList:getFocusedChild()
|
|
if focused then
|
|
presetId = tonumber(focused:getId())
|
|
end
|
|
end
|
|
|
|
if not presetId or presetId == 0 then
|
|
return
|
|
end
|
|
|
|
local presetWidget = window.presetsList[presetId]
|
|
presetWidget.title:hide()
|
|
presetWidget.rename.input:setText("")
|
|
presetWidget.rename.save.onClick = function()
|
|
saveRename(presetId)
|
|
end
|
|
presetWidget.rename:show()
|
|
end
|
|
|
|
function saveRename(presetId)
|
|
local presetWidget = window.presetsList[presetId]
|
|
if not presetWidget then
|
|
return
|
|
end
|
|
|
|
local newTitle = presetWidget.rename.input:getText():trim()
|
|
presetWidget.rename.input:setText("")
|
|
presetWidget.rename:hide()
|
|
presetWidget.title:setText(newTitle)
|
|
presetWidget.title:show()
|
|
settings.presets[presetId].title = newTitle
|
|
|
|
if presetId == settings.currentPreset then
|
|
updateAppearanceText("preset", newTitle)
|
|
end
|
|
end
|
|
|
|
function onAppearanceChange(widget, selectedWidget)
|
|
local id = selectedWidget:getParent():getId()
|
|
if id == "preset" then
|
|
showPresets()
|
|
elseif id == "outfit" then
|
|
showOutfits()
|
|
elseif id == "mount" then
|
|
showMounts()
|
|
elseif id == "aura" then
|
|
showAuras()
|
|
elseif id == "wings" then
|
|
showWings()
|
|
elseif id == "shader" then
|
|
showShaders()
|
|
elseif id == "healthBar" then
|
|
showHealthBars()
|
|
elseif id == "manaBar" then
|
|
showManaBars()
|
|
end
|
|
end
|
|
|
|
function showPresets()
|
|
window.listSearch:hide()
|
|
window.selectionList:hide()
|
|
window.selectionScroll:hide()
|
|
|
|
local focused = nil
|
|
if window.presetsList:getChildCount() == 0 and settings.presets then
|
|
for presetId, preset in ipairs(settings.presets) do
|
|
local presetWidget = g_ui.createWidget("PresetButton", window.presetsList)
|
|
presetWidget:setId(presetId)
|
|
presetWidget.title:setText(preset.title)
|
|
presetWidget.creature:setOutfit(preset.outfit)
|
|
presetWidget.creature:setCenter(true)
|
|
if presetId == settings.currentPreset then
|
|
focused = presetId
|
|
end
|
|
end
|
|
end
|
|
|
|
if focused then
|
|
local w = window.presetsList[focused]
|
|
w:focus()
|
|
window.presetsList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.presetsList.onChildFocusChange = onPresetSelect
|
|
window.presetsList:show()
|
|
window.presetsScroll:show()
|
|
window.presetButtons:show()
|
|
end
|
|
|
|
function showOutfits()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
for _, outfitData in ipairs(ServerData.outfits) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(outfitData[1])
|
|
|
|
local outfit = table.copy(previewCreature:getOutfit())
|
|
outfit.type = outfitData[1]
|
|
outfit.addons = outfitData[3]
|
|
outfit.mount = 0
|
|
outfit.aura = 0
|
|
outfit.wings = 0
|
|
outfit.shader = "outfit_default"
|
|
outfit.healthBar = 0
|
|
outfit.manaBar = 0
|
|
button.outfit:setOutfit(outfit)
|
|
button.outfit:setCenter(true)
|
|
button.name:setText(outfitData[2])
|
|
if tempOutfit.type == outfitData[1] then
|
|
focused = outfitData[1]
|
|
configureAddons(outfitData[3])
|
|
end
|
|
end
|
|
|
|
if focused then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onOutfitSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showMounts()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
for _, mountData in ipairs(ServerData.mounts) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(mountData[1])
|
|
|
|
button.outfit:setOutfit({type = mountData[1]})
|
|
button.outfit:setCenter(true)
|
|
button.name:setText(mountData[2])
|
|
if tempOutfit.mount == mountData[1] then
|
|
focused = mountData[1]
|
|
end
|
|
end
|
|
|
|
window.configure.mount.check:setEnabled(focused)
|
|
window.configure.mount.check:setChecked(g_game.getLocalPlayer():isMounted() and focused)
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onMountSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showAuras()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId("0")
|
|
|
|
button.outfit:setOutfit({type = 0})
|
|
button.name:setText("None")
|
|
if tempOutfit.aura == 0 then
|
|
focused = 0
|
|
end
|
|
end
|
|
|
|
for _, auraData in ipairs(ServerData.auras) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(auraData[1])
|
|
|
|
button.outfit:setOutfit({type = auraData[1]})
|
|
button.outfit:setAnimate(true)
|
|
button.name:setText(auraData[2])
|
|
if tempOutfit.aura == auraData[1] then
|
|
focused = auraData[1]
|
|
end
|
|
end
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onAuraSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showWings()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId("0")
|
|
|
|
button.outfit:setOutfit({type = 0})
|
|
button.name:setText("None")
|
|
if tempOutfit.wings == 0 then
|
|
focused = 0
|
|
end
|
|
end
|
|
|
|
for _, wingsData in ipairs(ServerData.wings) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(wingsData[1])
|
|
|
|
button.outfit:setOutfit({type = wingsData[1]})
|
|
button.outfit:setAnimate(true)
|
|
button.name:setText(wingsData[2])
|
|
if tempOutfit.wings == wingsData[1] then
|
|
focused = wingsData[1]
|
|
end
|
|
end
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onWingsSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showShaders()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId("outfit_default")
|
|
|
|
button.outfit:setOutfit({type = tempOutfit.type, addons = tempOutfit.addons, shader = "outfit_default"})
|
|
button.name:setText("None")
|
|
if tempOutfit.shader == "outfit_default" then
|
|
focused = "outfit_default"
|
|
end
|
|
end
|
|
|
|
for _, shaderData in ipairs(ServerData.shaders) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(shaderData[2])
|
|
|
|
button.outfit:setOutfit({type = tempOutfit.type, addons = tempOutfit.addons, shader = shaderData[2]})
|
|
button.outfit:setCenter(true)
|
|
button.name:setText(shaderData[2])
|
|
if tempOutfit.shader == shaderData[2] then
|
|
focused = shaderData[2]
|
|
end
|
|
end
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onShaderSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showHealthBars()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId("0")
|
|
|
|
button.outfit:hide()
|
|
button.name:setText("None")
|
|
if tempOutfit.healthBar == 0 then
|
|
focused = 0
|
|
end
|
|
end
|
|
|
|
for _, barData in ipairs(ServerData.healthBars) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(barData[1])
|
|
|
|
button.outfit:hide()
|
|
|
|
button.bar:setImageSource(g_healthBars.getHealthBarPath(barData[1]))
|
|
button.bar:show()
|
|
|
|
button.name:setText(barData[2])
|
|
if tempOutfit.healthBar == barData[1] then
|
|
focused = barData[1]
|
|
end
|
|
end
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onHealthBarSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function showManaBars()
|
|
window.presetsList:hide()
|
|
window.presetsScroll:hide()
|
|
window.presetButtons:hide()
|
|
|
|
window.selectionList.onChildFocusChange = nil
|
|
window.selectionList:destroyChildren()
|
|
|
|
local focused = nil
|
|
do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId("0")
|
|
|
|
button.outfit:hide()
|
|
button.name:setText("None")
|
|
if tempOutfit.manaBar == 0 then
|
|
focused = 0
|
|
end
|
|
end
|
|
|
|
for _, barData in ipairs(ServerData.manaBars) do
|
|
local button = g_ui.createWidget("SelectionButton", window.selectionList)
|
|
button:setId(barData[1])
|
|
|
|
button.outfit:hide()
|
|
|
|
button.bar:setImageSource(g_healthBars.getManaBarPath(barData[1]))
|
|
button.bar:show()
|
|
|
|
button.name:setText(barData[2])
|
|
if tempOutfit.manaBar == barData[1] then
|
|
focused = barData[1]
|
|
end
|
|
end
|
|
|
|
if focused ~= nil then
|
|
local w = window.selectionList[focused]
|
|
w:focus()
|
|
window.selectionList:ensureChildVisible(w, {x = 0, y = 196})
|
|
end
|
|
|
|
window.selectionList.onChildFocusChange = onManaBarSelect
|
|
window.selectionList:show()
|
|
window.selectionScroll:show()
|
|
window.listSearch:show()
|
|
end
|
|
|
|
function onPresetSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local presetId = tonumber(focusedChild:getId())
|
|
local preset = settings.presets[presetId]
|
|
tempOutfit = table.copy(preset.outfit)
|
|
|
|
for _, outfitData in ipairs(ServerData.outfits) do
|
|
if tempOutfit.type == outfitData[1] then
|
|
configureAddons(outfitData[3])
|
|
break
|
|
end
|
|
end
|
|
|
|
window.configure.mount.check:setChecked(preset.mounted and tempOutfit.mount > 0)
|
|
|
|
settings.currentPreset = presetId
|
|
|
|
updatePreview()
|
|
|
|
updateAppearanceTexts(tempOutfit)
|
|
updateAppearanceText("preset", preset.title)
|
|
end
|
|
end
|
|
|
|
function onOutfitSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local outfitType = tonumber(focusedChild:getId())
|
|
local outfit = focusedChild.outfit:getOutfit()
|
|
tempOutfit.type = outfit.type
|
|
tempOutfit.addons = outfit.addons
|
|
|
|
deselectPreset()
|
|
|
|
configureAddons(outfit.addons)
|
|
|
|
if showOutfitCheck:isChecked() then
|
|
updatePreview()
|
|
end
|
|
updateAppearanceText("outfit", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onMountSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local mountType = tonumber(focusedChild:getId())
|
|
tempOutfit.mount = mountType
|
|
|
|
deselectPreset()
|
|
|
|
if showMountCheck:isChecked() then
|
|
updatePreview()
|
|
end
|
|
|
|
window.configure.mount.check:setEnabled(tempOutfit.mount > 0)
|
|
window.configure.mount.check:setChecked(g_game.getLocalPlayer():isMounted() and tempOutfit.mount > 0)
|
|
|
|
updateAppearanceText("mount", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onAuraSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local auraType = tonumber(focusedChild:getId())
|
|
tempOutfit.aura = auraType
|
|
updatePreview()
|
|
|
|
deselectPreset()
|
|
|
|
updateAppearanceText("aura", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onWingsSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local wingsType = tonumber(focusedChild:getId())
|
|
tempOutfit.wings = wingsType
|
|
updatePreview()
|
|
|
|
deselectPreset()
|
|
|
|
updateAppearanceText("wings", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onShaderSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local shaderType = focusedChild:getId()
|
|
tempOutfit.shader = shaderType
|
|
updatePreview()
|
|
|
|
deselectPreset()
|
|
|
|
updateAppearanceText("shader", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onHealthBarSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local barType = tonumber(focusedChild:getId())
|
|
tempOutfit.healthBar = barType
|
|
updatePreview()
|
|
|
|
deselectPreset()
|
|
|
|
updateAppearanceText("healthBar", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function onManaBarSelect(list, focusedChild, unfocusedChild, reason)
|
|
if focusedChild then
|
|
local barType = tonumber(focusedChild:getId())
|
|
tempOutfit.manaBar = barType
|
|
updatePreview()
|
|
|
|
deselectPreset()
|
|
|
|
updateAppearanceText("manaBar", focusedChild.name:getText())
|
|
end
|
|
end
|
|
|
|
function updateAppearanceText(widget, text)
|
|
window.appearance.settings[widget].name:setText(text)
|
|
end
|
|
|
|
function updateAppearanceTexts(outfit)
|
|
for _, appKey in ipairs(AppearanceData) do
|
|
updateAppearanceText(appKey, "None")
|
|
end
|
|
|
|
for key, value in pairs(outfit) do
|
|
local newKey = key
|
|
local appKey = key
|
|
if key == "type" then
|
|
newKey = "outfits"
|
|
appKey = "outfit"
|
|
elseif key == "wings" then
|
|
newKey = "wings"
|
|
appKey = "wings"
|
|
else
|
|
newKey = key .. "s"
|
|
appKey = key
|
|
end
|
|
local dataTable = ServerData[newKey]
|
|
if dataTable then
|
|
for _, data in ipairs(dataTable) do
|
|
if outfit[key] == data[1] or outfit[key] == data[2] then
|
|
updateAppearanceText(appKey, data[2])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function deselectPreset()
|
|
settings.currentPreset = 0
|
|
end
|
|
|
|
function onAddonChange(widget, checked)
|
|
local addonId = widget:getParent():getId()
|
|
|
|
local addons = tempOutfit.addons
|
|
if addonId == "addon1" then
|
|
addons = checked and addons + 1 or addons - 1
|
|
elseif addonId == "addon2" then
|
|
addons = checked and addons + 2 or addons - 2
|
|
end
|
|
|
|
settings.currentPreset = 0
|
|
|
|
tempOutfit.addons = addons
|
|
updatePreview()
|
|
if appearanceGroup:getSelectedWidget() == window.appearance.settings.outfit.check then
|
|
showOutfits()
|
|
end
|
|
end
|
|
|
|
function onColorModeChange(widget, selectedWidget)
|
|
local colorMode = selectedWidget:getId()
|
|
if colorMode == "head" then
|
|
colorBoxGroup:selectWidget(window.appearance.colorBoxPanel["colorBox" .. tempOutfit.head])
|
|
elseif colorMode == "primary" then
|
|
colorBoxGroup:selectWidget(window.appearance.colorBoxPanel["colorBox" .. tempOutfit.body])
|
|
elseif colorMode == "secondary" then
|
|
colorBoxGroup:selectWidget(window.appearance.colorBoxPanel["colorBox" .. tempOutfit.legs])
|
|
elseif colorMode == "detail" then
|
|
colorBoxGroup:selectWidget(window.appearance.colorBoxPanel["colorBox" .. tempOutfit.feet])
|
|
end
|
|
end
|
|
|
|
function onColorCheckChange(widget, selectedWidget)
|
|
local colorId = selectedWidget.colorId
|
|
local colorMode = colorModeGroup:getSelectedWidget():getId()
|
|
if colorMode == "head" then
|
|
tempOutfit.head = colorId
|
|
elseif colorMode == "primary" then
|
|
tempOutfit.body = colorId
|
|
elseif colorMode == "secondary" then
|
|
tempOutfit.legs = colorId
|
|
elseif colorMode == "detail" then
|
|
tempOutfit.feet = colorId
|
|
end
|
|
|
|
updatePreview()
|
|
|
|
if appearanceGroup:getSelectedWidget() == window.appearance.settings.outfit.check then
|
|
showOutfits()
|
|
end
|
|
end
|
|
|
|
function updatePreview()
|
|
local direction = previewCreature:getDirection()
|
|
local previewOutfit = table.copy(tempOutfit)
|
|
|
|
if not settings.showOutfit then
|
|
previewCreature:hide()
|
|
else
|
|
previewCreature:show()
|
|
end
|
|
|
|
if not settings.showMount then
|
|
previewOutfit.mount = 0
|
|
end
|
|
|
|
if not settings.showAura then
|
|
previewOutfit.aura = 0
|
|
end
|
|
|
|
if not settings.showWings then
|
|
previewOutfit.wings = 0
|
|
end
|
|
|
|
if not settings.showShader then
|
|
previewOutfit.shader = "outfit_default"
|
|
end
|
|
|
|
if not settings.showBars then
|
|
previewOutfit.healthBar = 0
|
|
previewOutfit.manaBar = 0
|
|
window.preview.panel.bars:hide()
|
|
else
|
|
if settings.showMount and previewOutfit.mount > 0 then
|
|
window.preview.panel.bars:setMarginTop(45)
|
|
window.preview.panel.bars:setMarginLeft(25)
|
|
else
|
|
window.preview.panel.bars:setMarginTop(30)
|
|
window.preview.panel.bars:setMarginLeft(15)
|
|
end
|
|
local name = g_game.getCharacterName()
|
|
window.preview.panel.bars.name:setText(name)
|
|
if name:find("g") or name:find("j") or name:find("p") or name:find("q") or name:find("y") then
|
|
window.preview.panel.bars.name:setHeight(14)
|
|
else
|
|
window.preview.panel.bars.name:setHeight(11)
|
|
end
|
|
|
|
local healthBar = window.preview.panel.bars.healthBar
|
|
local manaBar = window.preview.panel.bars.manaBar
|
|
if not g_game.getFeature(GameHealthInfoBackground) then
|
|
manaBar:setMarginTop(0)
|
|
healthBar:setMarginTop(1)
|
|
healthBar.image:setMargin(0)
|
|
healthBar.image:hide()
|
|
manaBar.image:setMargin(0)
|
|
manaBar.image:hide(0)
|
|
else
|
|
local healthOffset = g_healthBars.getHealthBarOffset(previewOutfit.healthBar)
|
|
local healthBarOffset = g_healthBars.getHealthBarOffsetBar(previewOutfit.healthBar)
|
|
local manaOffset = g_healthBars.getHealthBarOffset(previewOutfit.manaBar)
|
|
|
|
if previewOutfit.healthBar > 0 then
|
|
healthBar.image:setImageSource(g_healthBars.getHealthBarPath(previewOutfit.healthBar))
|
|
|
|
healthBar:setMarginTop(-healthOffset.y + 1)
|
|
healthBar.image:setMarginTop(-healthOffset.y)
|
|
healthBar.image:setMarginBottom(-healthOffset.y)
|
|
healthBar.image:setMarginLeft(-healthOffset.x)
|
|
healthBar.image:setMarginRight(-healthOffset.x)
|
|
healthBar.image:show()
|
|
manaBar:setMarginTop(healthBarOffset.y + 1 - manaOffset.y)
|
|
else
|
|
manaBar:setMarginTop(0)
|
|
healthBar:setMarginTop(1)
|
|
healthBar.image:setMargin(0)
|
|
healthBar.image:hide()
|
|
end
|
|
|
|
if previewOutfit.manaBar > 0 then
|
|
manaBar.image:setImageSource(g_healthBars.getManaBarPath(previewOutfit.manaBar))
|
|
|
|
manaBar:setMarginTop(healthBarOffset.y + 1 - manaOffset.y)
|
|
|
|
manaBar.image:setMarginTop(-manaOffset.y)
|
|
manaBar.image:setMarginBottom(-manaOffset.y)
|
|
manaBar.image:setMarginLeft(-manaOffset.x)
|
|
manaBar.image:setMarginRight(-manaOffset.x)
|
|
manaBar.image:show()
|
|
else
|
|
manaBar.image:setMargin(0)
|
|
manaBar.image:hide(0)
|
|
end
|
|
end
|
|
window.preview.panel.bars:show()
|
|
end
|
|
|
|
previewCreature:setOutfit(previewOutfit)
|
|
previewCreature:setDirection(direction)
|
|
end
|
|
|
|
function rotate(value)
|
|
local direction = previewCreature:getDirection()
|
|
direction = direction + value
|
|
if direction < Directions.North then
|
|
direction = Directions.West
|
|
elseif direction > Directions.West then
|
|
direction = Directions.North
|
|
end
|
|
previewCreature:setDirection(direction)
|
|
floor:setMargin(0)
|
|
end
|
|
|
|
function saveSettings()
|
|
if not g_resources.fileExists(settingsFile) then
|
|
g_resources.makeDir("/settings")
|
|
g_resources.writeFileContents(settingsFile, "[]")
|
|
end
|
|
|
|
local fullSettings = {}
|
|
do
|
|
local json_status, json_data =
|
|
pcall(
|
|
function()
|
|
return json.decode(g_resources.readFileContents(settingsFile))
|
|
end
|
|
)
|
|
|
|
if not json_status then
|
|
g_logger.error("[saveSettings] Couldn't load JSON: " .. json_data)
|
|
return
|
|
end
|
|
fullSettings = json_data
|
|
end
|
|
|
|
fullSettings[g_game.getCharacterName()] = settings
|
|
|
|
local json_status, json_data =
|
|
pcall(
|
|
function()
|
|
return json.encode(fullSettings)
|
|
end
|
|
)
|
|
|
|
if not json_status then
|
|
g_logger.error("[saveSettings] Couldn't save JSON: " .. json_data)
|
|
return
|
|
end
|
|
|
|
g_resources.writeFileContents(settingsFile, json.encode(fullSettings))
|
|
end
|
|
|
|
function loadSettings()
|
|
if not g_resources.fileExists(settingsFile) then
|
|
g_resources.makeDir("/settings")
|
|
end
|
|
|
|
if g_resources.fileExists(settingsFile) then
|
|
local json_status, json_data =
|
|
pcall(
|
|
function()
|
|
return json.decode(g_resources.readFileContents(settingsFile))
|
|
end
|
|
)
|
|
|
|
if not json_status then
|
|
g_logger.error("[loadSettings] Couldn't load JSON: " .. json_data)
|
|
return
|
|
end
|
|
|
|
settings = json_data[g_game.getCharacterName()]
|
|
if not settings then
|
|
loadDefaultSettings()
|
|
end
|
|
else
|
|
loadDefaultSettings()
|
|
end
|
|
end
|
|
|
|
function loadDefaultSettings()
|
|
settings = {
|
|
movement = false,
|
|
showFloor = false,
|
|
showOutfit = true,
|
|
showMount = false,
|
|
showWings = false,
|
|
showAura = false,
|
|
showShader = false,
|
|
showBars = false,
|
|
presets = {},
|
|
currentPreset = 0
|
|
}
|
|
settings.currentPreset = 0
|
|
end
|
|
|
|
function accept()
|
|
if g_game.getFeature(GamePlayerMounts) then
|
|
local player = g_game.getLocalPlayer()
|
|
local isMountedChecked = window.configure.mount.check:isChecked()
|
|
if not player:isMounted() and isMountedChecked then
|
|
player:mount()
|
|
elseif player:isMounted() and not isMountedChecked then
|
|
player:dismount()
|
|
end
|
|
if settings.currentPreset > 0 then
|
|
settings.presets[settings.currentPreset].mounted = isMountedChecked
|
|
end
|
|
end
|
|
|
|
g_game.changeOutfit(tempOutfit)
|
|
destroy()
|
|
end
|