魔兽世界LUA插件开发
1.创建插件
1.1 创建插件文件夹
打开World of Warcraft\Interface\AddOns文件下,在该文件夹下创建一个插件名文件夹用来存放插件,如Makubex
1.2 创建插件文件
在该文件夹下创建俩个文件,一个是用来给魔兽世界引入的toc头文件,一个是你自己的lua脚本文件
1.3 toc头文件makubex.toc
## Interface: 11200
## Title: Makubex
## Version: 1.19
## Notes: 脚本叫什么就引入什么
Makubex.lua
1.4 lua脚本文件makubex.lua
print("helloworld")
2.创建斜杠命令
2.1 声明方法
在lua脚本中写一个方法
function test()
print("helloworld")
end
注册斜杆命令,其中的XXXX可以替换成任何变量名,用来后续绑定方法
SLASH_XXXX1 = "/aaa"
绑定方法,上面的XXXX填进来
SlashCmdList["XXXX"] = test
这时在游戏打/aaa就会触发test方法了,成品lua
function test()
print("helloworld")
end
SLASH_XXXX1 = "/aaa"
SlashCmdList["XXXX"] = test
3.调用API示例
3.1 发消息API
SendChatMessage(msg[,chatType,languageID,target])
chatType:消息类型
"SAY" - 附近玩家(1)
"YELL" - 大喊(1)
"PARTY" - 小队
"RAID" - 团队
"RAID_WARNING" - 团队警告
"WHISPER" - 密语
"CHANNEL" - 频道(1)
.....
languageID:语言ID可填nil空
target:目标可填nil空
调用发消息API
输入/aaa,触发test方法,调用SendChatMessage在附近玩家频道说helloword
function test()
SendChatMessage("helloword", "SAY", nil, nil)
end
SLASH_XXXX1 = "/aaa"
SlashCmdList["XXXX"] = test
输入/aaa,触发test1方法,调用SendChatMessage在附近玩家频道说helloword
输入/bbb,触发test2方法,调用SendChatMessage在大喊频道说helloword
function test1()
SendChatMessage("helloword", "SAY", nil, nil)
end
function test2()
SendChatMessage("helloword", "YELL", nil, nil)
end
SLASH_XXXX1 = "/aaa"
SlashCmdList["XXXX"] = test1
SLASH_TTTT1 = "/bbb"
SlashCmdList["TTTT"] = test2
3.2 框体API
frame = CreateFrame(frameType[,name,parent,template,id])
frame:SetSize(x,y)
frame:SetPoint("",[...])
/fstack
frame:SetBackdrop({
bgFile = "bgFile",//"Interface\\Tooltips\\UI-Tooltip-Background"
edgeFile = "edgeFile",//"Interface\\Tooltips\\UI-Tooltip-Border"
edgeSize = 0
insets = { left = 0, right = 0, top = 0, bottom = 0 }
})
frame:SetBackdropColor(r,g,b,a)
frame:SetBackdropBorderColor(r,g,b,a)
frame:Show()
frame:Hide()
UIParent
调用框体API
创建一个框体对象给aaa变量保存
aaa = CreateFrame("Frame","第一个框体",nil)
设置框体大小
aaa:SetSize(300,300)
设置位置居中
aaa:SetPoint("CENTER")
在游戏中查看框体信息
/fstack
设置边框样式
aaa:SetBackdrop({
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 10
})
设置背景颜色
aaa:SetBackdropColor(1,0,0,0.5)
设置边框颜色
aaa:SetBackdropBorderColor(0,0,1,1)
显示窗口
SLASH_SHOW1 = "/sss"
SlashCmdList["SHOW"] = function()
aaa:Show()
end
隐藏窗口
SLASH_HIDE1 = "/ddd"
SlashCmdList["HIDE"] = function()
aaa:Hide()
end
成品lua
aaa = CreateFrame("Frame", "第一个框体", nil)
aaa:SetSize(300, 300)
aaa:SetPoint("CENTER")
aaa:SetBackdrop({
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
edgeSize = 10
})
aaa:SetBackdropColor(1, 0, 0, 0.5)
aaa:SetBackdropBorderColor(0, 0, 1, 1)
SLASH_SHOW1 = "/sss"
SlashCmdList["SHOW"] = function()
aaa:Show()
end
SLASH_HIDE1 = "/ddd"
SlashCmdList["HIDE"] = function()
aaa:Hide()
end
3.3 返回生命值API
UnitHealth(unitID)
调用返回生值API
aaa = UnitHealth("player")
print(aaa)
循环读取生命值,如果生命值小于400,则打印生命并退出循环
(不建议使用这种方法,因为会造成卡死,建议用事件API)
while 1 do
if UnitHealth("player") <= 400 then
print(UnitHealth("player"))
return
end
end
3.4 事件API
生命值发生变化事件API
UNIT_HEALTH:unitTarget
进入战斗状态事件API
PLAYER_REGEN_DISABLED
退出战斗状态事件API
PLAYER_REGEN_ENABLED
注册事件API
frame:RegisterEvent(event)
事件触发函数API
frame:SetScript(event,handler)
调用事件API
事件触发函数调用的时候会把框体对象当做参数传进来交给y,发生的子事件会交给总事件OnEvent,OnEvent传给event参数,…事件的对象,如UNIT_HEALTH(“player”),那么…就等于player
如果事件等于生命值改变,则把对象赋值给ccc,如果ccc生命值小于400,则打印输出400
function xxx(y, event, ...)
if event == "UNIT_HEALTH" then
local ccc = ...
if UnitHealth("player") <= 400 then
print("生命小于400")
end
end
end
aaa = CreateFrame("Frame")
aaa:RegisterEvent("UNIT_HEALTH")
aaa:SetScript("OnEvent", xxx)
调用进入战斗退出战斗事件
function xxx(y, event)
if event == "PLAYER_REGEN_DISABLED" then
print("进入战斗")
elseif event == "PLAYER_REGEN_ENABLED" then
print("退出战斗")
end
end
aaa = CreateFrame("Frame")
aaa:RegisterEvent("PLAYER_REGEN_DISABLED")
aaa:RegisterEvent("PLAYER_REGEN_ENABLED")
aaa:SetScript("OnEvent", xxx)
调用被怪物打日志事件
可以只接收要的返回值,不需要的直接_代替
function xxx(y, event, ...)
if event == "COMBAT_LOG_EVENT_UNFILTERED" then
local _, bbb, _, _, sender, _, _, _, name, _, _, _, SpellName = CombatLogGetCurrentEventInfo()
if (bbb == "SPELL_AURA_APPLIED") and (name == "厄运小王子") then
print(1)
print(sender .. "->" .. name .. "(" .. SpellName .. ")")
print(2)
end
print(CombatLogGetCurrentEventInfo())
end
end
aaa = CreateFrame("Frame")
aaa:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
aaa:SetScript("OnEvent", xxx)
print("end")