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上面,就会失败。

span {
font-family: ‘微软雅黑‘;
font-size: 10pt;
color: #839496;
}
.sc0 {
}
.sc1 {
font-style: italic;
color: #586e75;
}
.sc2 {
font-style: italic;
color: #586e75;
}
.sc4 {
color: #2aa198;
}
.sc5 {
color: #859900;
}
.sc10 {
color: #93a1a1;
}
.sc11 {
}

时间: 2024-10-18 01:58:44

lua脚本教程的相关文章

lua脚本之lua语言简介以及lua的安装

本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设计旨在项目中扩展功能,因此其内核小而稳定.在游戏开发中,Lua在用户界面.游戏数据管理.实时游戏事件管理.游戏人工智能.创建功能原型等方面具有强大的支持.Lua不能直接访问数据库,但可以通过整合其他语言组件来访问数据库:对于一些耗时要求更高效率的工作,一般交给更加底层的语言去完成,Lua只是起到整合

Redis集成Lua脚本实现

作者:zhanhailiang 日期:2014-12-02 相关依赖 1. 环境部署 Redis安装配置教程及phpredis扩展安装测试 Redis安装以及php扩展 Windows下安装phpredis模块(当前Window环境下的php_redis.dll基本还是2.1.3,而Linux下的redis.so版本已经到了2.2.5,这可能导致部分指令集的支持程度不同) 2. Redis指令手册 php-redis中文帮助手册.chm(这份手册相对较旧,请参照Redis Commands) R

Lua简明教程

这几天系统地学习了一下Lua这个脚本语言,Lua脚本是一个很轻量级的脚本,也是号称性能最高的脚本,用在很多需要性能的地方,比如:游戏脚本,nginx,wireshark的脚本,当你把他的源码下下来编译后,你会发现解释器居然不到200k,这是多么地变态啊(/bin/sh都要1M,MacOS平台),而且能和C语言非常好的互动.我很好奇得浏览了一下Lua解释器的源码,这可能是我看过最干净的C的源码了. 我不想写一篇大而全的语言手册,一方面是因为已经有了(见本文后面的链接),重要的原因是,因为大篇幅的文

wireshark lua脚本

1.目的:解析rssp2协议 2.如何使用wireshark lua插件 将编写的(假设为rssp2.lua)lua文本,放入wireshark 安装目录下,放哪里都行只要dofile添加了路径. 并且在安装目录下找到init.lua,最后一行添加路径代码 : dofile(DATA_DIR.."RSSP2.lua")    3.介绍 解析由rssp2.lua.p2_data.lua.p2_parse.lua3个文件组成.如果协议内容很少,一个lua文件就能完全解决.init.lua会

Java中使用Lua脚本语言(转)

Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率.增强你的程序可扩展性. 首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库.我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keple

online_jf.lua --累计在线时间领取物品(积分)的lua脚本

原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 --------------------------------------------------------------惯例写在前面: 写这玩意其实学习性更大于目的性..= =研究了两天晚上写的我人参中滴第一个lua脚本,居然还真给我写出来了,好感动由于写代码的基础基本是零 所以碰了N+N次壁 什么函数字母大小写还要区分  -- 闹哪样啊喂 因为这个原因我试了半个多钟才发现问题所在什么函

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

redis限速器设计(不使用lua脚本及事物)

公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器. 首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例 FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+":"+ts current = GET(keyname) IF current != N

wax lua 脚本升级练习(2)

wax lua 脚本升级练习(1)介绍了object-c通过调用lua中的函数计算两值乘积并返回显示. 这一篇将介绍通过点击按钮下载新的lua脚本文件,并且热加载lua,使起能即时生效. 在写代码前需要做一点点准备. 1.启动本机的Apache服务,作为新lua脚本的存放位置 打开"终端(terminal)",输入sudo apachectl start(可能需要输入机器秘密),打开Safari浏览器地址栏输入 "127.0.0.1",可以看到内容为"It