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= --炉石
--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 = -- 对话
local GOSSIP_ICON_VENDOR = -- 货物
local GOSSIP_ICON_TAXI = -- 传送
local GOSSIP_ICON_TRAINER = -- 训练(书)
local GOSSIP_ICON_INTERACT_1 = -- 复活
local GOSSIP_ICON_INTERACT_2 = -- 设为我的家
local GOSSIP_ICON_MONEY_BAG = -- 钱袋
local GOSSIP_ICON_TALK = -- 申请 说话+黑色点
local GOSSIP_ICON_TABARD = -- 工会(战袍)
local GOSSIP_ICON_BATTLE = -- 加入战场 双剑交叉
local GOSSIP_ICON_DOT = -- 加入战场
--GOSSIP_OPTION
local GOSSIP_OPTION_NONE = --UNIT_NPC_FLAG_NONE
local GOSSIP_OPTION_GOSSIP = -- UNIT_NPC_FLAG_GOSSIP --使用
player:GossipSendMenu(, unit[, menu_id])
--如果声明了变量
player:GossipSendMenu(GOSSIP_OPTION_NONE, unit)
--9.注册监视函数
RegisterItemGossipEvent(itemEntry, , Book)
RegisterItemGossipEvent(itemEntry, , Select)
--注意:
--lua是从上到下的,如果下面的2个Register函数放在Book,Select上面,就会失败。
lua脚本教程的更多相关文章
- Lua脚本语言入门学习其应用教程
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更 ...
- Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能
欢迎增加 Cocos2d-x 交流群: 193411763 视频教程地址:http://www.tudou.com/programs/view/qRiOfppMghM/ 转载请注明原文出处:http: ...
- wireshark lua脚本
1.目的:解析rssp2协议 2.如何使用wireshark lua插件 将编写的(假设为rssp2.lua)lua文本,放入wireshark 安装目录下,放哪里都行只要dofile添加了路径. ...
- 在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite // // HSprite.h // cocos2dx_lua_tests_by_Himi ...
- Lua 脚本语法说明(转)
Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得 ...
- Redis结合Lua脚本实现高并发原子性操作
从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚 ...
- Redis学习笔记(三)使用Lua脚本实现分布式锁
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 使用Lua脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放 ...
- lua脚本之lua语言简介以及lua的安装
本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解. 一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...
- cocos2d-x-lua如何导出自定义类到lua脚本环境
这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理. 我们的目的是要在 ...
随机推荐
- css文字两端对齐
css文字两端对齐 text-align:Justify(火狐); text-justify:inter-ideograph(IE) text-justify(IE) 基本语法 text-justif ...
- C++中 接口的定义 COM
首先定义一个虚基类的接口,其中包含虚函数AddRef Release QueryInterface,(MFC 类IUnKnown unknwn.h)分别是增加减去引用计数和查询接口然后定义一个实现类, ...
- C中的Float分析
C/C++中, 浮点数,float以及 double 在内存中是怎样存储的? 假如,我有32-bit 8bit 8bit 8bit 0 0 0 0 0 1 1 1 1 对于整形int,我们可以很快得出 ...
- 学习笔记 DataGridView数据导出为Excel
DataGridView数据导出为Excel 怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...
- vue服务端渲染
这篇文章写得还蛮好https://segmentfault.com/a/1190000006701796 从官方网站下载了例子看,用es6写的,还好之前看过es6不然都看不懂,正好es6的东西一起熟悉 ...
- 用JDBC访问MySQL
/* 在数据库中创建一个Employee的类 create table Employee( id int primary key, name varchar(20), age int); */ imp ...
- maven设置
<localRepository>D:/apps/eclipse/env/maven/repository</localRepository>
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...
- 1900. Brainwashing Device
http://acm.timus.ru/problem.aspx?space=1&num=1900 题目大意: 有N个车站,相邻车站之间形成一个段,这样就有N-1个段,每个段最多可以放一个洗脑 ...
- WinRT知识积累2之MessageDialog应用代码
private void NavigationHelper_SaveState(object sender, SaveStateEventArgs e) { // TODO: 在此处保存页面的唯一状态 ...