Untitled
lua
a month ago
7.6 kB
2
Indexable
Never
skillsWindow = nil skillsButton = nil function init() connect(LocalPlayer, { onExperienceChange = onExperienceChange, onLevelChange = onLevelChange, onMagicLevelChange = onMagicLevelChange, onBaseMagicLevelChange = onBaseMagicLevelChange, onSkillChange = onSkillChange, onBaseSkillChange = onBaseSkillChange }) connect(g_game, { onGameStart = refresh, onGameEnd = offline }) skillsButton = modules.client_topmenu.addRightGameToggleButton('skillsButton', tr('Skills'), '/images/topbuttons/skills', toggle, false, 1) skillsButton:setOn(true) skillsWindow = g_ui.loadUI('skills', modules.game_interface.getRightPanel()) refresh() skillsWindow:setup() end function terminate() disconnect(LocalPlayer, { onExperienceChange = onExperienceChange, onLevelChange = onLevelChange, onMagicLevelChange = onMagicLevelChange, onBaseMagicLevelChange = onBaseMagicLevelChange, onSkillChange = onSkillChange, onBaseSkillChange = onBaseSkillChange }) disconnect(g_game, { onGameStart = refresh, onGameEnd = offline }) skillsWindow:destroy() skillsButton:destroy() end function expForLevel(level) return math.floor((50*level*level*level)/3 - 100*level*level + (850*level)/3 - 200) end function expToAdvance(currentLevel, currentExp) return expForLevel(currentLevel+1) - currentExp end function resetSkillColor(id) local skill = skillsWindow:recursiveGetChildById(id) local widget = skill:getChildById('value') widget:setColor('#bbbbbb') end function toggleSkill(id, state) local skill = skillsWindow:recursiveGetChildById(id) skill:setVisible(state) end function setSkillBase(id, value, baseValue) if baseValue <= 0 or value < 0 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, color) local skill = skillsWindow:recursiveGetChildById(id) local widget = skill:getChildById('percent') if widget then widget:setPercent(math.floor(percent)) if tooltip then widget:setTooltip(tooltip) end if color then widget:setBackgroundColor(color) end end end function checkAlert(id, value, maxValue, threshold, greaterThan) if greaterThan == nil then greaterThan = false end local alert = false -- maxValue can be set to false to check value and threshold -- used for regeneration checking if type(maxValue) == 'boolean' then if maxValue then return end if greaterThan then if value > threshold then alert = true end else if value < threshold then alert = true end end elseif type(maxValue) == 'number' then if maxValue < 0 then return end local percent = math.floor((value / maxValue) * 100) if greaterThan then if percent > threshold then alert = true end else if percent < threshold then alert = true end end end if alert then setSkillColor(id, '#b22222') -- red else resetSkillColor(id) 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()) onMagicLevelChange(player, player:getMagicLevel(), player:getMagicLevelPercent()) local hasAdditionalSkills = g_game.getFeature(GameAdditionalSkills) for i = Skill.Fist, Skill.ManaLeechAmount do onSkillChange(player, i, player:getSkillLevel(i), player:getSkillLevelPercent(i)) onBaseSkillChange(player, i, player:getSkillBaseLevel(i)) if i > Skill.Fishing then toggleSkill('skillId'..i, hasAdditionalSkills) end end update() local contentsPanel = skillsWindow:getChildById('contentsPanel') skillsWindow:setContentMinimumHeight(44) if hasAdditionalSkills then skillsWindow:setContentMaximumHeight(480) else skillsWindow:setContentMaximumHeight(390) end 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) local postFix = "" if value > 1e15 then postFix = "B" value = math.floor(value / 1e9) elseif value > 1e12 then postFix = "M" value = math.floor(value / 1e6) elseif value > 1e9 then postFix = "K" value = math.floor(value / 1e3) end setSkillValue('experience', comma_value(value) .. postFix) end function onLevelChange(localPlayer, value, percent) setSkillValue('level', value) local text = tr('You have %s percent to go', 100 - percent) if localPlayer.expSpeed ~= nil then local expPerHour = math.floor(localPlayer.expSpeed * 3600) if expPerHour > 0 then local nextLevelExp = expForLevel(localPlayer:getLevel()+1) local hoursLeft = (nextLevelExp - localPlayer:getExperience()) / expPerHour local minutesLeft = math.floor((hoursLeft - math.floor(hoursLeft))*60) hoursLeft = math.floor(hoursLeft) text = text .. '\n' .. comma_value(expPerHour) .. ' of experience per hour' text = text .. '\n' .. tr('Next level in %d hours and %d minutes', hoursLeft, minutesLeft) end end setSkillPercent('level', percent, text) 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