2.4.3. addon, shows better gear by slot and stat type
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

205 wiersze
6.6KB

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