2.4.3. addon, shows better gear by slot and stat type
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

220 linhas
7.1KB

  1. ;; coll utils
  2. (fn length-of [coll]
  3. (if coll
  4. (do
  5. (var c 0)
  6. (each [k (pairs coll)]
  7. (set c (+ c 1)))
  8. c)
  9. 0))
  10. (fn first [coll]
  11. (let [key (next coll)]
  12. (. coll key)))
  13. ;; str utils
  14. (fn starts-with [s patt]
  15. (= (string.sub s 1 (string.len patt)) patt))
  16. (fn un-quote [s]
  17. (string.gsub s "\'" ""))
  18. ;; number utils
  19. (fn max [a b]
  20. (if (> a b) a b))
  21. ;; fennel utils
  22. (fn matches [a b]
  23. (if (starts-with a "lte:")
  24. (>= (tonumber (string.sub a 5)) (tonumber b))
  25. (starts-with a "gte:")
  26. (<= (tonumber (string.sub a 5)) (tonumber b))
  27. (= a b)))
  28. ;; querying
  29. (lambda find-items [params ?sort]
  30. (let [results (icollect [_ row (ipairs items)]
  31. (do
  32. (var hit true)
  33. (each [key param (pairs params)]
  34. (do
  35. (set hit (and hit (matches param (. row key))))))
  36. (if hit
  37. row)))]
  38. (if (and ?sort results)
  39. (do
  40. (table.sort results ?sort)
  41. results)
  42. results)))
  43. (lambda find-item [params ?sort]
  44. (let [results (find-items params ?sort)]
  45. (if results
  46. (first results))))
  47. ;; specialized querying
  48. (fn find-item-by-name [name]
  49. (find-item {8 name}))
  50. (fn find-next-better-item [class subclass invtype lv ilv stat-position item-stat ?sort]
  51. (find-items {4 class
  52. 6 subclass
  53. 10 invtype
  54. 14 (string.format "gte:%d" (- lv 4))
  55. 14 (string.format "lte:%d" lv)
  56. ;; 12 (string.format "gte:%d" ilv)
  57. stat-position (string.format "gte:%d" item-stat)}
  58. ?sort))
  59. (lambda find-good-item [invtype lv stat-position stat-baseline ?sort]
  60. (find-items {10 invtype
  61. 14 (string.format "gte:%d" (- lv 6))
  62. 14 (string.format "lte:%d" lv)
  63. stat-position (string.format "gte:%d" stat-baseline)}
  64. ?sort))
  65. ;; arg parsing
  66. (fn parse-opts [msg]
  67. (icollect [k v (string.gmatch msg "%w+")] v))
  68. ;; ui
  69. (fn ui-print [msg]
  70. (UIErrorsFrame:AddMessage msg))
  71. (fn stat-name [n]
  72. (let [stat-names ["Mana" "Health" "No Visible Effect"
  73. "Agility" "Strength" "Intellect"
  74. "Spirit" "Stamina" "No Visible Effect" "No Visible Effect"
  75. "No Visible Effect" "No Visible Effect*" "Defense Rating"
  76. "Dodge" "Parry Rating" "Shield Block Rating"
  77. "Melee Hit Rating" "Ranged Hit Rating" "Spell Hit Rating"
  78. "Melee Critical Strike" "Ranged Critical Strike" "Spell Critical Strike"
  79. "Melee Hit Avoidance" "Ranged Hit Avoidance" "Spell Hit Avoidance"
  80. "Melee Critical Avoidance" "Spell Critical Avoidance" "Melee Haste Rating"
  81. "Ranged Haste Rating" "Spell Haste Rating" "Hit Avoidance Rating"
  82. "Hit Rating" "Critical Strike" "Hit Avoidance Rating"
  83. "Critical Avoidance Rating" "Resilience" "Haste"
  84. "Expertise" "Attack Power" "Ranged Attack Power"
  85. "No Visible Effect" "Healing Done By Magical Spells and Effects up to value" "Damage Done By Magical Spells and Effects up to value"
  86. "Mana Regeneration (Ticks every 5 seconds)" "Armor Penetration Rating" "Spell Power"
  87. "Health Regeneration (Ticks every 5 seconds)" "Spell Penetration" "Block Value of Shield"
  88. "Mastery" "Armor" "Fire Resist"
  89. "Frost Resist" "Shadow Resist" "Nature Resist"
  90. "Arcane Resist"]]
  91. (.. (. stat-names (+ n 1)) " (" n ")")))
  92. (fn stat-print [item]
  93. (var val "")
  94. (for [n 22 56]
  95. (if (< 0 (. item n))
  96. (set val (.. val " " (stat-name (- n 21)) ": " (. item n)))))
  97. val)
  98. ;; main
  99. (global
  100. main
  101. (fn main [msg]
  102. (let [opts (icollect [v (string.gmatch msg "%w+")] v)
  103. [slot stat gear-index] opts
  104. slot (.. slot "Slot") ;; omit the need to type it out
  105. stat (+ 21 (tonumber stat)) ;; stats start after field 21, so agility (3) is 22+3, etc
  106. gear-index (tonumber (or gear-index "1"))
  107. inv-slot (GetInventorySlotInfo slot)
  108. i-link (GetInventoryItemLink "player" inv-slot)
  109. p-level (UnitLevel "player")]
  110. ;; (print (string.format "slot %s stat %s gear-index %s" slot stat gear-index))
  111. (if (not i-link)
  112. ;; empty
  113. (let [best (.
  114. (find-good-item
  115. inv-slot
  116. (UnitLevel "player")
  117. stat
  118. 1
  119. (fn [a b] (and (< (. a stat) (. b stat))
  120. (< (. a 12) (. b 12)))))
  121. gear-index)]
  122. (if best
  123. (do
  124. (DEFAULT_CHAT_FRAME:AddMessage (string.format "\124Hitem:%d:0:0:0:0:0:0:0:0\124h[%s]\124h\124r" (. best 2) (. best 8)))
  125. (ui-print (.. "next best available: "
  126. (. best 8)
  127. " "
  128. (stat-print best)
  129. " at "
  130. (or (. best 20)) "N/A")))))
  131. ;; exists
  132. (let [i-name (GetItemInfo i-link)
  133. stats (find-item-by-name (un-quote i-name))]
  134. (if stats
  135. (let [i-class (. stats 4)
  136. i-subclass (. stats 6)
  137. i-invtype (. stats 10)
  138. i-level (. stats 12)
  139. i-stat (. stats stat)
  140. best (. (find-next-better-item i-class i-subclass i-invtype p-level i-level stat (max i-stat 1) (fn [a b] (< (. a stat) (. b stat)))) gear-index)]
  141. (if best
  142. (do
  143. (DEFAULT_CHAT_FRAME:AddMessage (string.format "\124Hitem:%d:0:0:0:0:0:0:0:0\124h[%s]\124h\124r" (. best 2) (. best 8)))
  144. (ui-print (.. "next best available: "
  145. (. best 8)
  146. " "
  147. (stat-print best)
  148. " at "
  149. (or (. best 20)) "N/A"))
  150. (ui-print (.. "currently equipped " i-name " " (or (. stats stat) "N/A")))))))
  151. "ok")))))
  152. (fn maxxed []
  153. (let [slots ["AmmoSlot"
  154. "BackSlot"
  155. "Bag0Slot"
  156. "Bag1Slot"
  157. "Bag2Slot"
  158. "Bag3Slot"
  159. "ChestSlot"
  160. "FeetSlot"
  161. "Finger0Slot"
  162. "Finger1Slot"
  163. "HandsSlot"
  164. "HeadSlot"
  165. "LegsSlot"
  166. "MainHandSlot"
  167. "NeckSlot"
  168. "RangedSlot"
  169. "SecondaryHandSlot"
  170. "ShirtSlot"
  171. "ShoulderSlot"
  172. "TabardSlot"
  173. "Trinket0Slot"
  174. "Trinket1Slot"
  175. "WaistSlot"
  176. "WristSlot"]]
  177. slots))