刚开始做Lua引擎时,只是抱着玩玩的心态,很多东西没有认真地设计。所以在YDWE1.27,Lua引擎进行了大规模的修改,为了确保你的代码可以顺利过渡到1.28以上的YDWE,请仔细阅读文本。注:1.27支持新旧两种写法,但1.28只会支持新写法。

##Lua引擎加载

旧写法

1
call Cheat("run main.lua")

新写法

1
2
3
4
5
call Cheat("exec-lua: 'main.lua'")
call Cheat("exec-lua: \"main.lua\"")
call Cheat("exec-lua: main.lua")
call Cheat("exec-lua:main.lua")
call Cheat("exec-lua: main.lua ")

新写法中可以让你的代码看起来更清晰,同时也更加灵活.

##内置库不再默认加载

旧写法

1
jass.DisplayTimedTextToPlayer(cj.GetLocalPlayer(), 0, 0, 60., 'hello')

新写法

1
2
local jass = require 'jass.common'
jass.DisplayTimedTextToPlayer(jass.GetLocalPlayer(), 0, 0, 60., 'hello')

在新写法中,Lua引擎不在预定义任何全局变量,包括jass/japi/jass_ext/slk。你需要在使用之前用require加载它。这样可以保证Lua引擎不会跟你的代码(的变量名)冲突。同时如果某些库你不用的话,就永远不会被加载,减少资源的消耗。

你可以把这段代码添加到所有代码的最前面,这样就能保证新写法和旧写法完全等价,不过我还是建议你使用局部变量,并且去掉不使用的库。

1
2
3
4
5
6
jass = require 'jass.common'
japi = require 'jass.japi'
slk = require 'jass.slk'
jass_ext = {}
jass_ext.hook = require 'jass.hook'
jass_ext.runtime = require 'jass.runtime'

##控制台激活改变

旧写法

1
jass_ext.EnableConsole()

新写法

1
2
local runtime = require 'jass.runtime'
runtime.console = true

同样地你可以使用以下代码来作兼容

1
2
3
4
function jass_ext.EnableConsole()
local runtime = require 'jass.runtime'
runtime.console = true
end

##|AHbz|的写法被移除

这不是一个标准的Lua语法,在Lua5.3中增加了|作为运算符,所以|AHbz|这种写法在5.3中会产生问题,我思考再三,还是决定将这种写法移除。不过值得庆幸的是,在5.3中加入了一个新函数string.unpackint,他可以将一个字符串当作二进制数组转为一个整数,这恰恰是可以让一个字符串”AHbz”转为整数的’AHbz’(注意我这里使用了Jass的写法)。就像这样

1
string.unpackint('AHbz', 0, 4)

或者这样

1
2
3
4
5
function ID(id)
return string.unpackint(id, 0, 4)
end
ID 'AHbz'

不过目前Lua5.3还有很多不确定性,比如string.unpackint的第三个参数默认值总是8,所以你不能写成这样

1
string.unpackint('AHbz')

或许在正式版中会有所改变,所以|AHbz|的写法暂时保留,不过最终应该还是会被我去掉的。