0.8.0 规则设计思路:
将所有物品进行分类,然后将分类按定义的分类顺序进行排序,之后在同一分类内部,再进行分类,排序。分类的层次没有限制。
打个比方,有一堆积木,先按颜色分成几堆,然后放好顺序(红色堆放第一,后面是黄色 等等),然后在红色里按形状再分成几堆,然后放好顺序。之后在 红色的圆形积木里按尺寸排好顺序,其他照此完成。当然黄色积木中可以先按重量分堆,再按形状分堆。所以整个的排序其实非常的随心所欲。
一.首先需要为自定义的规则定义一个名字,以便在需要使用此规则的地方以名字进行引用
PackUp_Order[
<规则名称>] = { ... }
二.进行规则的详细设置
1.排序定义
(此属性不能省略,必需有)
PackUp_Order[
<规则名称>] = {
...
order =
< PACKUP_ORDER_DESC | PACKUP_ORDER_ASC >,
...
}
PACKUP_ORDER_DESC 逆序/倒序 排序
-- 在 Const.lua 中定义
PACKUP_ORDER_ASC 顺序/正序 排序
-- 在 Const.lua 中定义
2.物品分类映射
(此属性不能省略,必须有,可为空)
PackUp_Order[
<规则名称>] = {
...
map = {
{
<分类规则> },
},
...
}
map 可以为空表即 map = {},
<分类规则>可以为零个,一个或者多个
<分类规则>定义:
{
[0] = { value =
<分类名>, exp =
<表达式定义> },
-- <分类属性定义>
{ key =
<物品属性键>, op =
<操作类型>, value =
<值> },
-- <判断条件>
{ ... }, -- 同上定义
}
请注意顺序:
<分类属性定义> 必须有且只有一个,并必须出现在最前面以 [0] = { ... } 来定义,
<判断条件>跟在其后,可以为零个,一个或者多个
此部分规则的意义:将物品按定义分成几类,你可以将 炉石,坐骑,鱼杆 分在同1个分类中,也可以将他们分在3个不同分类中,甚至可以将完全没有任何关联的两件东西分在同一个分类里。你可以脱离WOW中定义的类型进行分类自定义,没有任何限制。
<判断条件>:
{
key =
<物品属性键>,
op =
<操作>,
value =
<值>,
}
每一条判断条件会根据 key, op, value 来得到一个布尔值,即:
真(true) 或
假(false)
key =
<物品属性键>:
(不能省略)
<物品属性键>在
Const.lua 中定义,以
PACKUP_INFO_ 开头
(请注意<规则名称>不要使用以下字符串)
PACKUP_INFO_ID =
"$ID$" -- 物品 ID
PACKUP_INFO_IDNUM =
"$IDNum$" -- 物品ID的数字
PACKUP_INFO_NAME =
"$Name$" -- 物品名字
PACKUP_INFO_LINK =
"$Link$" -- 物品连接
PACKUP_INFO_RARITY =
"$Rarity$" -- 物品品质
PACKUP_INFO_TYPE =
"$Type$" -- 物品类型
PACKUP_INFO_SUBTYPE =
"$SubType$" -- 物品子类型
PACKUP_INFO_MINILEVEL =
"$MiniLevel$" -- 物品需求等级
PACKUP_INFO_LEVEL =
"$Level$" -- 物品等级
PACKUP_INFO_STACK =
"$StackCount$" -- 物品堆叠数
PACKUP_INFO_EQUIPLOC =
"$EquipLocation$" -- 物品装备位置
PACKUP_INFO_TEXTURE =
"$Texture$" -- 物品 ICON 路径
PACKUP_INFO_QUANTITY =
"$Quantity$" -- 物品数量(某一格中该物品的数量,不是总数)
op =
<操作类型>:
用于指明如何来比较判断 key 与 value
nil 或
"==" : 相等
(若没有写 op,则缺省为此项)
">" : 大于
">=" : 大于等于
"<=" : 小于等于
"<" : 小于
"~=" : 不等于
"~" : 非
"=#" : 匹配正则表达式,此时 value 为正则表达式(字符串)
"~#" : 不匹配正则表达式,此时 value 为正则表达式(字符串)
value =
<值>:
(不能省略)
可以为数字,字符串 等等
<分类属性定义>
[0] = {
value =
<分类名>,
exp =
<表达式定义>,
}
<表达式定义>:
(这里需要有最基本的编程基础,一般的程序语言的手册上,此部分的名称为 逻辑表达式)
$
<数字 n>:代表其后的第n个判断条件的计算值(true 或者 false)
$1 代表其后的第1个判断条件的计算值,$2 代表其后的第2个判断条件的计算值,以此类推
如果
<数字 n>,大于条件判断数,即没有第n个判断条件时,一律使用 false 作为计算值
"true" : 表达式结果为真(true)
"false" : 表达式结果为假(false)
nil 或
"and" : 表达式的结果 = 将所有条件进行与操作
"or" : 表达式的结果 = 将所有条件进行或操作
"&m-n"
将第m个条件到第n个条件进行与操作
m = 0 : 表示第一个判断条件
n = 0 : 表示最后一个判断条件
"|m-n"
将第m个条件到第n个条件进行或操作
m = 0 : 表示第一个判断条件
n = 0 : 表示最后一个判断条件
混合表达式:
"$1 and ($2 or $3)" : 条件2和3的结果相或后,与条件1相与
"$1 or $2-0" : 将条件2之后的条件全部相与,再与条件1相或
除了<分类映射>外,混合表达式是 0.8.0 版本的最大改进之一。
比如可以实现将任务物品中非白色及灰色的物品作为一类物品进行再排序。
<分类名>:
如果 exp =
<表达式定义> 部分的计算结果对于某一物品为 真(true),那么该物品在此规则内的分类名为这个值,即该物品被分在这个类中。
<分类名>将在下面的
<分类排序定义>中用到
3.分类排序定义
PackUp_Order[
<规则名称>] = {
...
[
<分类名>] = { value =
<值>, key =
<物品属性键>, suborder =
<子规则名 | 物品属性键>, order =
< PACKUP_ORDER_DESC | PACKUP_ORDER_ASC >},
...
}
此部分规则的意义:将分成类的物品,按类排序。
value =
<值>:通常这是一个数字,用来表明该类的排序位置,此时 key =
<物品属性键> 被忽略。当 value = nil 时,key =
<物品属性键> 必须存在。
key =
<物品属性键>:当 value =
nil 时,此定义必须存在。用来指示从
<物品属性键> 上获取 value 值。
suborder =
<子规则名 | 物品属性键>:
suborder =
<子规则名>:子规则名必须被定义,此时 order 属性被忽略(因为在子规则中有定义自己的order)。在此规则的分类排序完成后,将所有划归该
<分类名> 的物品按 suborder 的规则定义进行分类、排序。
suborder =
<物品属性键>:此时 order 属性必须存在,用来指明得到的物品属性值如何来排序。
注意:将 value = nil 时,请确认你完全清楚将会发生什么。否则排序结果可能匪夷所思。
4.缺省分类
假设
<分类名>在 分类排序定义 中未被定义,那么将会使用缺省分类目中的规则定义。
PackUp_Order[
<规则名称>] = {
...
[
PACKUP_ORDER_KEY_DEFAULT] = { value =
<值>, key =
<物品属性键>, suborder =
<子规则名 | 物品属性键>, order =
< PACKUP_ORDER_DESC | PACKUP_ORDER_ASC >},
...
}
PACKUP_ORDER_KEY_DEFAULT =
"#" -- 在 Const.lua 中定义,请注意自定义分类不要使用这个字符串
规则属性的定义参照 分类排序定义。
三.背包相关引用:
BagConfig.lua
PACKUP_BAGID_BODYID = 0 -- 身上自带背包
PACKUP_BAGID_BANKID = -1 -- 银行自带的格子(TBC是24个)
PACKUP_BAGID_KEYID = -2 -- 钥匙链
以上为系统指定数据,不能更改
PACKUP_BAGID_BODY = { -- 身上背包选项
{bagID = <背包ID>, enable = <是否参与整理/压缩>, order = <排序>},
}
bagID = <背包ID>
背包的ID,此为系统指定数据,不能更改
enable = <是否参与整理/压缩/打乱>
true : 参与整理/压缩/打乱操作
false : 不参与整理/压缩/打乱操作
order = <排序>
PACKUP_ORDER_ASC : 顺序/正序
PACKUP_ORDER_DESC : 逆序/倒序
PACKUP_BAGID_BANK = {
{bagID = <背包ID>, enable = <是否参与整理/压缩>, order = <排序>},
}
说明同上
关于背包的排序规则的选择:
插件首先根据 PACKUP_BAGID_BODY 和 PACKUP_BAGID_BANK 的设置,将所有参与整理的包放入列表,并对此列表进行排序,得到所有需要整理的包的类型。
引用:
Const.lua
-- Fix Order Name
PACKUP_FIXORDER_BAG = "$FixOrderBag$"
PACKUP_FIXORDER_COMMON = "$FixOrderCommon$"
-- Fix Order Rule
PackUp_FixOrder_Bag = { ... }
PackUp_FixOrder_Common = { ... }
PackUp.lua
PackUp.onVarLoaded = function()
PackUp_Order[PACKUP_FIXORDER_BAG] = PackUp_FixOrder_Bag
PackUp_Order[PACKUP_FIXORDER_COMMON] = PackUp_FixOrder_Common
...
end
根据得到的要参与整理的包类型进行逐步整理操作。
引用:
PackUp.lua
PackUp.puOrder = function(sBagType)
...
if sBagType and PackUp_Order[sBagType] then
PackUp.order.sort(PackUp.itemList, 1, iLen, sBagType, PackUp_Order[sBagType].order)
elseif PackUp_Order[PACKUP_FIXORDER_COMMON] then
PackUp.order.sort(PackUp.itemList, 1, iLen, PACKUP_FIXORDER_COMMON, PackUp_Order[PACKUP_FIXORDER_COMMON].order)
else
PackUp.trace(PACKUP_ERR_NORULE)
end
...
end
首先,搜索符合 sBagType 名字的排序规则是否存在,如果不存在,则看是否存在 PACKUP_FIXORDER_COMMON 的排序规则(就是 Const.lua 里定义的缺省规则),如果还不存在,则报错:没有规则。
sBagType 可能的值定义在 localization.lua 中,因为包类型和语言有关。
-- Bag Type
PACKUP_BAGTYPE_NORMAL = "容器"
PACKUP_BAGTYPE_KEYRING = "钥匙链"
PACKUP_BAGTYPE_QUIVER = "箭袋"
PACKUP_BAGTYPE_AMMO = "弹药袋"
PACKUP_BAGTYPE_SOUL = "灵魂袋"
PACKUP_BAGTYPE_HERB = "草药袋"
PACKUP_BAGTYPE_ENCHANT = "附魔材料袋"
-- TBC Bag Type
PACKUP_BAGTYPE_MINE = "矿石袋"
PACKUP_BAGTYPE_GEM = "宝石袋"
PACKUP_BAGTYPE_ENGINEER = "工程学材料袋"
由此可以针对某一类型的包写特定的排序规则。
关于某种类型的包可放置物品的定义:
BagConfig.lua
PackUp_BagSpec[<包类型>] = {
[0] = { enable = <无用字段,忘了去掉>, exp= <表达式定义> }, -- 参考上一大节中的<分类属性定义>部分
{ key = <物品属性键>, op = <操作类型>, value = <值> }, -- 参考上一大节中的<判断条件>部分
{ ... }, -- 同上定义
}
根据 exp 的最终计算值来判断某物品是否可以放入某种<包类型>的包中。
四.系统缺省设定