魔兽的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("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给自己的脚本用

lua搭建ui_构建类魔兽UI插件的lua安全沙箱相关推荐

  1. lua搭建ui_Unity游戏开发笔记-UI框架之Lua层封装-上篇

    现在的商业游戏开发,业务层绝大多数都是在Lua层实现.UI作为业务一哥,首当其冲.上一篇文章我们讲了UI框架在C#层的封装,这篇文章核心介绍下在Lua层的封装.还有之前遗留的几个问题数据层和显示层的抽 ...

  2. lua搭建ui_[专栏作家] Lua写UI的一些使用心得

    原标题:[专栏作家] Lua写UI的一些使用心得 之前提到,根据我们的项目需求,战斗部分,用c#来写.其他我们都用lua来写,保证在ios平台可热更新的部分更多. lua在游戏中,很多时候,主要做的是 ...

  3. 界面控件DevExpress WinForm中文教程 - 如何使用模板库构建类Office UI?

    DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案.DevExpress WinForm能完美构建流畅.美观且易于使用的应用程 ...

  4. .NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统

    文章标题:.NET Conf 2020 - 基于ASP.NET Core构建可热插拔的插件化系统 作者:Lamond Lu 项目地址:https://github.com/lamondlu/CoolC ...

  5. 【UI插件】简单的日历插件(下)—— 学习MVC思想

    前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...

  6. jQuery UI 插件

    jQuery UI 插件 1.概述 1.简介 UI -> User Interface用户界面 jQuery UI是jQuery官方提供的插件,他强化了jQuery中搭载的动画效果及特效,以实现 ...

  7. JQuery之UI插件

    1.拖曳插件之traggable 拖曳插件draggable的功能是拖动被绑定的元素,当这个jQuery UI插件与元素绑定后,可以通过调用draggable()方法,实现各种拖曳元素的效果,调用格式 ...

  8. Unity 拓展编辑器 - 导出UI预制体lua文件

    使用oldin插件 + Unity自带拓展编辑器编写 实现效果: 界面配置基类:UIDialogConfig using Sirenix.OdinInspector; using UnityEngin ...

  9. SAP UI5 初学者教程之十二 - 使用 CSS 类对 UI 进行进一步美化试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

最新文章

  1. h5做的app和原生app的区别
  2. Oracle打Patch报错Prerequisite check CheckActiveFilesAndExecutables failed.
  3. 重新精读《Java 编程思想》系列之public,protected,private与无修饰符权限的区别...
  4. Android 布局以及优化资料汇总
  5. java同步方法的特点_java多线程有哪些优点?同步实例代码展示
  6. java三级报名_java web 学习 --第四天(Java三级考试)
  7. AcWing 103. 电影
  8. Https 真的安全吗?可以抓包吗?如何防止抓包吗?
  9. sql*loader
  10. 手写字体识别用python实现_Python3实现简单可学习的手写体识别
  11. 腾讯元老、上市公司CTO辞职后,每天对着200亩地发呆!
  12. 虚拟网卡服务器端软件,不再挤房间!自己动手架设自己的“浩方”对战平台
  13. 简单的E_mail发送
  14. 坚持学习、只是尽力维持不退步吧了
  15. 住宅代理和数据中心代理哪个更好?
  16. r34300u和r53500u 哪个好
  17. 互联网医院源码|互联网医院软件体现智慧医疗的优势
  18. uni-app知识点整理
  19. 如何利用Slack客户端漏洞窃取Slack用户下载的所有文件
  20. (Python语法篇)4.序列(3)字典

热门文章

  1. enscape渲图按哪个键_手机输入法之争:九宫格和全键盘哪个更科学?
  2. linux root权限_深入了解 Linux 权限
  3. java初始化一个链表_Java 链表(LinkNode)的简单操作:初始化,遍历,插入,删除等...
  4. Codeforces Round #562 (Div. 2) B. Pairs
  5. Java--日期的使用
  6. 关于修改linux hostname的问题,尤其是redhat 7修改hostname的方式
  7. Android中实现整个视图切换的左右滑动效果
  8. NE 题库 38个知识点总结
  9. 《1024伐木累》-人生最高境界,长的好看
  10. Python urllib和urllib2模块学习(一)