青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

戰魂小筑

討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

   :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

魔獸的UI插件結構

1.使用lua+XML作為配置

    分析:XML雖然人機交互很好,但其實沒有幾個UI是真正用純XML寫的,大多還是用編輯器比較方便。速度很慢,但尚不清楚魔獸代碼里是否進行優化

2. Interface\Addons為插件目錄,文件夾可以堆疊

3. 每個插件組,需要一個toc文件來做文件讀取列表描述,類似于:

# Libraries
embeds.xml

AceGUIWidget-DragLink.lua
Core.lua

# Localization
Locale-enUS.lua
Locale-zhCN.lua
Locale-zhTW.lua

AutoBarDB.lua
AutoBarOptions.lua
AutoBarSearch.lua

4.一個插件組里可以擁有多個lua文件,都共享一個獨立的全局空間

5.WTF\Account\賬號名\服務器名\角色名\AddOns.txt文件描述哪些插件需要讀取

根據分析:每次魔獸啟動時,都會掃描一次插件目錄,并更新這個列表,但是原有的插件讀取狀態仍然保留,類似于:

Combuctor: enabled
Combuctor_Config: enabled
Parrot: disabled
BattleInfo: disabled
BigWigs: disabled
BigWigs_Extras: disabled
BigWigs_BlackTemple: disabled
leafZone: enabled
InFlight: disabled

6. WTF\下的很多SavedVariables目錄都是用于保存插件狀態的,沒有對lua的擴展庫進行研究(ACE2/3等等),但是這是一種很好的保存插件數據的方法

OZ_Config = {
    {
        ["bottomCol"] = {
            ["a"] = 1,
            ["r"] = 0,
            ["g"] = 0,
            ["b"] = 0.6,
        },
        ["maxBars"] = 40,
        ["barHeight"] = 16,
        ["titleHeight"] = 20,
        ["sort2"] = 0,
        ["fadeAlpha"] = 0.3999999761581421,
        ["textSize"] = 10,
        ["colour"] = 2,
        ["minBars"] = 1,
        ["heading"] = {
            3, -- [1]
            0, -- [2]
            0, -- [3]

7.暫時沒有找到魔獸UI的核心API是否用純腳本提供的證據,但是可以推斷,按照暴雪的實力,應該是全lua api寫成。

 

 

構建安全的lua沙箱

所謂沙箱,就是每個插件擁有獨立的_G全局環境,即便用戶誤將print修改,其他的插件也不會受到影響. 同時,考慮到沙箱的安全性和權限,需要對沙箱函數訪問進行訂制.以下是本人摸索出的一種方案:

先看下我的UI環境及lua嵌入架構:

1. C++層將必要的API注冊到lua層.但都是基于id的全局函數(考慮到效率及便捷),但是實際使用時再在lua層進行OO封裝,這和WINDOWS API及MFC的原理類似

2. C++層只提供4種原生控件: Button,Label, EditBox,MultiLineEditBox。其他的控件都是由這些組成。

3. 可以將整個系統分為內核模式和用戶模式。

    內核模式:可以使用完整的API訪問及權限。

    用戶模式:被沙箱保護,無法訪問一些危險的API,例如io

 

這里,我們使用lua_setfenv進行沙箱構建,首先我們必須將創建每個沙箱對應的table

// 放入沙箱名稱
lua_pushstring( mLua, "mysandbox" );
// 將一個table壓入棧
dotlua::table ts( mLua , false );
// 調用之前載入好的一個訂制沙箱環境的函數
gt.call<void>("SetupSandBox", ts ); 
// 將沙箱以mysandbox的key保存在注冊表中
lua_settable( mLua, LUA_REGISTRYINDEX );

之后使用lua_loadfile載入需要放進沙箱的代碼

 

// 這里將本沙箱對應的環境取出來
lua_pushstring( mLua, "mysandbox" );
lua_gettable( mLua, LUA_REGISTRYINDEX );
// 棧內的情形為
// -1  沙箱table
// -2 chunk function
// 這里必須調用chunk函數
lua_setfenv( mLua, -2 );
調用pcall執行代碼
這里的chunk函數,來源于lua_loadfile或者lua_loadbuffer,這2個函數將代碼讀入,但并不會執行,包括定義全局函數之類的操作。
沙箱訂制函數必須提前載入,這里發一個做參考

function SetupSandBox( e )
    e._G = e
    -- system lib
    e.print         = print
    e.printf         = printf
    e.table         = table
    e.string         = string
    e.debug         = debug
    e.math             = math
    e.assert         = assert
    e.getmetatable     = getmetatable
    e.ipairs         = ipairs
    e.pairs         = pairs
    e.pcall         = pcall
    e.setmetatable     = setmetatable
    e.tostring         = tostring
    e.tonumber         = tonumber
    e.type             = type
    e.unpack         = unpack
    e.collectgarbage = collectgarbage
    -- class
    e.TREENODE = WIDGET_TREENODE
    e.SERIALIZE = WIDGET_SERIALIZE
    -- function
    e.CreateWidget = CreateWidget
    e._Inherit = _Inherit
end

只有被訂制的函數,才能被調用
 
擴展:
 為了獲得完整的內核模式開發,但又擁有獨立的沙箱環境,可以使用setmetatable方式設置一個對全局table的引用,雖然速度慢了點。。
當然,可以支持一套可載入dll訂制權限,并注冊更多的api給自己的腳本用
posted on 2009-07-09 11:12 戰魂小筑 閱讀(2206) 評論(1)  編輯 收藏 引用 所屬分類: 腳本技術

評論

# re: 構建類魔獸UI插件的lua安全沙箱 2009-07-09 11:20 Adrian
不錯,希望接口可以再簡潔一點,再快一點~  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜伦理片一区| 欧美在线播放高清精品| 欧美午夜激情小视频| 欧美精品一区二区高清在线观看| 免费成人性网站| 欧美日韩一区二区精品| 欧美三级视频在线播放| 国产精品视频一区二区高潮| 国产女优一区| 亚洲福利精品| 亚洲午夜一区| 久久久国产成人精品| 欧美激情在线观看| 一区二区三区四区蜜桃| 欧美在线一区二区| 欧美—级在线免费片| 国产伦精品免费视频 | 亚洲黄色大片| 91久久国产自产拍夜夜嗨| 亚洲视频一区二区在线观看 | 国产精品一区二区在线| 国产在线视频不卡二| 亚洲欧洲日产国码二区| 亚洲欧美日韩一区二区在线| 蜜桃av综合| 亚洲综合第一| 欧美精品久久99| 国产日韩欧美三区| 一本综合久久| 欧美高清视频在线播放| 亚洲欧美日韩一区在线观看| 欧美jjzz| 国产一区二区三区的电影| 亚洲精品无人区| 久久精品夜夜夜夜久久| 亚洲精品综合| 免费视频一区| 一区二区在线视频| 午夜一区在线| 在线亚洲高清视频| 欧美精选午夜久久久乱码6080| 国产精品永久免费观看| 一区二区久久久久| 欧美aa在线视频| 亚洲一区精彩视频| 欧美日韩免费一区二区三区| 亚洲国产福利在线| 欧美不卡一卡二卡免费版| 午夜视频一区二区| 国产毛片久久| 欧美亚洲视频在线看网址| 一本一本大道香蕉久在线精品| 欧美成年人在线观看| 亚洲电影在线免费观看| 久久夜色精品国产欧美乱极品| 亚洲欧美在线播放| 国产精品外国| 久久精品一本| 久久久精品国产免费观看同学| 韩国成人福利片在线播放| 久久精品91| 欧美一区国产一区| 国产日韩欧美一区二区| 久久久久久久久久久成人| 欧美在线观看日本一区| 国内外成人免费激情在线视频网站| 久久国产手机看片| 久久国产精品久久w女人spa| 国户精品久久久久久久久久久不卡| 久久精品视频99| 欧美一区在线看| 亚洲电影在线| 亚洲卡通欧美制服中文| 国产精品v片在线观看不卡| 亚洲综合电影| 欧美在线免费视频| 久久国产免费看| 91久久香蕉国产日韩欧美9色| 亚洲成色999久久网站| 久久久久一区二区三区| 亚洲精品国产精品国产自| 亚洲理论在线观看| 国产日韩三区| 欧美成人亚洲成人| 欧美日韩高清免费| 欧美在线高清视频| 久久女同精品一区二区| 99热免费精品| 欧美亚洲免费在线| 日韩视频免费在线| 羞羞色国产精品| 91久久久精品| 小黄鸭精品密入口导航| 亚洲三级免费电影| 亚洲综合精品| 亚洲美女av网站| 欧美淫片网站| 亚洲伊人观看| 牛牛国产精品| 欧美一区二区视频观看视频| 米奇777超碰欧美日韩亚洲| 91久久精品国产91久久性色| 亚洲视频一区二区| 亚洲国产电影| 午夜在线一区二区| 一区二区三区你懂的| 欧美在线观看网站| 亚洲一区二区伦理| 欧美大片一区二区| 久久精品国产免费看久久精品| 欧美国产日韩一区二区三区| 久久成人免费网| 欧美日韩国产黄| 欧美国产一区二区在线观看 | 亚洲精品视频免费在线观看| 亚洲欧美资源在线| 亚洲午夜一级| 欧美伦理a级免费电影| 浪潮色综合久久天堂| 国产精品视频久久一区| 亚洲精品日本| 亚洲激情视频网站| 久久综合狠狠| 欧美电影在线| 亚洲激情电影中文字幕| 久久久久久久激情视频| 久久精品国产免费| 国产亚洲欧美激情| 亚洲在线一区二区三区| 亚洲欧美视频在线观看| 国产精品国产三级国产专区53 | 久久久久久一区二区| 国产欧美日韩亚州综合| 亚洲午夜精品久久久久久app| 这里只有精品丝袜| 欧美色播在线播放| 亚洲最新在线视频| 亚洲综合精品一区二区| 亚洲欧美视频在线观看| 亚洲欧美日韩国产中文在线| 国产精品国产三级国产a| 亚洲一区二区三区精品动漫| 午夜久久久久久久久久一区二区| 国产精品成av人在线视午夜片| 一区二区三区高清在线观看| 亚洲综合色丁香婷婷六月图片| 国产精品久久久久久久久果冻传媒 | 亚洲一区二区三区四区中文| 亚洲欧美另类国产| 国产亚洲一区二区三区在线播放| 香蕉av777xxx色综合一区| 久久久久网站| 亚洲国产第一| 欧美日韩精品一本二本三本| 正在播放亚洲| 久久久久久久久久码影片| 精品999网站| 欧美电影在线| 一本久道久久综合狠狠爱| 亚洲一区二区精品视频| 国产麻豆精品在线观看| 老司机aⅴ在线精品导航| 亚洲精品久久| 久久精品日韩一区二区三区| 在线看国产一区| 欧美人体xx| 欧美一二三区在线观看| 亚洲第一福利视频| 亚洲欧美日韩在线综合| 怡红院精品视频在线观看极品| 欧美精品不卡| 亚洲欧美卡通另类91av| 欧美国产大片| 欧美一二三视频| 亚洲人成毛片在线播放| 国产精品av免费在线观看| 香蕉国产精品偷在线观看不卡| 欧美激情视频一区二区三区不卡| 在线亚洲激情| 亚洲国产高清一区| 国产精品va| 欧美国产综合视频| 欧美在线免费播放| 一区二区三区欧美视频| 欧美ed2k| 欧美一区免费| 一区二区三区久久精品| 一区二区三区在线不卡| 国产精品www色诱视频| 毛片基地黄久久久久久天堂| 亚洲综合首页| 亚洲免费不卡| 亚洲福利视频一区| 久久精品日产第一区二区| 亚洲天堂成人在线观看| 在线电影院国产精品| 国产精品一香蕉国产线看观看| 欧美精品久久天天躁| 久久久噜噜噜久久中文字幕色伊伊 | 欧美一区二区在线观看|