作者aegius1r (KCD)
看板WOW
标题[心得] Weakauras aura环境 储存变数 TSU
时间Thu Jun 14 15:12:13 2018
有点久没写weakaura的文章了
这次想讲的东西会相对进阶一点 如果对lua完全陌生的人就..end吧
(啥
但如果稍微看得懂 又想做一些比较麻烦的功能 那这篇应该可以帮上一点忙
另外基本上我一直都是自己边做边找ref 所以如果有讲错就不负责啦 XDD
本篇会讲的东西有 1. aura_env 环境
2. WeakAurasSaved 储存变数
3. Trigger State Updater (TSU)
1. aura_env 环境
https://github.com/WeakAuras/WeakAuras2/wiki/The-Aura-Environment
首先从weakaura的架构讲起
在建好一个aura以後 Weakaura首先会生一个对应的table出来
这个table叫做
aura_env
而关於这个weakaura的资讯 都会存在这个table当中
如果在weakaura的自订触发当中 抓到了一个字串
(比方说可能对话纪录传进来 拿到一个ID之类的)
那我想把它显示在提醒效果的文字部分 该怎麽做呢?
变数这种东西是有范围的
当然不能用local变数 会直接抓不到
用global范围又太大 搞不好哪天被其他aura或addon盖掉就尴尬了
於是我们就把他附在aura_env这个table中
举个例子 假设今天从 触发/自订/事件/CHAT_MSG_WHISPER
(
https://wow.gamepedia.com/index.php?title=CHAT_MSG_WHISPER )
传进来一个密语 (这是有人密你的时候会触发的event ↑)
那触发那边可以用 ->
https://imgur.com/03b5DeX.jpg
https://imgur.com/e7lFFKe.jpg
function(event, ...)
local message, author = ...
--只取前两个 反正後面不想用XD
aura_env.text = author .. ":" .. message
-- 在这边建个变数 等下可以用; 我希望显示 "密的人:他说的话"
return true
end
接着在 提醒效果/提醒效果文字 这边 我们用%c去接
自订函数用 ->
https://imgur.com/ZJUaRqW.jpg
function()
return aura_env.text or ""
-- nil check
end
这样就简单建好一个 有人密你的时候 把密语内容接起来
显示在文字部分的aura了
成果:
https://pastebin.com/pJBCJJHA
那aura_env不只是自己接变数可以用 他本身也有很多东西存在里面
就算不是用自订变数也一样
举例来说 aura_env.id 这个就是aura本身的名称
aura_env.state 这个是当触发出来以後 储存一些资讯的table
aura_env.state.stacks 就是触发的堆叠 在提醒效果的%s
aura_env.state.icon 触发的图示 %i
aura_env.state.duration 触发的持续时间 %p ......等等
其他可用的变数可以看这段最上面的连结 或是自己用loop去call看看
(for k,v in pairs(aura_env) do print(k,v) end)
善用这些变数 就可以在提醒效果中自由组合 加判断式去写一堆东西
但记得要做nil check 因为aura_env.state这东西不会那麽快建出来
另外我自己习惯是 只要是变数或函数(function)
能的话我都会在aura的初始化时定义出来
於是aura的初始化通常会长成这样
https://imgur.com/MJ5lEel.jpg
有点像header档 XD
2. 储存变数
光是有aura_env还不够啊
我希望拿到一个变数 我可以把它存起来 搞不好我换角色也想看
甚至我想把某些跨角色的数值加起来算一下 到底我现在总共有多少钱!
Weakaura会把变数存在
WeakAurasSaved["displays"][aura_env.id]里面
(display是储存所有aura内容的table 而aura_env.id当然就是我们用的aura名称)
而实际的储存位置会在
World of Warcraft\WTF\Account\帐号\SavedVariables\WeakAuras.lua 这里
如果你真的去开这个lua档 就会看到一堆table 大概像
https://imgur.com/fpbKssQ.jpg
於是我们也可以照样操作
举例来说 我想算到底我的总财产有多少
先建个aura 类型文字 触发就自订/状态/所有框架 ->
https://imgur.com/83Sv08v.jpg
https://imgur.com/KcY228m.jpg
function()
WeakAurasSaved["displays"][aura_env.id]["Money"] =
WeakAurasSaved["displays"][aura_env.id]["Money"] or {}
-- 先建一个table来放资料 但是要看有没有预设存档 没有才建
WeakAurasSaved["displays"][aura_env.id]["Money"][UnitName("player")]
= GetMoney()/10000
-- GetMoney传回目前有多少钱 但单位是铜 所以要除10000
aura_env.sum = 0
-- 开始计算总数
for k,v in pairs(WeakAurasSaved["displays"][aura_env.id]["Money"]) do
aura_env.sum = aura_env.sum + v
end
return true
end
显示部分一样用%c ->
https://imgur.com/xyHFzF0.jpg
function()
return aura_env.sum or 0
-- nil check
end
之後只要登入角色 这个aura就会去抓目前钱的总数
自己储存加总 然後告诉你有多少 XD
(这时候的SavedVariables\weakauras.lua就会像
https://imgur.com/OHOyz8R )
成果:
https://pastebin.com/33whNtWY
要提醒的是 建议建一个
WeakAurasSaved["displays"][aura_env.id]["Data"] 之类的table 来储存所有的变数
这样如果你要清空资料 只要把这整个table wipe掉就好
不然你去开SavedVariables\weakauras.lua看
还有这个aura本身储存的各种资料变数 保证乱成一团 XD
3. Trigger State Updater (TSU) 触发状态更新
https://github.com/WeakAuras/WeakAuras2/wiki/Trigger-State-Updater-(TSU)
要是到这边还跟着上 由衷佩服你 这些东西我搞了好久QQ
通常 一个aura就是对应到一个显示
但是有时候会希望 a. 同一个aura 可以给很多类似的东西用 显示N次
而我不希望类似的aura重复copy个好几遍 每个只改个光环名称
b. 做的时候根本还不知道要显示几遍 抓出来才知道
这时候就可以用TSU来做
开weakaura介面 看一下触发/自订/事件类型
以往比较常用的是事件跟状态
现在要用的则是触发状态更新
https://imgur.com/Buju2xD.jpg
这次拿小队来当例子 如果我想要显示每一个人的血量好了
(话说这功能不是小队框架就有了吗? 可是我一时之间想不到好做的范例嘛 QQ)
先建一个进度条 载入部分只在队伍中
https://imgur.com/2AFfpC7.jpg
检查的部分用所有框架 稍微省事一点 虽然有点吃效能
触发状态更新会把allstates这个表传进来 当作第一个变数 所以function要去接他
(如果检查部分用事件 那event, args就从第二个参数开始)
function(
allstates) -- 记得接这个table!
for i = 0, 4 do
local unit = (i == 0 and "player" or "party"..i)
-- party1~4是小队其他人 自己不在编号内 只好这样搞
if UnitExists(unit) then -- 确认这个人存在
allstates[i] = {
-- TSU的部分开始
changed = true,
show = true,
name = UnitName(unit),
progressType = "static",
value = UnitHealth(unit),
total = UnitHealthMax(unit),
}
end
end
return true
end
->
https://imgur.com/N8R9Ie3.jpg
来细讲TSU那段在干嘛
首先我们改了allstate[i] 刚刚i是0~4 分别代表小队中的每个人编号
changed 这个状态i被改过了
show 这个状态i我希望它显示出来 以上两个刚建立时一定都是true
name 我希望出来的名称是谁 可以用%n接
progressType 进度条的类型 有分timed跟static
timed就是算时间 分别传两个number给duration跟expirationTime
跟平常用进度条的方法比较像 可以设定时间到会消失
static是自订进度 这边用value是UnitHealth(unit) 第i个人的血量
total是UnitHealthMax(unit) 第i个人的总血量
而duration/value可以用%p接 expirationTime/total可以用%t接
其余还有icon, texture, stacks等等
或是也可以自定义 比方说我做了个 class = UnitClass("unit") 来抓职业
那之後就可以用aura_env.state.class来读这个info
显示文字时也可以用%class来接
於是写好了触发以後 进度条左边摆 %n 右边摆%p/%t
稍微改一下样式 显示出来就是一个会自动copy的进度条
让你看小队里面所有人的血量
https://imgur.com/BX391qk.jpg
..然後你会发现 有两个人以上他就糊在一起惹
https://imgur.com/pxaUPfS.jpg
废话 你做了两个进度条 把他们摆在同样的位置 不糊才有鬼
所以
再建一个动态模组 把这个进度条丢进里面 https://imgur.com/p7vteld.jpg
他就会帮你安排群组增长 对齐 置中等等样式了
这时候你会发现 有人退队了 阿他的血条还在?
原因是我们注册了allstates 在该不见时却没有把他移除掉
那最简单的方式是 每一次检查我都把所有的人移除掉 重新放就好了嘛
在刚刚那段code的第二行 加上
for k,v in pairs(allstates) do
allstates[k].changed = true
allstates[k].show = false
end
->
https://imgur.com/Ai69Y2Z.jpg
在每一次更新时 他都先把每一个状态标示为有改变 然後不显示
这样如果後面没被建起来 这个状态就会被消去 达到我们的目的
大概就是这些 反正自己动手做看看 应该会多少做出一点成果
然後不要怕bugsack一直逼逼叫 这是正常的 修到他不会叫就及格了 XD
成果:
https://pastebin.com/B6V4EBfj
底下摆一些作品
https://wago.io/r1eVBDiaG 算整个帐号的荣誉值总量 转换成等级
不知道bfa会怎麽换算过去 所以之後可能会再改XD
https://wago.io/B1EWsFWkm 帮到达斩杀线的目标 血条上个标
https://wago.io/HyUtnL-e7 看黑市的时候 储存资料
并且传给跟自己同公会/同频道(要自己设定) 的人
这样你朋友看黑市 你也会知道有那些东西
https://wago.io/H1AoOSYAG 当你afk 有人密你/在频道提到设定的关键字的时候
把讯息存起来 等你不再afk或下次登入时秀出来看
还有其他东西 我现在都丢wago.io了
https://wago.io/p/aegius1r
以上~
直接end的举个手 ._./
--
葡萄酒商勒修斯说:进到桶子,踏踩那些水果!
葡萄酒商勒修斯说:进到桶子,踏踩那些水果!
葡萄酒商勒修斯说:进到桶子,踏踩那些水果!
葡萄酒商勒修斯说:进到桶子,踏踩那些水果!
葡萄酒商勒修斯说:进到桶子,踏踩那些水果!
凡席尔说:你一定能成为厉害的酒商!又有一批秘能酒准备好出货了。乾 真的是你耶
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.116.66.1
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/WOW/M.1528960349.A.BC1.html
1F:推 MoodSwings: 我还不怒推一把假装看得懂! 06/14 15:14
2F:推 sherwinc: ._./ 跟我想的差不多 06/14 15:15
3F:推 zoidsx: 辛苦了,打个游戏还要写程式还要教程式Q…Q 06/14 15:27
好玩就好XD
4F:推 eric30215: 嗯!果然跟我想的一样呢 06/14 15:50
5F:推 escescsoso: 原来如此!完全不懂! 06/14 16:24
6F:推 FrankWOO: ._./ 06/14 17:14
7F:推 sniper2824: 哇 好猛 推个 06/14 17:55
8F:推 corpserun: 请问可以做一个解开AFK後会自动喊话的WA吗 06/14 18:19
10F:推 corpserun: 好 我要改 俺回来啦 准备开火啦 06/14 18:44
11F:→ corpserun: 可正常作用 感谢哥 06/14 18:46
12F:推 shendale33: ._./ 06/14 19:13
13F:推 becca945: 赞 俺回来啦 准备开火啦 06/14 19:14
14F:推 Feverist: 推推推推 06/14 21:29
15F:推 Zazzi: 只要是wa的我就推 06/14 21:59
16F:推 a84474666: 原来乾爹是从这边做的....刚刚出团还在分享 06/15 02:45
17F:推 Aldefael: 感谢分享!帮助很大!另外请教下某个AURA要即时取另个AURA 06/15 03:12
18F:→ Aldefael: 资料的话用WeakAurasSaved有缺点吗?之前不知道有这个 06/15 03:13
19F:→ Aldefael: WeakAurasSaved,都是用WeakAuras.ScanEvents用事件丢 06/15 03:15
20F:→ Aldefael: 这样接的AURA就要加个触发有时很乱.. 06/15 03:15
21F:→ aegius1r: 缺点大概就是不能随意更动名称吧? 我没有这样做过 不过 06/15 03:28
22F:→ aegius1r: 应该是没有其他问题@@ 06/15 03:28
23F:推 Aldefael: 感谢分享! 06/15 18:22
补充接自订info的部分
※ 编辑: aegius1r (122.116.66.1), 08/02/2018 09:29:11
24F:推 fenir: 推推 帮助很大 10/10 13:09
25F:推 i9992200032: 想请问有没有办法储存在这场战斗中 此事件发生了几次 10/14 14:29
26F:→ i9992200032: 并显示 想了很久 不知道要从何下手去写 10/14 14:29
27F:→ aegius1r: 用自订事件接触发 应该可以接到每一次 把他存到某个变数 10/21 19:35
28F:→ aegius1r: 显示文字用那个变数 在脱离战斗时清空 10/21 19:36
29F:→ aegius1r: (PLAYER_REGEN_ENABLED) 10/21 19:36