lua预处理的应用 启动cjass编译器 跟逆天 兼容使用

皇家骑士 发表于 2018-12-3 10:45:13 | 显示全部楼层
@a4454962 发表于 2016-12-26 23:26:50

看之前请百度学习下 lua的语法  lua的语法还是比较简单的  
据说有个8岁的小孩 在他父亲的帮助下学会了lua
所以简单到小孩都可以懂的东西 我想自行百度就可以了吧

在yd里面 由于cj的宏定义跟 wave的存在冲突关系 所以导致actboy168 在使用上将 2个插件区分开来
逆天是用wave导入地图   所以  当手动开启cj编译器的时候 wave会被关闭 逆天的UI会被禁止 故此2者在原本的yd里无法使用  这里将用lua 来对地图编译过程中插入 cj启动项 而不用手动关闭wave 也就是共存的使用
关于冲突 请看
https://bbs.wow8.org/thread/587

下面这里是代码


#define open __open
<?
-- 这里是 lua 启动cjass编译的代码 可以无视掉

f=io.open("share/script/compile/jasshelper.lua","r")
s=f:read("*a")
f:close()
f=io.open("share/script/template2.lua","w")
s=string.gsub(s,'local parameter = ""',[[
        local parameter = ""
        require "compile.cjass"
        cjass:do_compile(map_path, option)
        jasshelper.compile=nil
]])
f:write(s)
f:close()

package.loaded["template2"]=nil
require "template2"

?>


将这段代码移植到你地图里J的随意位置 运行时便自动启动CJ编译器 帮助运行了

这里解释下这段代码的原理
首先 #define open __open  是因为 ydwe在1.28.3之后的版本里  open 打开文件名  的函数被重载
并且换成 __open  这里为了保持原本的习惯 将名字换回来

然后看 这一段

f=io.open("share/script/compile/jasshelper.lua","r")
s=f:read("*a")
f:close()

这个是打开yd目录下 的操纵编译过程的文件 并且读取他的内容到 s里

接下来 重新生成1个文件 并且 在 上面文件的内容里 在local parameter = "" 这个位置插入 [[ 中间的代码 ]]
f=io.open("share/script/template2.lua","w")
s=string.gsub(s,'local parameter = ""',[[
local parameter = ""
require "compile.cjass"
cjass:do_compile(map_path, option)
jasshelper.compile=nil
]])
f:write(s)
f:close()

[[中间的代码里有什么呢 ]]

加载 compile.cjass  这个库
并且 使用 这个 库里的 cjass:do_compile(map_path, option) 来编译地图

你可以打开看看这个 插入代码后  这个调用cj编译地图的参数 来自什么地方

然后

package.loaded["template2"]=nil
require "template2"

将这个 新生成的 文件在加载表中 设置为 nil  
然后 重新加载


过程解释完毕 原理就是
在 jasshelper.lua 里  yd即将运行的函数里 插入 编译cj的 调用
由于 新生成的文件 与 jasshelper.lua的文件里  函数名相同 旧函数会被覆盖成新函数 达到重载的效果
并且 增加 启动CJ编译的内容 这时 CJ就会启动了 然后CJ的宏的写法 要注意防止冲突哦

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

相关版块

相关标签

快速回复 返回顶部 返回列表