LUA脚本教程

--[[工具准备
1.一个支持UTF8无BOM编码的工具,例如:notepad++ 
2.一个多文件搜索关键字的工具,例如:File Seeker
3.Eluna对应端的源码
]]--


--[[网站相关
Eluna源码 
https://github.com/eluna-dev-mangos/ElunaCoreWotlk
https://github.com/ElunaLuaEngine/Eluna-TC-Wotlk


示例源码  
https://github.com/ElunaLuaEngine/Scripts
]]--


--[[lua基础语法-注释
单行注释:--
多行注释:--[[注释内容]]-- --[=[注释内容可以有[]这样的符号]=]--
]]--


--[==[lua基础语法-变量
    关键字(不能做变量):
    and break do else elseif
  end false for function if
  in local nil not or
  repeat return then true until while
变量类型:
    nil  空值
  boolean  就2种,真 true / 假 false
  number  数值,可以是带小数,十六进制0x10
  string  字符串,如果你愿意的话,字符串是可以 包含'\0'字符的
  table  表格,类似数组,一般用{}符号,表格可以包含多个表格,lua所以下标是从1开始
  function  函数
  userdata  player,object,item,map,quest...


local A=10    (loacal)局部变量,只在当前文件有效
A=10        (默认)全局变量,在所有lua有效,会覆盖


数值:
local a=123456
local b=0x10
local c=3.14159265358
字符串:
local str1="123"
local str2="你好"
local str3=[[这是多行字符串
            这是多行字符串
        ]]
local str4=[=[这是多行[字符串]
            这是多行[字符串]
        ]=]
表格:
local T={
        "a",
        123,
        {"a","b"},
        {123,"c"},
        b=456,
        ["10"]=123,
        ["asd"]="hi",
        }
获取表的内容:
    T[1]="a"
    T[2]=123
    T.b=456
    T["10"]=123
    T.asd="hi"
    T[3][1]="a"
    T[4][2]="c"
用for循环获取表


--只适用于没有用[]表明的表
for k,v in pairs(T) do
    k=1,v=T[1]
    k=2,v=T[2]
end


函数:
在lua,函数最好用loacal,减少服务端当机概率
local function Fun1()


end


local T={}


function T.Fun2()--因为T属于局部变量,所以T的Fun2函数也是局部变量


end


]==]--


--[[lua基础语法-基本函数库
字符串:
local str="123456"
字符串连接:local str2=str.."789"    = "123456789"
方式1:
string.find(str,"1")=1     查找指定字符出现的位置
string.sub(str,2,4)="234"    裁剪字符串
string.sub(str,2)="23456"    裁剪字符串
string.len(str)=6            字符串长度
string.format("%s是%d个孩子", "小明",1) ="小明是1个小孩"    字符串格式化
方式2:
str:find("1")=1
str:sub(2,4)="234"
str:sub(2)="23456"
str:len()=6
"%s是%d个孩子":format("小明",1) ="小明是1个小孩"


数值:
local a,b=math.modf(1/3)   a=0, b=0.3333333    a是商,b是余数


时间:
local secs=os.time()     秒数,详细可以直接百度
日期:
local ts=os.date("*t",time)
local t=string.format("%d年%d月%d天%d时%d分%d秒",ts.year,ts.mon,ts.day,ts.hour,ts.min,ts.sec)
]]--


--[[lua基础语法-运算
+-*/%^ not 
not 一般用于真假取反


]]--


--[[lua基础语法-判断,循环
判断if
local a=nil
local b=0
local c=false


if(表达式)then        --表达式等于nil或者false为假,其他为真。如果为真,则执行then的内容,否则else内容


else


end


循环for
for i=1,10 do    --从1到10,每次默认+1


end


for i=1,10,2 do    --从1到10,每次+2


end


for i=10,1,-1 do    --从10到1,每次-1


end


]]--


--[[eluna开始
    LuaFunctions.cpp      所有函数
    HookMgr.h            所有event事件
    在LuaFunctions.cpp里面的Register...函数就是给指定的游戏对象添加监视器
    (event, function)
    当指定的游戏对象发生你需要的event(在HookMgr.h文件查找),就会调用function
    部分的Register需要指明的物品或者其他entry


]]--


--eluna例子-给物品添加菜单或者功能
    --注意:创建lua,记得在notepad++的格式菜单,选择UTF-8无BOM编码
    --1.首先在LuaFunctions.cpp,找到物品的Register函数
    RegisterItemEvent(entry, event, function)
    RegisterItemGossipEvent(entry, event, function)
    --2.然后在HookMgr.h找到菜单相关的event
    --[[只能在RegisterItemEvent(entry, event, function)的event
    enum ItemEvents
    {
        ITEM_EVENT_ON_DUMMY_EFFECT                      = 1,    // (event, caster, spellid, effindex, item)
        ITEM_EVENT_ON_USE                               = 2,    // (event, player, item, target)    物品使用
        ITEM_EVENT_ON_QUEST_ACCEPT                      = 3,    // (event, player, item, quest)        物品接受任务
        ITEM_EVENT_ON_EXPIRE                            = 4,    // (event, player, itemid)
        ITEM_EVENT_COUNT
    };]]--
    --只能在RegisterItemGossipEvent(entry, event, function)的event
    --[[enum GossipEvents
    {
        显示菜单
        GOSSIP_EVENT_ON_HELLO                           = 1,    // (event, player, object) - Object is the Creature/GameObject/Item
        选择菜单
        GOSSIP_EVENT_ON_SELECT                          = 2,    // (event, player, object, sender, intid, code, menu_id) - Object is the Creature/GameObject/Item/Player, menu_id is only for player gossip
        GOSSIP_EVENT_COUNT
    };]]--
    --3.找到3个相关的
    --ITEM_EVENT_ON_USE和GOSSIP_EVENT_ON_HELLO是一样的,为了方便,一般采用GOSSIP_EVENT_ON_HELLO
    --GOSSIP_EVENT_ON_SELECT
    --4.现在需要指定物品的entry,物品必须是能使用的。    
    local itemEntry=6948    --炉石
    --5.创建函数
    --GOSSIP_EVENT_ON_HELLO对应的函数参数有(event, player, object)
    --GOSSIP_EVENT_ON_SELECT对应的函数参数有(event, player, object, sender, intid, code, menu_id)
    --所以我们创建2个局部函数
    local function Book(event, player, item)


    end
    local function Select(event, player, item, sender, intid, code, menu_id)
    --根据点击的菜单的sender,intid和输入的code(是字符串),进行处理
    end
    --6.查找相关函数
    --我们需要添加菜单,还有把菜单显示出来的函数,用“GOSSIP”搜索函数
    player:GossipMenuAddItem(icon, msg, sender, intid[, code, popup, money])--添加菜单
    player:GossipSendMenu(npc_text, unit[, menu_id])--发送菜单(显示)


    --7.函数分析
    --注意:[参数]是说明[]里面的参数可以不需要
    player:GossipMenuAddItem(icon, msg, sender, intid)
    --(菜单图标号,菜单项文字,sender,intid,code是否需要输入(真-需要/假-不需要),确认提示文字,提示花费铜币
    player:GossipMenuAddItem(icon, msg, sender, intid, code, popup, money)
    --(菜单页文字号,菜单的所有者,在这里就是item)
    player:GossipSendMenu(npc_text, unit[, menu_id])--只有在unit=玩家的时候,menu_id才需要给个数值
    player:GossipComplete()--关闭菜单,一般放到Select函数,菜单在点击后,你再点击也是不会触发Select函数,所以需要关闭
    player:GossipClearMenu()--清除菜单,一般在添加菜单前使用
    --8.查找函数内置的常量
    --[[我们不知道icon,npc_text有哪些。
    这个时候就是用File Seeker或者同样工具,
    a.选择文件夹     服务端的源码(因为eluna可能调用端的常量)
    b.选择文件类型     h cpp
    c.输入关键字,搜索
    ]]--
    --GOSSIP_ICON 菜单图标
    local GOSSIP_ICON_CHAT            = 0                    -- 对话
    local GOSSIP_ICON_VENDOR          = 1                    -- 货物
    local GOSSIP_ICON_TAXI            = 2                    -- 传送
    local GOSSIP_ICON_TRAINER         = 3                    -- 训练(书)
    local GOSSIP_ICON_INTERACT_1      = 4                    -- 复活
    local GOSSIP_ICON_INTERACT_2      = 5                    -- 设为我的家
    local GOSSIP_ICON_MONEY_BAG         = 6                    -- 钱袋
    local GOSSIP_ICON_TALK            = 7                    -- 申请 说话+黑色点
    local GOSSIP_ICON_TABARD          = 8                    -- 工会(战袍)
    local GOSSIP_ICON_BATTLE          = 9                    -- 加入战场 双剑交叉
    local GOSSIP_ICON_DOT             = 10                   -- 加入战场
    --GOSSIP_OPTION
    local GOSSIP_OPTION_NONE            = 0                 --UNIT_NPC_FLAG_NONE
    local GOSSIP_OPTION_GOSSIP          = 1                 -- UNIT_NPC_FLAG_GOSSIP


    --使用
    player:GossipSendMenu(0, unit[, menu_id])
    --如果声明了变量
    player:GossipSendMenu(GOSSIP_OPTION_NONE, unit)
    --9.注册监视函数
    RegisterItemGossipEvent(itemEntry, 1, Book)
    RegisterItemGossipEvent(itemEntry, 2, Select)
    --注意:
    --lua是从上到下的,如果下面的2个Register函数放在Book,Select上面,就会失败。

你可能感兴趣的:(LUA脚本教程)