Asa@100
|
1 local ItemAuditor = select(2, ...)
|
Asa@100
|
2 local CraftingRules = ItemAuditor:NewModule("CraftingRules")
|
Asa@100
|
3 print('CraftingRules')
|
Asa@100
|
4 local Crafting = ItemAuditor:GetModule("Crafting")
|
Asa@100
|
5 local Utils = ItemAuditor:GetModule("Utils")
|
Asa@100
|
6
|
Asa@100
|
7 ItemAuditor.DB_defaults.char.rules_default_veto = false
|
Asa@100
|
8 ItemAuditor.DB_defaults.char.rules = {
|
Asa@100
|
9
|
Asa@100
|
10 }
|
Asa@100
|
11
|
Asa@107
|
12 local function mergeDefaultValues(rule)
|
Asa@107
|
13 if nil == rule.search then
|
Asa@107
|
14 rule.search = ""
|
Asa@107
|
15 end
|
Asa@107
|
16 if nil == rule.target then
|
Asa@107
|
17 rule.target = 0
|
Asa@107
|
18 end
|
Asa@107
|
19 if nil == rule.skip_singles then
|
Asa@107
|
20 rule.skip_singles = false
|
Asa@107
|
21 end
|
Asa@107
|
22 return rule
|
Asa@107
|
23 end
|
Asa@107
|
24
|
Asa@100
|
25 local print = function(message, ...)
|
Asa@100
|
26 ItemAuditor:Print(message, ...)
|
Asa@100
|
27 end
|
Asa@100
|
28
|
Asa@100
|
29 local Options = {
|
Asa@100
|
30 header_result = {
|
Asa@100
|
31 type = 'header',
|
Asa@100
|
32 name = 'Default Result',
|
Asa@100
|
33 order = 9,
|
Asa@100
|
34 },
|
Asa@100
|
35 veto = {
|
Asa@100
|
36 type = "toggle",
|
Asa@100
|
37 name = "Veto unknown",
|
Asa@100
|
38 desc = "Vetos any items you don't have a rule for",
|
Asa@100
|
39 get = function() return ItemAuditor.db.char.rules_default_veto end,
|
Asa@100
|
40 set = function(info, value) ItemAuditor.db.char.rules_default_veto = value end,
|
Asa@100
|
41 order = 10,
|
Asa@100
|
42 },
|
Asa@100
|
43 }
|
Asa@100
|
44
|
Asa@100
|
45 local function generateRuleOptions(name)
|
Asa@100
|
46 local opt = {
|
Asa@100
|
47 name = name,
|
Asa@100
|
48 type = 'group',
|
Asa@100
|
49 args = {
|
Asa@100
|
50 items = {
|
Asa@100
|
51 type = "input",
|
Asa@100
|
52 name = "Item(s)",
|
Asa@100
|
53 desc = "Items this rule should match. Separate items with commas.",
|
Asa@100
|
54 multiline = true,
|
Asa@100
|
55 get = function()
|
Asa@100
|
56 return ItemAuditor.db.char.rules[name].search
|
Asa@100
|
57 end,
|
Asa@100
|
58 set = function(info, value)
|
Asa@100
|
59 ItemAuditor.db.char.rules[name].search = value
|
Asa@100
|
60 end,
|
Asa@100
|
61 order = 0,
|
Asa@100
|
62 },
|
Asa@100
|
63 header_result = {
|
Asa@100
|
64 type = 'header',
|
Asa@100
|
65 name = 'Rule',
|
Asa@100
|
66 order = 9,
|
Asa@100
|
67 },
|
Asa@100
|
68 veto = {
|
Asa@100
|
69 type = "toggle",
|
Asa@100
|
70 name = "Veto",
|
Asa@100
|
71 desc = "Veto any item that matches this rule",
|
Asa@100
|
72 get = function()
|
Asa@100
|
73 return (ItemAuditor.db.char.rules[name].target == -1)
|
Asa@100
|
74 end,
|
Asa@100
|
75 set = function(info, value)
|
Asa@100
|
76 if value then
|
Asa@100
|
77 value = -1
|
Asa@100
|
78 else
|
Asa@100
|
79 value = 0
|
Asa@100
|
80 end
|
Asa@100
|
81 ItemAuditor.db.char.rules[name].target = value
|
Asa@100
|
82 end,
|
Asa@100
|
83 order = 10,
|
Asa@100
|
84 },
|
Asa@100
|
85 auction_threshold = {
|
Asa@100
|
86 type = "range",
|
Asa@100
|
87 name = "Number to craft",
|
Asa@100
|
88 desc = "",
|
Asa@100
|
89 min = 0,
|
Asa@100
|
90 max = 1000,
|
Asa@100
|
91 softMax = 50,
|
Asa@100
|
92 step = 1,
|
Asa@100
|
93 get = function() return max(0, ItemAuditor.db.char.rules[name].target) end,
|
Asa@100
|
94 set = function(info, value)
|
Asa@100
|
95 ItemAuditor.db.char.rules[name].target = value
|
Asa@100
|
96 end,
|
Asa@100
|
97 disabled = function() return ItemAuditor.db.char.rules[name].target == -1 end,
|
Asa@100
|
98 order = 11,
|
Asa@100
|
99 },
|
Asa@107
|
100 skip_singles = {
|
Asa@107
|
101 type = "toggle",
|
Asa@107
|
102 name = "Skip Singles",
|
Asa@107
|
103 desc = "If only one of the item will be crafted, skip it",
|
Asa@107
|
104 disabled = function() return ItemAuditor.db.char.rules[name].target <= 1 end,
|
Asa@107
|
105 get = function()
|
Asa@107
|
106 return ItemAuditor.db.char.rules[name].skip_singles and (ItemAuditor.db.char.rules[name].target > 1)
|
Asa@107
|
107 end,
|
Asa@107
|
108 set = function(info, value)
|
Asa@107
|
109 ItemAuditor.db.char.rules[name].skip_singles = value
|
Asa@107
|
110 end,
|
Asa@107
|
111 order = 12,
|
Asa@107
|
112 },
|
Asa@100
|
113 header_delete = {
|
Asa@100
|
114 type = 'header',
|
Asa@100
|
115 name = '',
|
Asa@100
|
116 order = 19,
|
Asa@100
|
117 },
|
Asa@100
|
118 header_delete = {
|
Asa@100
|
119 type = 'execute',
|
Asa@100
|
120 name = 'Delete Rule',
|
Asa@100
|
121 func = function()
|
Asa@100
|
122 ItemAuditor.db.char.rules[name] = nil
|
Asa@100
|
123 Options['rule_'..name] = nil
|
Asa@100
|
124 end,
|
Asa@100
|
125 order = 20,
|
Asa@100
|
126 },
|
Asa@100
|
127 },
|
Asa@100
|
128 }
|
Asa@100
|
129
|
Asa@100
|
130
|
Asa@100
|
131 return opt
|
Asa@100
|
132 end
|
Asa@100
|
133
|
Asa@100
|
134 --[[
|
Asa@100
|
135 This had to be separated because set refers to Options and generateRuleOptions
|
Asa@100
|
136 ]]
|
Asa@100
|
137 Options.new = {
|
Asa@100
|
138 type = "input",
|
Asa@100
|
139 name = "Create New Rule",
|
Asa@100
|
140 desc = "",
|
Asa@100
|
141 get = function()
|
Asa@100
|
142 return ""
|
Asa@100
|
143 end,
|
Asa@100
|
144 set = function(info, name)
|
Asa@100
|
145 ItemAuditor.db.char.rules[name] = {
|
Asa@100
|
146 search = name,
|
Asa@100
|
147 target = 0,
|
Asa@100
|
148 }
|
Asa@100
|
149 Options['rule_'..name] = generateRuleOptions(name)
|
Asa@100
|
150 end,
|
Asa@100
|
151 order = 0,
|
Asa@100
|
152 }
|
Asa@100
|
153
|
Asa@100
|
154 local function generateDefaultGroups()
|
Asa@100
|
155 local defaultGroups = {
|
Asa@100
|
156 ['Glyphs'] = {
|
Asa@100
|
157 search = 'Glyph of',
|
Asa@100
|
158 target = 0,
|
Asa@100
|
159 },
|
Asa@100
|
160 ['Epic Gems'] = {
|
Asa@100
|
161 search = "Cardinal Ruby, Ametrine, King's Amber, Eye of Zul, Majestic Zircon, Dreadstone",
|
Asa@100
|
162 target = 0,
|
Asa@100
|
163 },
|
Asa@100
|
164 ['Rare Gems'] = {
|
Asa@100
|
165 search = "Scarlet Ruby, Monarch Topaz, Autumn's Glow, Forest Emerald, Sky Sapphire, Twilight Opal",
|
Asa@100
|
166 target = 0,
|
Asa@100
|
167 },
|
Asa@100
|
168 }
|
Asa@100
|
169
|
Asa@100
|
170 for name, rule in pairs(defaultGroups) do
|
Asa@107
|
171 ItemAuditor.db.char.rules[name] = mergeDefaultValues({
|
Asa@100
|
172 search = rule.search,
|
Asa@100
|
173 target = rule.target,
|
Asa@107
|
174 })
|
Asa@100
|
175 Options['rule_'..name] = generateRuleOptions(name)
|
Asa@100
|
176 end
|
Asa@100
|
177 end
|
Asa@100
|
178
|
Asa@100
|
179 local rules
|
Asa@100
|
180 function CraftingRules:OnInitialize()
|
Asa@100
|
181 rules = ItemAuditor.db.char.rules
|
Asa@100
|
182 local count = 0
|
Asa@107
|
183 for name, rule in pairs(rules) do
|
Asa@107
|
184 mergeDefaultValues(rule)
|
Asa@100
|
185 Options['rule_'..name] = generateRuleOptions(name)
|
Asa@100
|
186 count = count + 1
|
Asa@100
|
187 end
|
Asa@100
|
188
|
Asa@100
|
189 if count == 0 then
|
Asa@100
|
190 generateDefaultGroups()
|
Asa@100
|
191 end
|
Asa@100
|
192 end
|
Asa@100
|
193
|
Asa@107
|
194 local function runRule(rule, itemName, itemID, data)
|
Asa@100
|
195 local searches = {strsplit(',', rule.search:upper())}
|
Asa@100
|
196
|
Asa@100
|
197 for _, search in pairs(searches) do
|
Asa@100
|
198 search = search:trim()
|
Asa@100
|
199
|
Asa@100
|
200 if string.find(itemName, search) ~= nil or itemID == search then
|
Asa@107
|
201 if rule.skip_singles and data.count+1 == rule.target then
|
Asa@107
|
202 return data.count
|
Asa@107
|
203 end
|
Asa@100
|
204 return rule.target
|
Asa@100
|
205 end
|
Asa@100
|
206 end
|
Asa@100
|
207 return 0
|
Asa@100
|
208 end
|
Asa@100
|
209
|
Asa@100
|
210 local function Decide(data)
|
Asa@100
|
211
|
Asa@100
|
212 local match_rule = nil
|
Asa@100
|
213 local match_num = 0
|
Asa@100
|
214
|
Asa@100
|
215 local itemName = data.name:upper()
|
Asa@100
|
216 local itemID = tostring(Utils.GetItemID(data.link))
|
Asa@100
|
217 for name, rule in pairs(rules) do
|
Asa@107
|
218 local result = runRule(rule, itemName, itemID, data)
|
Asa@100
|
219 if result == -1 then
|
Asa@100
|
220 return result, name
|
Asa@100
|
221 elseif result > match_num then
|
Asa@100
|
222 match_rule = name
|
Asa@100
|
223 match_num = result
|
Asa@100
|
224 end
|
Asa@100
|
225 end
|
Asa@100
|
226
|
Asa@100
|
227 if match_rule == nil and ItemAuditor.db.char.rules_default_veto then
|
Asa@100
|
228 return -1
|
Asa@100
|
229 end
|
Asa@100
|
230 return match_num, match_rule
|
Asa@100
|
231 end
|
Asa@100
|
232
|
Asa@100
|
233 Crafting.RegisterCraftingDecider('Crafting Rules', Decide, Options)
|