Improve modules and sandbox system

This commit is contained in:
Eduardo Bart
2012-07-23 21:22:38 -03:00
parent 61d64c7417
commit 1c3e630237
12 changed files with 238 additions and 145 deletions

View File

@@ -12,7 +12,8 @@ local MaxHistory = 1000
local terminalWindow
local terminalButton
local logLocked = false
local commandEnv = newenv()
local commandEnv = {}
setmetatable(commandEnv, { __index = getfenv() } )
local commandTextEdit
local terminalBuffer
local commandHistory = { }

View File

@@ -110,6 +110,46 @@ function extends(base)
return derived
end
function runinsandbox(func, ...)
if type(func) == 'string' then
func, err = loadfile(resolvepath(func, 2))
if not func then
error(err)
end
end
local env = { }
local oldenv = getfenv(0)
setmetatable(env, { __index = oldenv } )
setfenv(0, env)
func(...)
setfenv(0, oldenv)
return env
end
function loadasmodule(name, file)
file = file or resolvepath(name, 2)
if package.loaded[name] then
return package.loaded[name]
end
local env = runinsandbox(file)
package.loaded[name] = env
return env
end
local function module_loader(modname)
local module = g_modules.getModule(modname)
if not module then
return '\n\tno module \'' .. modname .. '\''
end
return function()
if not module:load() then
error('unable to load required module ' .. modname)
end
return module:getSandbox()
end
end
table.insert(package.loaders, 1, module_loader)
function export(what, key)
if key ~= nil then
_G[key] = what
@@ -130,17 +170,6 @@ function unexport(key)
end
end
function sandbox(what)
what = what or 2
setfenv(what, newenv())
end
function newenv()
local env = { }
setmetatable(env, { __index = getfenv() } )
return env
end
function getfsrcpath(depth)
depth = depth or 2
local info = debug.getinfo(1+depth, "Sn")

View File

@@ -1,17 +1,52 @@
Skills = {}
skillsWindow = nil
skillsButton = nil
-- private variables
local skillsWindow
local skillsButton
function init()
connect(LocalPlayer, {
onExperienceChange = onExperienceChange,
onLevelChange = onLevelChange,
onHealthChange = onHealthChange,
onManaChange = onManaChange,
onSoulChange = onSoulChange,
onFreeCapacityChange = onFreeCapacityChange,
onStaminaChange = onStaminaChange,
onMagicLevelChange = onMagicLevelChange,
onSkillChange = onSkillChange
})
-- private functions
local function setSkillValue(id, value)
skillsWindow = g_ui.loadUI('skills.otui', GameInterface.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,
onStaminaChange = onStaminaChange,
onMagicLevelChange = onMagicLevelChange,
onSkillChange = onSkillChange
})
g_keyboard.unbindKeyDown('Ctrl+S')
skillsButton:destroy()
skillsWindow:destroy()
end
function setSkillValue(id, value)
local skill = skillsWindow:recursiveGetChildById(id)
local widget = skill:getChildById('value')
widget:setText(value)
end
local function setSkillPercent(id, percent, tooltip)
function setSkillPercent(id, percent, tooltip)
local skill = skillsWindow:recursiveGetChildById(id)
local widget = skill:getChildById('percent')
widget:setPercent(percent)
@@ -21,69 +56,25 @@ local function setSkillPercent(id, percent, tooltip)
end
end
-- public functions
function Skills.init()
connect(LocalPlayer, {
onExperienceChange = Skills.onExperienceChange,
onLevelChange = Skills.onLevelChange,
onHealthChange = Skills.onHealthChange,
onManaChange = Skills.onManaChange,
onSoulChange = Skills.onSoulChange,
onFreeCapacityChange = Skills.onFreeCapacityChange,
onStaminaChange = Skills.onStaminaChange,
onMagicLevelChange = Skills.onMagicLevelChange,
onSkillChange = Skills.onSkillChange
})
skillsWindow = g_ui.loadUI('skills.otui', GameInterface.getRightPanel())
skillsButton = TopMenu.addRightGameToggleButton('skillsButton', tr('Skills') .. ' (Ctrl+S)', 'skills.png', Skills.toggle)
skillsButton:setOn(true)
g_keyboard.bindKeyDown('Ctrl+S', Skills.toggle)
Skills.refresh()
end
function Skills.terminate()
disconnect(LocalPlayer, {
onExperienceChange = Skills.onExperienceChange,
onLevelChange = Skills.onLevelChange,
onHealthChange = Skills.onHealthChange,
onManaChange = Skills.onManaChange,
onSoulChange = Skills.onSoulChange,
onFreeCapacityChange = Skills.onFreeCapacityChange,
onStaminaChange = Skills.onStaminaChange,
onMagicLevelChange = Skills.onMagicLevelChange,
onSkillChange = Skills.onSkillChange
})
g_keyboard.unbindKeyDown('Ctrl+S')
skillsButton:destroy()
skillsButton = nil
skillsWindow:destroy()
skillsWindow = nil
Skills = nil
end
function Skills.refresh()
function refresh()
local player = g_game.getLocalPlayer()
if not player then return end
Skills.onExperienceChange(player, player:getExperience())
Skills.onLevelChange(player, player:getLevel(), player:getLevelPercent())
Skills.onHealthChange(player, player:getHealth(), player:getMaxHealth())
Skills.onManaChange(player, player:getMana(), player:getMaxMana())
Skills.onSoulChange(player, player:getSoul())
Skills.onFreeCapacityChange(player, player:getFreeCapacity())
Skills.onStaminaChange(player, player:getStamina())
Skills.onMagicLevelChange(player, player:getMagicLevel(), player:getMagicLevelPercent())
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())
for i=0,6 do
Skills.onSkillChange(player, i, player:getSkillLevel(i), player:getSkillLevelPercent(i))
onSkillChange(player, i, player:getSkillLevel(i), player:getSkillLevelPercent(i))
end
end
function Skills.toggle()
function toggle()
if skillsButton:isOn() then
skillsWindow:close()
skillsButton:setOn(false)
@@ -93,11 +84,11 @@ function Skills.toggle()
end
end
function Skills.onMiniWindowClose()
function onMiniWindowClose()
skillsButton:setOn(false)
end
function Skills.onSkillButtonClick(button)
function onSkillButtonClick(button)
local percentBar = button:getChildById('percent')
if percentBar then
percentBar:setVisible(not percentBar:isVisible())
@@ -109,33 +100,32 @@ function Skills.onSkillButtonClick(button)
end
end
-- hooked events
function Skills.onExperienceChange(localPlayer, value)
function onExperienceChange(localPlayer, value)
setSkillValue('experience', tr(value))
end
function Skills.onLevelChange(localPlayer, value, percent)
function onLevelChange(localPlayer, value, percent)
setSkillValue('level', tr(value))
setSkillPercent('level', percent, tr('You have %s percent to go', 100 - percent))
end
function Skills.onHealthChange(localPlayer, health, maxHealth)
function onHealthChange(localPlayer, health, maxHealth)
setSkillValue('health', tr(health))
end
function Skills.onManaChange(localPlayer, mana, maxMana)
function onManaChange(localPlayer, mana, maxMana)
setSkillValue('mana', tr(mana))
end
function Skills.onSoulChange(localPlayer, soul)
function onSoulChange(localPlayer, soul)
setSkillValue('soul', soul)
end
function Skills.onFreeCapacityChange(localPlayer, freeCapacity)
function onFreeCapacityChange(localPlayer, freeCapacity)
setSkillValue('capacity', freeCapacity)
end
function Skills.onStaminaChange(localPlayer, stamina)
function onStaminaChange(localPlayer, stamina)
local hours = math.floor(stamina / 60)
local minutes = stamina % 60
if minutes < 10 then
@@ -147,12 +137,12 @@ function Skills.onStaminaChange(localPlayer, stamina)
setSkillPercent('stamina', percent, tr('You have %s percent', percent))
end
function Skills.onMagicLevelChange(localPlayer, value, percent)
function onMagicLevelChange(localPlayer, value, percent)
setSkillValue('magiclevel', value)
setSkillPercent('magiclevel', percent, tr('You have %s percent to go', 100 - percent))
end
function Skills.onSkillChange(localPlayer, id, level, percent)
function onSkillChange(localPlayer, id, level, percent)
setSkillValue('skillId' .. id, level)
setSkillPercent('skillId' .. id, percent, tr('You have %s percent to go', 100 - percent))
end

View File

@@ -3,13 +3,12 @@ Module
description: Manage skills window
author: baxnie, edubart
website: www.otclient.info
sandboxed: true
scripts:
- skills.lua
dependencies:
- game_interface
@onLoad: |
dofile 'skills'
Skills.init()
@onUnload: |
Skills.terminate()
@onLoad: init()
@onUnload: terminate()

View File

@@ -3,7 +3,7 @@ SkillFirstWidget < UIWidget
SkillButton < UIButton
height: 21
margin-bottom: 2
&onClick: Skills.onSkillButtonClick
&onClick: onSkillButtonClick
SkillNameLabel < GameLabel
font: verdana-11px-monochrome
@@ -35,7 +35,7 @@ MiniWindow
!text: tr('Skills')
height: 150
icon: skills.png
@onClose: Skills.onMiniWindowClose()
@onClose: onMiniWindowClose()
&save: true
MiniWindowContents