--[[工具准备
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上面,就会失败。