六天学会写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
    endblock

    ScriptCall中具体实现方法
    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
    endblock

    ScriptCall中具体实现方法
    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点开放,未到开放时间呢!",ok

    endif

    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
    end

    end

    第二例:制作任务旗标
    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 "你找过某某某了吗?",ok

    endif

    NPC2 某人
    block
    luac getevent nixidelubi
    if localcount 31 == 2
    window "露比找我吗?好的,说完话了,你回去告诉他吧!",ok
    luac setevent nixidelubi,3
    else
    window "你是谁,有事吗!",ok
    endif

    ScriptCall中具体实现方法
    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];
    end

    if(string.find(s,"setevent"))then
    local sv = string.gsub(s, "setevent", "");
    local sv2 = split(sv,",");
    myevent[player..sv2[1]] = sv2[2];
    end

    end



  • :)学习中,。。。



  • 这些个函数只支持商业GA的吗?



  • 我想我10天也學不會吧= =


登录后回复