六天学会写GA Lua脚本(三)
-
**概念:Lua的流程控制语句 **
条件控制:if 条件 then ... elseif 条件 then ... else ... end
While循环:while 条件 do ... end
Repeat循环:repeat ... until 条件
For循环:for 变量 = 初值,终点值,步进 do ... end
For循环:for 变量1,变量2,... ,变量N in表或枚举函数 do ... end
具体请自行百度以上语句用法,已经有很多现成的说明文档。实战:lua与脚本交互 - 名字变色卡制作
GA在启动时,会自动注册一个名为function ScriptCall(npc, player, s)的函数,此函数具有和魔力脚本交互的功能。实例一:使用魔力脚本实现人物名字变色卡。
block
window "请问要将您的名字变色成红色吗?",yes,no
window_yes
luac namecolorchange
endblock
window_no
endblock
解释:我们可以看到,脚本中多了一条大家不熟悉的语句luac namecolorchange,这条语句就是自定义脚本语句,他可以通过luac来进行与ScriptCall交互。
ScriptCall中具体实现方法,GAlua引擎此函数位置lua\System\BaseModule\luac.lua
function ScriptCall(npc, player, s)
if(string.find(s,"namecolorchange"))then
Char.SetData(player,%对象_名色%,2);
end
end
解释:参数一为对话的npc对象,如果为道具使用的脚本,此参数可以忽略,参数二为玩家本身对象,参数三为脚本传递过来的文本namecolorchange(注:当文本传递给次函数时,会自动删除空格,比如luac a b c,传递过来后,这里则为 abc)实例二:使用魔力脚本实现带参数的人物名字变色卡。
block
window "请问要将您的名字变色成红色吗?",yes,no
window_yes
luac namecolorchange 2
endblock
window_no
endblockScriptCall中具体实现方法
function ScriptCall(npc, player, s)
if(string.find(s,"namecolorchange"))then
local colornum = string.gsub(s, "namecolorchange", "");
Char.SetData(player,%对象_名色%,colornum);
end
end实例三:使用魔力脚本实现带返回值的人物名字变色卡。
block
window "请问要将您的名字变色成蓝色吗?",yes,no
window_yes
luac namecolorchange 1
if localcount 31 == 1
window "颜色修改成功!",ok
endif
endblock
window_no
endblockScriptCall中具体实现方法
function ScriptCall(npc, player, s)
if(string.find(s,"namecolorchange"))then
local colornum = string.gsub(s, "namecolorchange", "");
Char.SetData(player,%对象_名色%,colornum);
return 1;
end
end
解释:在ScriptCall中可以直接返回整数型的返回值便于魔力脚本进一步判断,返回值将保存在localcount 31中。注:以上脚本便于讲解和简洁性,并没有对参数的安全性和可靠性做检查,实际应用中请对可能存在漏洞的参数进行判断
练习:使用lua交互脚本实现人物形象变身卡。
-
lua脚本交互常用百例:(一天两例)
第一例:制作时间判断函数
block
luac mychecktime 10:00:00
if localcount 31 == 1
window "黄金迷宫每日10点开放,请进入吧!",ok
warp 1544,20,20
else
window "黄金迷宫每日10点开放,未到开放时间呢!",okendif
ScriptCall中具体实现方法
function ScriptCall(npc, player, s)
if(string.find(s,"mychecktime"))then
local sv = string.gsub(s, "mychecktime", "");
if(os.date("%X",os.time()) == sv)then
return 1;
end
endend
第二例:制作任务旗标
NPC1 露比
block
luac getevent nixidelubi
if localcount 31 == 1
window "你能去某地找某人对话吗?",ok
luac setevent nixidelubi,2
endif
if localcount 31 == 2
window "快去吧!",ok
endif
if localcount 31 == 3
window "你找过某某某了吗?",okendif
NPC2 某人
block
luac getevent nixidelubi
if localcount 31 == 2
window "露比找我吗?好的,说完话了,你回去告诉他吧!",ok
luac setevent nixidelubi,3
else
window "你是谁,有事吗!",ok
endifScriptCall中具体实现方法
local myevent = {};
function ScriptCall(npc, player, s)
if(string.find(s,"getevent"))then
local sv = string.gsub(s, "getevent", "");
if(myevent[player..sv] == nil)then
return 1;
end
return myevent[player..sv];
endif(string.find(s,"setevent"))then
local sv = string.gsub(s, "setevent", "");
local sv2 = split(sv,",");
myevent[player..sv2[1]] = sv2[2];
endend
-
学习中,。。。
-
这些个函数只支持商业GA的吗?
-
我想我10天也學不會吧= =