--[[工具准备
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脚本教程的更多相关文章

  1. Lua脚本语言入门学习其应用教程

    Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更 ...

  2. Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能

    欢迎增加 Cocos2d-x 交流群: 193411763 视频教程地址:http://www.tudou.com/programs/view/qRiOfppMghM/ 转载请注明原文出处:http: ...

  3. wireshark lua脚本

    1.目的:解析rssp2协议   2.如何使用wireshark lua插件 将编写的(假设为rssp2.lua)lua文本,放入wireshark 安装目录下,放哪里都行只要dofile添加了路径. ...

  4. 在lua脚本中使用我们自定义的精灵类

    首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite // // HSprite.h // cocos2dx_lua_tests_by_Himi ...

  5. Lua 脚本语法说明(转)

    Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得 ...

  6. Redis结合Lua脚本实现高并发原子性操作

    从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚 ...

  7. Redis学习笔记(三)使用Lua脚本实现分布式锁

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 使用Lua脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放 ...

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

    本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...

  9. cocos2d-x-lua如何导出自定义类到lua脚本环境

      这篇教程是基于你的工程是cocos2d-x-lua的项目,我假设你已经完全驾驭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互调的一些原理. 我们的目的是要在 ...

随机推荐

  1. Criterion & DetachedCriteria

    今天笔记主要是记录笔记,以及代码: criteria: 创建查询接口:createCriteria(class) 查询条件接口:add(各种条件); Restrictions 提供了设置参数的各种接口 ...

  2. 讲解Python中的递归函数

    本文的最重要的收获在于:尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式. 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例 ...

  3. 【转载】CSS规范

    原文地址:http://www.cnblogs.com/whitewolf/p/4491707.html 目录 HTML 语法 HTML5 doctype 语言属性(Language attribut ...

  4. USACO2011Brownie Slicing巧克力蛋糕切片

    Description     Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的. 第i行,第j列的蛋糕有N_ij(1 < ...

  5. N的阶乘末尾0的个数和其二进制表示中最后位1的位置

    问题一解法:     我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10, 我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个 ...

  6. i.BIO方式的SSL通道流程

    前面已经讲解了BIO通道的整体流程,对于SSL的流程是插在通道中的,在BIO通道的初始化的时候,根据Connector配置的SSLEnabled属性进行SSL的逻辑. 主要集中的位置在JIOEndpo ...

  7. Django1.9开发博客(13)- redis缓存

    Redis 是一个高性能的key-value数据库.redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用. 它提供了Pyth ...

  8. unity htc vive使用

    本文介绍如何在Unity中使用HTC vive设备,当前VR作为市场比较火热的热点,HTC VIVE设备作为三大供应商之一,许多人购买了该设备,却不知道如何使用,本文通过图文并茂的形式,进行手把手的讲 ...

  9. python的基础类源码解析——collection类

    1.计数器(counter) Counter是对字典类型的补充,用于追踪值的出现次数. ps:具备字典的所有功能 + 自己的功能 ################################### ...

  10. 如何根据不同的浏览器写不同的css样式达到兼容

    做前端静态页面的时候总是发现,ie的兼容性很差,总会出点问题.然后就去改代码 ,改完以后 又发现 火狐 谷歌又挂了,这可咋整.     后来发现做个判断吧 哪里有问题哪里就做个判断呗 ,咋判断呢,这么 ...