mirror of
https://github.com/edubart/otclient.git
synced 2025-04-30 01:29:21 +02:00

* Added mount options to the thing menu. * Reworked the mounting/dismounting. * Fixed up some skill module bugs. * Added alerts to stats like health, mana, capacity, and regeneration time (need to revise this one as it currently has no maximum).
298 lines
8.8 KiB
Lua
298 lines
8.8 KiB
Lua
skillsWindow = nil
|
|
skillsButton = nil
|
|
|
|
function init()
|
|
connect(LocalPlayer, {
|
|
onExperienceChange = onExperienceChange,
|
|
onLevelChange = onLevelChange,
|
|
onHealthChange = onHealthChange,
|
|
onManaChange = onManaChange,
|
|
onSoulChange = onSoulChange,
|
|
onFreeCapacityChange = onFreeCapacityChange,
|
|
onTotalCapacityChange = onTotalCapacityChange,
|
|
onStaminaChange = onStaminaChange,
|
|
onOfflineTrainingChange = onOfflineTrainingChange,
|
|
onRegenerationChange = onRegenerationChange,
|
|
onSpeedChange = onSpeedChange,
|
|
onBaseSpeedChange = onBaseSpeedChange,
|
|
onMagicLevelChange = onMagicLevelChange,
|
|
onBaseMagicLevelChange = onBaseMagicLevelChange,
|
|
onSkillChange = onSkillChange,
|
|
onBaseSkillChange = onBaseSkillChange
|
|
})
|
|
connect(g_game, {
|
|
onGameStart = refresh
|
|
})
|
|
|
|
skillsWindow = g_ui.loadUI('skills.otui', modules.game_interface.getRightPanel())
|
|
skillsButton = TopMenu.addRightGameToggleButton('skillsButton', tr('Skills') .. ' (Ctrl+S)', 'skills.png', toggle)
|
|
skillsButton:setOn(true)
|
|
g_keyboard.bindKeyDown('Ctrl+S', toggle)
|
|
|
|
refresh()
|
|
end
|
|
|
|
function terminate()
|
|
disconnect(LocalPlayer, {
|
|
onExperienceChange = onExperienceChange,
|
|
onLevelChange = onLevelChange,
|
|
onHealthChange = onHealthChange,
|
|
onManaChange = onManaChange,
|
|
onSoulChange = onSoulChange,
|
|
onFreeCapacityChange = onFreeCapacityChange,
|
|
onTotalCapacityChange = onTotalCapacityChange,
|
|
onStaminaChange = onStaminaChange,
|
|
onOfflineTrainingChange = onOfflineTrainingChange,
|
|
onRegenerationChange = onRegenerationChange,
|
|
onSpeedChange = onSpeedChange,
|
|
onBaseSpeedChange = onBaseSpeedChange,
|
|
onMagicLevelChange = onMagicLevelChange,
|
|
onBaseMagicLevelChange = onBaseMagicLevelChange,
|
|
onSkillChange = onSkillChange,
|
|
onBaseSkillChange = onBaseSkillChange
|
|
})
|
|
disconnect(g_game, {
|
|
onGameStart = refresh,
|
|
onGameEnd = refresh
|
|
})
|
|
|
|
g_keyboard.unbindKeyDown('Ctrl+S')
|
|
skillsButton:destroy()
|
|
skillsWindow:destroy()
|
|
end
|
|
|
|
function resetSkillColor(id)
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('value')
|
|
widget:setColor('#bbbbbb')
|
|
end
|
|
|
|
function setSkillBase(id, value, baseValue)
|
|
if baseValue < 1 or value < 1 then
|
|
return
|
|
end
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('value')
|
|
|
|
if value > baseValue then
|
|
widget:setColor('#008b00') -- green
|
|
skill:setTooltip(baseValue .. ' + ' .. (value - baseValue))
|
|
elseif value < baseValue then
|
|
widget:setColor('#b22222') -- red
|
|
skill:setTooltip(baseValue .. ' - ' .. (value - baseValue))
|
|
else
|
|
widget:setColor('#bbbbbb') -- default
|
|
skill:removeTooltip()
|
|
end
|
|
end
|
|
|
|
function setSkillValue(id, value)
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('value')
|
|
widget:setText(value)
|
|
end
|
|
|
|
function setSkillColor(id, value)
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('value')
|
|
widget:setColor(value)
|
|
end
|
|
|
|
function setSkillTooltip(id, value)
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('value')
|
|
widget:setTooltip(value)
|
|
end
|
|
|
|
function setSkillPercent(id, percent, tooltip)
|
|
local skill = skillsWindow:recursiveGetChildById(id)
|
|
local widget = skill:getChildById('percent')
|
|
widget:setPercent(math.floor(percent))
|
|
|
|
if tooltip then
|
|
widget:setTooltip(tooltip)
|
|
end
|
|
end
|
|
|
|
function checkAlert(id, value, maxValue, threshold)
|
|
if value > maxValue or maxValue < 1 then
|
|
return
|
|
end
|
|
local percent = math.floor((value / maxValue) * 100)
|
|
if percent < threshold then
|
|
setSkillColor(id, '#b22222') -- red
|
|
else
|
|
resetSkillColor(id)
|
|
end
|
|
end
|
|
|
|
function update()
|
|
local offlineTraining = skillsWindow:recursiveGetChildById('offlineTraining')
|
|
if not g_game.getFeature(GameOfflineTrainingTime) then
|
|
offlineTraining:hide()
|
|
else
|
|
offlineTraining:show()
|
|
end
|
|
|
|
local regenerationTime = skillsWindow:recursiveGetChildById('regenerationTime')
|
|
if not g_game.getFeature(GamePlayerRegenerationTime) then
|
|
regenerationTime:hide()
|
|
else
|
|
regenerationTime:show()
|
|
end
|
|
end
|
|
|
|
function refresh()
|
|
local player = g_game.getLocalPlayer()
|
|
if not player then return end
|
|
|
|
onExperienceChange(player, player:getExperience())
|
|
onLevelChange(player, player:getLevel(), player:getLevelPercent())
|
|
onHealthChange(player, player:getHealth(), player:getMaxHealth())
|
|
onManaChange(player, player:getMana(), player:getMaxMana())
|
|
onSoulChange(player, player:getSoul())
|
|
onFreeCapacityChange(player, player:getFreeCapacity())
|
|
onStaminaChange(player, player:getStamina())
|
|
onMagicLevelChange(player, player:getMagicLevel(), player:getMagicLevelPercent())
|
|
onOfflineTrainingChange(player, player:getOfflineTrainingTime())
|
|
onRegenerationChange(player, player:getRegenerationTime())
|
|
onSpeedChange(player, player:getSpeed())
|
|
|
|
for i=0,6 do
|
|
onSkillChange(player, i, player:getSkillLevel(i), player:getSkillLevelPercent(i))
|
|
onBaseSkillChange(player, i, player:getSkillBaseLevel(i))
|
|
end
|
|
|
|
update()
|
|
end
|
|
|
|
function toggle()
|
|
if skillsButton:isOn() then
|
|
skillsWindow:close()
|
|
skillsButton:setOn(false)
|
|
else
|
|
skillsWindow:open()
|
|
skillsButton:setOn(true)
|
|
end
|
|
end
|
|
|
|
function onMiniWindowClose()
|
|
skillsButton:setOn(false)
|
|
end
|
|
|
|
function onSkillButtonClick(button)
|
|
local percentBar = button:getChildById('percent')
|
|
if percentBar then
|
|
percentBar:setVisible(not percentBar:isVisible())
|
|
if percentBar:isVisible() then
|
|
button:setHeight(21)
|
|
else
|
|
button:setHeight(21 - 6)
|
|
end
|
|
end
|
|
end
|
|
|
|
function onExperienceChange(localPlayer, value)
|
|
setSkillValue('experience', tr(value))
|
|
end
|
|
|
|
function onLevelChange(localPlayer, value, percent)
|
|
setSkillValue('level', tr(value))
|
|
setSkillPercent('level', percent, tr('You have %s percent to go', 100 - percent))
|
|
end
|
|
|
|
function onHealthChange(localPlayer, health, maxHealth)
|
|
setSkillValue('health', tr(health))
|
|
checkAlert('health', health, maxHealth, 30)
|
|
end
|
|
|
|
function onManaChange(localPlayer, mana, maxMana)
|
|
setSkillValue('mana', tr(mana))
|
|
checkAlert('mana', mana, maxMana, 30)
|
|
end
|
|
|
|
function onSoulChange(localPlayer, soul)
|
|
setSkillValue('soul', soul)
|
|
end
|
|
|
|
function onFreeCapacityChange(localPlayer, freeCapacity)
|
|
setSkillValue('capacity', freeCapacity)
|
|
checkAlert('capacity', freeCapacity, localPlayer:getTotalCapacity(), 20)
|
|
end
|
|
|
|
function onTotalCapacityChange(localPlayer, totalCapacity)
|
|
checkAlert('capacity', localPlayer:getFreeCapacity(), totalCapacity, 20)
|
|
end
|
|
|
|
function onStaminaChange(localPlayer, stamina)
|
|
local hours = math.floor(stamina / 60)
|
|
local minutes = stamina % 60
|
|
if minutes < 10 then
|
|
minutes = '0' .. minutes
|
|
end
|
|
local percent = 100 * stamina / (42 * 60) -- max is 42 hours
|
|
|
|
setSkillValue('stamina', hours .. ":" .. minutes)
|
|
setSkillPercent('stamina', percent, tr('You have %s percent', percent))
|
|
end
|
|
|
|
function onOfflineTrainingChange(localPlayer, offlineTrainingTime)
|
|
if not g_game.getFeature(GameOfflineTrainingTime) then
|
|
return
|
|
end
|
|
local hours = math.floor(offlineTrainingTime / 60)
|
|
local minutes = offlineTrainingTime % 60
|
|
if minutes < 10 then
|
|
minutes = '0' .. minutes
|
|
end
|
|
local percent = 100 * offlineTrainingTime / (12 * 60) -- max is 12 hours
|
|
|
|
setSkillValue('offlineTraining', hours .. ":" .. minutes)
|
|
setSkillPercent('offlineTraining', percent, tr('You have %s percent', percent))
|
|
end
|
|
|
|
function onRegenerationChange(localPlayer, regenerationTime)
|
|
if not g_game.getFeature(GamePlayerRegenerationTime) or regenerationTime < 0 then
|
|
return
|
|
end
|
|
local hours = math.floor(regenerationTime / 60)
|
|
local minutes = regenerationTime % 60
|
|
if minutes < 10 then
|
|
minutes = '0' .. minutes
|
|
end
|
|
|
|
setSkillValue('regenerationTime', hours .. ":" .. minutes)
|
|
checkAlert('regenerationTime', regenerationTime, 30, 20) -- what is max regeneration?
|
|
end
|
|
|
|
function onSpeedChange(localPlayer, speed)
|
|
setSkillValue('speed', speed)
|
|
|
|
onBaseSpeedChange(localPlayer, localPlayer:getBaseSpeed())
|
|
end
|
|
|
|
function onBaseSpeedChange(localPlayer, baseSpeed)
|
|
setSkillBase('speed', localPlayer:getSpeed(), baseSpeed)
|
|
end
|
|
|
|
function onMagicLevelChange(localPlayer, magiclevel, percent)
|
|
setSkillValue('magiclevel', magiclevel)
|
|
setSkillPercent('magiclevel', percent, tr('You have %s percent to go', 100 - percent))
|
|
|
|
onBaseMagicLevelChange(localPlayer, localPlayer:getBaseMagicLevel())
|
|
end
|
|
|
|
function onBaseMagicLevelChange(localPlayer, baseMagicLevel)
|
|
setSkillBase('magiclevel', localPlayer:getMagicLevel(), baseMagicLevel)
|
|
end
|
|
|
|
function onSkillChange(localPlayer, id, level, percent)
|
|
setSkillValue('skillId' .. id, level)
|
|
setSkillPercent('skillId' .. id, percent, tr('You have %s percent to go', 100 - percent))
|
|
|
|
onBaseSkillChange(localPlayer, id, localPlayer:getSkillBaseLevel(id))
|
|
end
|
|
|
|
function onBaseSkillChange(localPlayer, id, baseLevel)
|
|
setSkillBase('skillId'..id, localPlayer:getSkillLevel(id), baseLevel)
|
|
end |