Location.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Numerics;
  5. using FFXIVClientStructs.FFXIV.Client.UI.Agent;
  6. using Lumina.Excel.GeneratedSheets;
  7. using MapType = FFXIVClientStructs.FFXIV.Client.UI.Agent.MapType;
  8. namespace HuntBuddy;
  9. public static class Location {
  10. public class PositionInfo {
  11. public float X {
  12. get;
  13. init;
  14. }
  15. public float Y {
  16. get;
  17. init;
  18. }
  19. public Vector2 Coordinate => new(this.X, this.Y);
  20. }
  21. // MobHuntId as key
  22. public static readonly Dictionary<uint, PositionInfo> Database = new() {
  23. // Heavensward
  24. // Coerthas Western Highlands
  25. { 03481, new PositionInfo { X = 15.0f, Y = 12.0f } }, // Archaeornis
  26. { 03472, new PositionInfo { X = 32.0f, Y = 24.0f } }, // Bergthurs
  27. { 03471, new PositionInfo { X = 30.0f, Y = 31.0f } }, // Deepeye
  28. { 03476, new PositionInfo { X = 28.0f, Y = 12.0f } }, // Frost Grenade
  29. { 03480, new PositionInfo { X = 11.0f, Y = 17.0f } }, // Gelato
  30. { 03484, new PositionInfo { X = 10.0f, Y = 14.0f } }, // Ice Commander
  31. { 03475, new PositionInfo { X = 23.0f, Y = 16.0f } }, // Icetrap
  32. { 03487, new PositionInfo { X = 28.0f, Y = 09.0f } }, // Inland Tursus
  33. { 03483, new PositionInfo { X = 19.0f, Y = 29.0f } }, // Lone Yeti
  34. { 03485, new PositionInfo { X = 22.0f, Y = 21.0f } }, // Polar Bear
  35. { 03482, new PositionInfo { X = 16.0f, Y = 20.0f } }, // Rheum
  36. { 03473, new PositionInfo { X = 26.0f, Y = 24.0f } }, // Silver Wolf
  37. { 03490, new PositionInfo { X = 25.0f, Y = 32.0f } }, // Slate Yeti
  38. { 03478, new PositionInfo { X = 25.0f, Y = 12.0f } }, // Slush Zoblyn
  39. { 03470, new PositionInfo { X = 30.0f, Y = 32.0f } }, // Steinbock
  40. { 03474, new PositionInfo { X = 31.0f, Y = 20.0f } }, // Upland Mylodon
  41. { 03493, new PositionInfo { X = 09.0f, Y = 09.0f } }, // Vindthurs
  42. { 03479, new PositionInfo { X = 15.0f, Y = 17.0f } }, // Wooly Yak
  43. // The Sea of Clouds
  44. { 03524, new PositionInfo { X = 21.0f, Y = 06.0f } }, // Anzu
  45. { 03498, new PositionInfo { X = 28.0f, Y = 29.0f } }, // Cloudworm
  46. { 03496, new PositionInfo { X = 27.0f, Y = 30.0f } }, // Conodont
  47. { 03505, new PositionInfo { X = 19.0f, Y = 30.0f } }, // Dhalmel
  48. { 03511, new PositionInfo { X = 17.0f, Y = 10.0f } }, // Endymion
  49. { 03494, new PositionInfo { X = 11.0f, Y = 33.0f } }, // Gaelicat
  50. { 03495, new PositionInfo { X = 16.0f, Y = 36.0f } }, // Gastornis
  51. { 03512, new PositionInfo { X = 23.0f, Y = 09.0f } }, // Groundskeeper
  52. { 03506, new PositionInfo { X = 20.0f, Y = 30.0f } }, // Korrigan
  53. { 03501, new PositionInfo { X = 36.0f, Y = 24.0f } }, // Lan'laii Gundu
  54. { 03502, new PositionInfo { X = 36.0f, Y = 20.0f } }, // Nat'laii Gundu
  55. { 03516, new PositionInfo { X = 28.0f, Y = 10.0f } }, // Nat'laii Vundu
  56. { 03497, new PositionInfo { X = 29.0f, Y = 30.0f } }, // Obdella
  57. { 03499, new PositionInfo { X = 20.0f, Y = 34.0f } }, // Paissa
  58. { 03500, new PositionInfo { X = 36.0f, Y = 24.0f } }, // Sanuwa
  59. { 03514, new PositionInfo { X = 30.0f, Y = 14.0f } }, // Sanuwa Vundu
  60. { 03525, new PositionInfo { X = 21.0f, Y = 07.0f } }, // Toco Toco
  61. { 03523, new PositionInfo { X = 14.0f, Y = 07.0f } }, // Tsanahale
  62. { 03503, new PositionInfo { X = 35.0f, Y = 25.0f } }, // Vuk'laii Gundu
  63. { 03513, new PositionInfo { X = 18.0f, Y = 17.0f } }, // Vundu Totem
  64. { 03509, new PositionInfo { X = 09.0f, Y = 16.0f } }, // Window Wamoura
  65. { 03510, new PositionInfo { X = 10.0f, Y = 17.0f } }, // Window Wamouracampa
  66. { 03504, new PositionInfo { X = 20.0f, Y = 38.0f } }, // Wisent
  67. // The Dravanian Forelands
  68. { 03565, new PositionInfo { X = 30.0f, Y = 16.0f } }, // Bandersnatch
  69. { 03566, new PositionInfo { X = 26.0f, Y = 11.0f } }, // Brown Bear
  70. { 03570, new PositionInfo { X = 28.0f, Y = 22.0f } }, // Clearwater Nanka
  71. { 03569, new PositionInfo { X = 27.0f, Y = 25.0f } }, // Clearwater Ninki Nanka
  72. { 03572, new PositionInfo { X = 28.0f, Y = 32.0f } }, // Dragonfly Watcher
  73. { 03567, new PositionInfo { X = 27.0f, Y = 22.0f } }, // Dravanian Aevis
  74. { 03576, new PositionInfo { X = 16.0f, Y = 33.0f } }, // Dravanian Wyvern
  75. { 03563, new PositionInfo { X = 36.0f, Y = 24.0f } }, // Feather Flea
  76. { 03578, new PositionInfo { X = 17.0f, Y = 26.0f } }, // Forelands Hippocerf
  77. { 03579, new PositionInfo { X = 18.0f, Y = 12.0f } }, // Gallimimus
  78. { 03571, new PositionInfo { X = 25.0f, Y = 29.0f } }, // Loaghtan
  79. { 03592, new PositionInfo { X = 27.0f, Y = 35.0f } }, // Loth Cultivator
  80. { 03590, new PositionInfo { X = 27.0f, Y = 35.0f } }, // Loth Firedrone
  81. { 03591, new PositionInfo { X = 29.0f, Y = 36.0f } }, // Loth Steeldrone
  82. { 03568, new PositionInfo { X = 28.0f, Y = 25.0f } }, // Melia
  83. { 03577, new PositionInfo { X = 18.0f, Y = 31.0f } }, // Miacid
  84. { 03555, new PositionInfo { X = 18.0f, Y = 12.0f } }, // Syricta
  85. { 03586, new PositionInfo { X = 31.0f, Y = 08.0f } }, // Thunder Dragon
  86. { 03582, new PositionInfo { X = 13.0f, Y = 15.0f } }, // Tyrannosaur
  87. { 03581, new PositionInfo { X = 13.0f, Y = 14.0f } }, // Vinegaroon
  88. { 03564, new PositionInfo { X = 35.0f, Y = 21.0f } }, // Wild Chocobo
  89. // The Churning Mists
  90. { 03619, new PositionInfo { X = 17.0f, Y = 27.0f } }, // Amphiptere
  91. { 03620, new PositionInfo { X = 24.0f, Y = 26.0f } }, // Archaeosaur
  92. { 03625, new PositionInfo { X = 18.0f, Y = 24.0f } }, // Bladed Vinegaroon
  93. { 03630, new PositionInfo { X = 25.0f, Y = 10.0f } }, // Blood Dragon
  94. { 03631, new PositionInfo { X = 09.0f, Y = 36.0f } }, // Cloud Aevis
  95. { 03629, new PositionInfo { X = 08.0f, Y = 19.0f } }, // Diresaur
  96. { 03623, new PositionInfo { X = 20.0f, Y = 12.0f } }, // Dragonet
  97. { 03626, new PositionInfo { X = 34.0f, Y = 21.0f } }, // Elder Syricta
  98. { 03628, new PositionInfo { X = 25.0f, Y = 30.0f } }, // Elder Wyvern
  99. { 03668, new PositionInfo { X = 10.0f, Y = 20.0f } }, // Gnarled Melia
  100. { 03614, new PositionInfo { X = 34.0f, Y = 28.0f } }, // Hropken
  101. { 03621, new PositionInfo { X = 09.0f, Y = 12.0f } }, // Limestone Golem
  102. { 03618, new PositionInfo { X = 20.0f, Y = 28.0f } }, // Lower Skylord
  103. { 03627, new PositionInfo { X = 33.0f, Y = 31.0f } }, // Mists Biast
  104. { 03622, new PositionInfo { X = 10.0f, Y = 18.0f } }, // Mists Drake
  105. { 03617, new PositionInfo { X = 23.0f, Y = 25.0f } }, // Moss Dragon
  106. { 03613, new PositionInfo { X = 28.0f, Y = 32.0f } }, // Sankchinni
  107. { 03615, new PositionInfo { X = 32.0f, Y = 15.0f } }, // Tulihand
  108. { 03624, new PositionInfo { X = 38.0f, Y = 17.7f } }, // Vouivre
  109. { 03616, new PositionInfo { X = 26.0f, Y = 20.0f } }, // Wadjet
  110. // The Dravanian Hinterlands
  111. { 03612, new PositionInfo { X = 25.0f, Y = 37.0f } }, // Bifericeras
  112. { 03609, new PositionInfo { X = 18.0f, Y = 36.0f } }, // Cockatrice
  113. { 03603, new PositionInfo { X = 12.0f, Y = 16.0f } }, // Crawler
  114. { 03594, new PositionInfo { X = 24.0f, Y = 21.0f } }, // Damselfly
  115. { 03598, new PositionInfo { X = 31.0f, Y = 22.0f } }, // Goblin Brandisher
  116. { 03601, new PositionInfo { X = 31.0f, Y = 22.0f } }, // Goblin Glider
  117. { 03600, new PositionInfo { X = 31.0f, Y = 22.0f } }, // Goblin Sharpshooter
  118. { 03599, new PositionInfo { X = 31.0f, Y = 22.0f } }, // Goblin Tinkerer
  119. { 03605, new PositionInfo { X = 10.0f, Y = 21.0f } }, // Great Morbol
  120. { 03597, new PositionInfo { X = 37.0f, Y = 24.0f } }, // Narbrooi
  121. { 03610, new PositionInfo { X = 17.0f, Y = 33.0f } }, // Okeanis
  122. { 03608, new PositionInfo { X = 12.0f, Y = 33.0f } }, // Opken
  123. { 03604, new PositionInfo { X = 11.0f, Y = 27.0f } }, // Orn Kite
  124. { 03607, new PositionInfo { X = 09.0f, Y = 34.0f } }, // Poroggo
  125. { 03595, new PositionInfo { X = 28.0f, Y = 27.0f } }, // Ratel
  126. { 03611, new PositionInfo { X = 12.0f, Y = 32.0f } }, // Sun Leech
  127. { 03593, new PositionInfo { X = 21.0f, Y = 16.0f } }, // Tarantula Hawk
  128. { 03596, new PositionInfo { X = 34.0f, Y = 19.0f } }, // Wildebeest
  129. // Azys Lla
  130. { 03545, new PositionInfo { X = 35.0f, Y = 24.0f } }, // 6th Legion Vanguard
  131. { 03552, new PositionInfo { X = 27.0f, Y = 33.0f } }, // Adamantite Claw
  132. { 03540, new PositionInfo { X = 31.0f, Y = 06.0f } }, // Allagan Chimera
  133. { 03534, new PositionInfo { X = 15.0f, Y = 13.0f } }, // Clockwork Engineer
  134. { 03536, new PositionInfo { X = 13.0f, Y = 08.0f } }, // Clockwork Harvestman
  135. { 03535, new PositionInfo { X = 18.0f, Y = 13.0f } }, // Clockwork Paladin
  136. { 03542, new PositionInfo { X = 35.0f, Y = 09.0f } }, // Corpse Flower
  137. { 03541, new PositionInfo { X = 29.5f, Y = 12.0f } }, // Empuse
  138. { 03537, new PositionInfo { X = 13.0f, Y = 17.0f } }, // Enforcement Droid
  139. { 03539, new PositionInfo { X = 27.0f, Y = 11.0f } }, // Lamia Cybrid
  140. { 03538, new PositionInfo { X = 28.0f, Y = 13.0f } }, // Lamia Thelytoke
  141. { 03580, new PositionInfo { X = 13.0f, Y = 33.0f } }, // Lesser Hydra
  142. { 03559, new PositionInfo { X = 18.0f, Y = 31.0f } }, // Meracydian Amphiptere
  143. { 03557, new PositionInfo { X = 08.0f, Y = 32.0f } }, // Meracydian Brobinyak
  144. { 03560, new PositionInfo { X = 08.0f, Y = 27.0f } }, // Meracydian Dragon
  145. { 03558, new PositionInfo { X = 06.0f, Y = 35.0f } }, // Meracydian Dragonet
  146. { 03554, new PositionInfo { X = 15.0f, Y = 29.0f } }, // Meracydian Falak
  147. { 03556, new PositionInfo { X = 14.0f, Y = 35.0f } }, // Meracydian Vouivre
  148. { 03533, new PositionInfo { X = 12.0f, Y = 15.0f } }, // Owlbear
  149. { 03543, new PositionInfo { X = 35.0f, Y = 08.0f } }, // Proto-naga
  150. { 03544, new PositionInfo { X = 33.0f, Y = 13.0f } }, // Reptoid
  151. { 03532, new PositionInfo { X = 09.0f, Y = 12.0f } }, // Snapper-rook
  152. // Stormblood
  153. // The Fringes
  154. { 05685, new PositionInfo { X = 10.0f, Y = 27.0f } }, // Diakka
  155. { 05674, new PositionInfo { X = 22.0f, Y = 16.0f } }, // Foper
  156. { 05697, new PositionInfo { X = 25.0f, Y = 27.0f } }, // Gazelle
  157. { 05676, new PositionInfo { X = 11.6f, Y = 12.0f } }, // Gazelle Hawk
  158. { 05679, new PositionInfo { X = 25.0f, Y = 15.0f } }, // Gelid Bhoot
  159. { 05686, new PositionInfo { X = 10.0f, Y = 27.0f } }, // Goosefish
  160. { 05671, new PositionInfo { X = 11.0f, Y = 11.0f } }, // Leshy
  161. { 05687, new PositionInfo { X = 11.0f, Y = 17.0f } }, // Mossling
  162. { 05683, new PositionInfo { X = 12.0f, Y = 17.0f } }, // Mountain Grizzly
  163. { 05691, new PositionInfo { X = 35.0f, Y = 25.0f } }, // Qalyana Brahmin
  164. { 05689, new PositionInfo { X = 35.0f, Y = 25.0f } }, // Qalyana Kshatriya
  165. { 05690, new PositionInfo { X = 35.0f, Y = 25.0f } }, // Qalyana Shudra
  166. { 05688, new PositionInfo { X = 35.0f, Y = 25.0f } }, // Sacred Marid
  167. { 05675, new PositionInfo { X = 10.0f, Y = 12.0f } }, // Sapria
  168. { 05677, new PositionInfo { X = 22.0f, Y = 11.0f } }, // Spinner
  169. { 05693, new PositionInfo { X = 29.0f, Y = 24.0f } }, // Teleoceras
  170. { 05678, new PositionInfo { X = 28.0f, Y = 15.0f } }, // Velodyna Pugil
  171. { 05680, new PositionInfo { X = 17.0f, Y = 10.0f } }, // Velodyna Sarcosuchus
  172. // The Peaks
  173. { 05705, new PositionInfo { X = 25.0f, Y = 11.0f } }, // Crag Claw
  174. { 05701, new PositionInfo { X = 18.7f, Y = 12.9f } }, // Bloodglider
  175. { 05702, new PositionInfo { X = 14.0f, Y = 08.0f } }, // Fluturini
  176. { 05703, new PositionInfo { X = 12.0f, Y = 08.0f } }, // Gyr Abanian Hornbill
  177. { 05713, new PositionInfo { X = 25.0f, Y = 33.0f } }, // Highland Eruca
  178. { 05712, new PositionInfo { X = 24.0f, Y = 29.0f } }, // Jhammel
  179. { 05714, new PositionInfo { X = 15.0f, Y = 27.0f } }, // Kongamato
  180. { 05707, new PositionInfo { X = 34.0f, Y = 09.0f } }, // Marble Urolith
  181. { 05715, new PositionInfo { X = 09.0f, Y = 26.0f } }, // Pantera
  182. { 05708, new PositionInfo { X = 24.0f, Y = 14.0f } }, // Scarab Beetle
  183. { 05711, new PositionInfo { X = 24.0f, Y = 24.0f } }, // True Griffin
  184. // The Ruby Sea
  185. { 05737, new PositionInfo { X = 31.0f, Y = 35.0f } }, // Bombfish
  186. { 05736, new PositionInfo { X = 34.0f, Y = 05.0f } }, // Coralshell
  187. { 05740, new PositionInfo { X = 26.0f, Y = 30.0f } }, // Flying Shark
  188. { 05742, new PositionInfo { X = 23.0f, Y = 33.0f } }, // Gasame
  189. { 05734, new PositionInfo { X = 14.0f, Y = 10.0f } }, // Gyuki
  190. { 05751, new PositionInfo { X = 25.0f, Y = 25.0f } }, // Naked Yumemi
  191. { 05743, new PositionInfo { X = 07.0f, Y = 30.0f } }, // Red Bukan
  192. { 05745, new PositionInfo { X = 08.0f, Y = 28.0f } }, // Red Honkan
  193. { 05744, new PositionInfo { X = 09.5f, Y = 25.2f } }, // Red Hyoe
  194. { 05738, new PositionInfo { X = 33.0f, Y = 11.0f } }, // Sea Serpent
  195. { 05739, new PositionInfo { X = 26.0f, Y = 06.0f } }, // Shiranui
  196. { 05746, new PositionInfo { X = 07.0f, Y = 27.0f } }, // Striped Ray
  197. { 05733, new PositionInfo { X = 29.0f, Y = 37.0f } }, // Tatsunoko
  198. { 05735, new PositionInfo { X = 35.0f, Y = 21.0f } }, // Unkiu
  199. { 05750, new PositionInfo { X = 25.0f, Y = 25.0f } }, // Yumemi
  200. // Yanxia
  201. { 05761, new PositionInfo { X = 18.0f, Y = 31.0f } }, // Bi Fang
  202. { 05769, new PositionInfo { X = 28.0f, Y = 08.0f } }, // Ebisu Catfish
  203. { 05752, new PositionInfo { X = 27.0f, Y = 34.0f } }, // Lupin Bladehand
  204. { 05754, new PositionInfo { X = 24.0f, Y = 32.0f } }, // Lupin Bowhand
  205. { 05753, new PositionInfo { X = 23.0f, Y = 28.0f } }, // Lupin Spearhand
  206. { 05768, new PositionInfo { X = 19.0f, Y = 11.0f } }, // Magatsu Kiyofusa
  207. { 05763, new PositionInfo { X = 33.0f, Y = 17.0f } }, // Minobi
  208. { 05757, new PositionInfo { X = 30.0f, Y = 23.0f } }, // Rhino Beetle
  209. { 05765, new PositionInfo { X = 30.0f, Y = 34.0f } }, // Taoquan
  210. { 05755, new PositionInfo { X = 24.0f, Y = 32.0f } }, // Tenaga
  211. { 05764, new PositionInfo { X = 23.0f, Y = 30.0f } }, // Vanara
  212. { 05762, new PositionInfo { X = 25.0f, Y = 26.0f } }, // Water Serpent
  213. // The Azim Steppe
  214. { 05785, new PositionInfo { X = 15.0f, Y = 19.0f } }, // Baras
  215. { 05788, new PositionInfo { X = 17.0f, Y = 26.0f } }, // Chaochu
  216. { 05777, new PositionInfo { X = 23.0f, Y = 15.0f } }, // Halgai
  217. { 05778, new PositionInfo { X = 16.0f, Y = 11.0f } }, // Khun Chuluu
  218. { 05781, new PositionInfo { X = 31.0f, Y = 17.0f } }, // Mammoth
  219. { 05783, new PositionInfo { X = 12.0f, Y = 29.0f } }, // Manzasiri
  220. { 05775, new PositionInfo { X = 28.0f, Y = 13.0f } }, // Matamata
  221. { 05782, new PositionInfo { X = 09.0f, Y = 21.0f } }, // Matanga
  222. { 05779, new PositionInfo { X = 23.0f, Y = 10.0f } }, // Muu Shuwuu
  223. { 05780, new PositionInfo { X = 34.0f, Y = 18.0f } }, // Purbol
  224. { 05776, new PositionInfo { X = 26.0f, Y = 29.0f } }, // Steppe Dhole
  225. { 05773, new PositionInfo { X = 31.0f, Y = 32.0f } }, // Steppe Dzo
  226. // The Lochs
  227. { 05723, new PositionInfo { X = 18.0f, Y = 32.0f } }, // Abaddon
  228. { 05725, new PositionInfo { X = 26.0f, Y = 11.0f } }, // Abalathian Minotaur
  229. { 05720, new PositionInfo { X = 25.0f, Y = 18.0f } }, // Chelone
  230. { 05727, new PositionInfo { X = 29.0f, Y = 15.0f } }, // Creeping Edila
  231. { 05729, new PositionInfo { X = 05.7f, Y = 26.7f } }, // Dark Clay Beast
  232. { 05732, new PositionInfo { X = 23.0f, Y = 10.0f } }, // Guard Bhoot
  233. { 05716, new PositionInfo { X = 08.0f, Y = 17.0f } }, // Kaluk
  234. { 05724, new PositionInfo { X = 16.0f, Y = 12.0f } }, // Loch Leech
  235. { 05730, new PositionInfo { X = 17.0f, Y = 16.0f } }, // Loch Nanka
  236. { 05717, new PositionInfo { X = 20.0f, Y = 18.0f } }, // Phoebad
  237. { 05721, new PositionInfo { X = 16.0f, Y = 21.0f } }, // Soblyn
  238. { 05722, new PositionInfo { X = 22.0f, Y = 23.0f } }, // Salt Dhruva
  239. { 05728, new PositionInfo { X = 17.0f, Y = 08.0f } }, // Specter
  240. { 05726, new PositionInfo { X = 25.0f, Y = 29.0f } }, // Vepar
  241. { 05719, new PositionInfo { X = 20.0f, Y = 25.0f } }, // Yabby
  242. // Shadowbringers
  243. // Lakeland
  244. { 08498, new PositionInfo { X = 19.0f, Y = 09.0f } }, // Chiliad Cama
  245. { 08502, new PositionInfo { X = 28.0f, Y = 23.2f } }, // Violet Triffid
  246. { 08503, new PositionInfo { X = 14.0f, Y = 16.5f } }, // Gnole
  247. { 08504, new PositionInfo { X = 24.4f, Y = 23.9f } }, // Wetland Warg
  248. { 08505, new PositionInfo { X = 33.2f, Y = 10.0f } }, // White Gremlin
  249. { 08507, new PositionInfo { X = 25.8f, Y = 23.3f } }, // Hoptrap
  250. { 08508, new PositionInfo { X = 28.5f, Y = 36.7f } }, // Wolverine
  251. { 08511, new PositionInfo { X = 11.3f, Y = 11.0f } }, // Smilodon
  252. { 08514, new PositionInfo { X = 34.2f, Y = 17.0f } }, // Ya-te-veo
  253. { 08515, new PositionInfo { X = 29.0f, Y = 17.6f } }, // Proterosuchus
  254. { 08786, new PositionInfo { X = 20.5f, Y = 25.3f } }, // Lake Viper
  255. // Kholusia
  256. { 08517, new PositionInfo { X = 31.9f, Y = 18.9f } }, // Ironbeard
  257. { 08518, new PositionInfo { X = 36.4f, Y = 28.7f } }, // Hobgoblin
  258. { 08520, new PositionInfo { X = 17.0f, Y = 18.0f } }, // Defective Talos
  259. { 08522, new PositionInfo { X = 34.8f, Y = 10.5f } }, // Sulfur Byrgen
  260. { 08523, new PositionInfo { X = 35.4f, Y = 29.2f } }, // Maultasche
  261. { 08524, new PositionInfo { X = 14.3f, Y = 11.4f } }, // Huldu
  262. { 08525, new PositionInfo { X = 14.3f, Y = 27.1f } }, // Island Rail
  263. { 08527, new PositionInfo { X = 17.0f, Y = 11.0f } }, // Cliffkite
  264. { 08528, new PositionInfo { X = 27.1f, Y = 13.8f } }, // Cliffmole
  265. { 08529, new PositionInfo { X = 08.0f, Y = 18.0f } }, // Scree Gnome
  266. { 08532, new PositionInfo { X = 17.8f, Y = 26.5f } }, // Wood Eyes
  267. { 08533, new PositionInfo { X = 25.0f, Y = 23.5f } }, // Island Wolf
  268. { 08534, new PositionInfo { X = 10.1f, Y = 29.6f } }, // Kholusian Bison
  269. { 08536, new PositionInfo { X = 32.5f, Y = 26.2f } }, // Whiptail
  270. { 08538, new PositionInfo { X = 22.5f, Y = 09.6f } }, // Highland Hyssop
  271. { 08539, new PositionInfo { X = 19.9f, Y = 33.0f } }, // Tragopan
  272. { 08540, new PositionInfo { X = 13.0f, Y = 15.0f } }, // Saichania
  273. { 08541, new PositionInfo { X = 21.0f, Y = 08.7f } }, // Gulgnu
  274. { 08542, new PositionInfo { X = 21.6f, Y = 32.0f } }, // Germinant
  275. // Amh Araeng
  276. { 08544, new PositionInfo { X = 11.4f, Y = 30.4f } }, // Masterless Talos
  277. { 08545, new PositionInfo { X = 19.1f, Y = 20.9f } }, // Evil Weapon
  278. { 08547, new PositionInfo { X = 30.4f, Y = 12.3f } }, // Gigantender
  279. { 08550, new PositionInfo { X = 29.4f, Y = 25.4f } }, // Ancient Lizard
  280. { 08556, new PositionInfo { X = 29.4f, Y = 21.7f } }, // Sand Mole
  281. { 08557, new PositionInfo { X = 12.7f, Y = 19.0f } }, // Thistle Mole
  282. { 08558, new PositionInfo { X = 30.9f, Y = 27.3f } }, // Scissorjaws
  283. { 08559, new PositionInfo { X = 21.5f, Y = 09.7f } }, // Gnome
  284. { 08561, new PositionInfo { X = 13.9f, Y = 18.2f } }, // Debitage
  285. { 08562, new PositionInfo { X = 27.1f, Y = 29.6f } }, // Ghilman
  286. { 08563, new PositionInfo { X = 25.0f, Y = 34.3f } }, // Flame Zonure
  287. { 08565, new PositionInfo { X = 15.2f, Y = 16.7f } }, // Phorusrhacos
  288. { 08566, new PositionInfo { X = 21.7f, Y = 09.8f } }, // Desert Coyote
  289. { 08567, new PositionInfo { X = 23.9f, Y = 31.8f } }, // Molamander
  290. // Il Mheg
  291. { 08155, new PositionInfo { X = 08.4f, Y = 30.0f } }, // Flower Basket
  292. { 08569, new PositionInfo { X = 18.0f, Y = 31.0f } }, // Echevore
  293. { 08574, new PositionInfo { X = 31.0f, Y = 14.3f } }, // Garden Porxie
  294. { 08575, new PositionInfo { X = 19.9f, Y = 16.3f } }, // Phooka
  295. { 08576, new PositionInfo { X = 11.1f, Y = 26.0f } }, // Etainmoth
  296. { 08577, new PositionInfo { X = 29.4f, Y = 12.7f } }, // Green Glider
  297. { 08578, new PositionInfo { X = 21.0f, Y = 08.8f } }, // Moss Fungus
  298. { 08581, new PositionInfo { X = 07.8f, Y = 18.7f } }, // Hawker
  299. { 08582, new PositionInfo { X = 25.0f, Y = 11.0f } }, // Rainbow Lorikeet
  300. { 08583, new PositionInfo { X = 29.5f, Y = 11.4f } }, // Tot Aevis
  301. { 08584, new PositionInfo { X = 30.4f, Y = 10.6f } }, // Rabbit's Tail
  302. { 08585, new PositionInfo { X = 19.0f, Y = 32.0f } }, // Rosebear
  303. { 08586, new PositionInfo { X = 31.6f, Y = 06.4f } }, // Garden Crocota
  304. { 08587, new PositionInfo { X = 32.0f, Y = 05.8f } }, // Werewood
  305. { 08590, new PositionInfo { X = 09.4f, Y = 15.0f } }, // Killer Bee
  306. // The Rak'tika Greatwood
  307. { 08596, new PositionInfo { X = 08.8f, Y = 35.6f } }, // Tomatl
  308. { 08597, new PositionInfo { X = 27.3f, Y = 25.6f } }, // Forest Echo
  309. { 08598, new PositionInfo { X = 25.1f, Y = 14.2f } }, // Cracked Ronkan Doll
  310. { 08599, new PositionInfo { X = 23.0f, Y = 14.0f } }, // Cracked Ronkan Thorn
  311. { 08600, new PositionInfo { X = 16.0f, Y = 32.0f } }, // Vampire Vine
  312. { 08601, new PositionInfo { X = 23.4f, Y = 07.6f } }, // Greatwood Rail
  313. { 08603, new PositionInfo { X = 29.4f, Y = 21.7f } }, // Snapweed
  314. { 08604, new PositionInfo { X = 12.0f, Y = 34.0f } }, // Atrociraptor
  315. { 08606, new PositionInfo { X = 27.7f, Y = 23.2f } }, // Gizamaluk
  316. { 08609, new PositionInfo { X = 16.9f, Y = 33.3f } }, // Helm Beetle
  317. { 08610, new PositionInfo { X = 34.1f, Y = 16.5f } }, // Floor Mandrill
  318. { 08611, new PositionInfo { X = 15.0f, Y = 19.4f } }, // Wild Swine
  319. { 08612, new PositionInfo { X = 24.9f, Y = 30.2f } }, // Caracal
  320. { 08614, new PositionInfo { X = 25.0f, Y = 07.2f } }, // Woodbat
  321. { 08616, new PositionInfo { X = 27.9f, Y = 21.2f } }, // Tarichuk
  322. { 08789, new PositionInfo { X = 21.1f, Y = 13.2f } }, // Cracked Ronkan Vessel
  323. // The Tempest
  324. { 08618, new PositionInfo { X = 28.6f, Y = 06.2f } }, // Clinoid
  325. { 08619, new PositionInfo { X = 28.2f, Y = 18.3f } }, // Dagon
  326. { 08621, new PositionInfo { X = 22.6f, Y = 31.7f } }, // Cubus
  327. { 08622, new PositionInfo { X = 25.1f, Y = 18.6f } }, // Sea Anemone
  328. { 08623, new PositionInfo { X = 32.1f, Y = 11.7f } }, // Amphisbaena
  329. { 08625, new PositionInfo { X = 32.5f, Y = 21.5f } }, // Morgawr
  330. { 08626, new PositionInfo { X = 36.6f, Y = 16.6f } }, // Trilobite
  331. { 08629, new PositionInfo { X = 27.7f, Y = 08.7f } }, // Sea Gelatin
  332. { 08630, new PositionInfo { X = 29.0f, Y = 21.0f } }, // Tempest Swallow
  333. { 08631, new PositionInfo { X = 35.8f, Y = 07.2f } }, // Blue Swimmer
  334. // Endwalker
  335. // Labyrinthos
  336. { 10668, new PositionInfo { X = 28.8f, Y = 08.8f } }, // Troll
  337. { 10669, new PositionInfo { X = 31.0f, Y = 25.5f } }, // Genomos
  338. { 10670, new PositionInfo { X = 15.0f, Y = 06.5f } }, // Caribou
  339. { 10672, new PositionInfo { X = 32.0f, Y = 08.8f } }, // Limascabra
  340. { 10673, new PositionInfo { X = 21.5f, Y = 13.5f } }, // Luncheon Toad
  341. { 10674, new PositionInfo { X = 17.0f, Y = 12.0f } }, // Yakow
  342. { 10677, new PositionInfo { X = 34.0f, Y = 15.0f } }, // Labyrinth Screamer
  343. { 10678, new PositionInfo { X = 24.0f, Y = 10.7f } }, // Northern Snapweed
  344. { 10679, new PositionInfo { X = 26.0f, Y = 14.5f } }, // Pephredo
  345. { 10683, new PositionInfo { X = 37.5f, Y = 19.5f } }, // Mythrilcap
  346. // Thavnair
  347. { 10697, new PositionInfo { X = 19.0f, Y = 23.9f } }, // Pisaca
  348. { 10698, new PositionInfo { X = 13.8f, Y = 18.5f } }, // Vajralangula
  349. { 10699, new PositionInfo { X = 19.2f, Y = 32.6f } }, // Kacchapa
  350. { 10700, new PositionInfo { X = 18.4f, Y = 26.7f } }, // Hamsa
  351. { 10701, new PositionInfo { X = 29.1f, Y = 12.2f } }, // Asvattha
  352. { 10702, new PositionInfo { X = 27.1f, Y = 27.8f } }, // Guhasaya
  353. { 10703, new PositionInfo { X = 27.0f, Y = 17.4f } }, // Bhujamga
  354. { 10704, new PositionInfo { X = 17.6f, Y = 17.8f } }, // Sotormurg
  355. { 10705, new PositionInfo { X = 22.7f, Y = 30.4f } }, // Gaja
  356. { 10706, new PositionInfo { X = 19.1f, Y = 11.7f } }, // Thavnairian Jhammel
  357. { 10707, new PositionInfo { X = 25.9f, Y = 19.0f } }, // Ufiti
  358. { 10709, new PositionInfo { X = 09.2f, Y = 12.8f } }, // Chamrosh
  359. { 10711, new PositionInfo { X = 16.1f, Y = 09.2f } }, // Starmite
  360. { 10712, new PositionInfo { X = 14.3f, Y = 12.7f } }, // Manjusaka
  361. { 10713, new PositionInfo { X = 23.3f, Y = 19.9f } }, // Odqan
  362. { 10715, new PositionInfo { X = 13.4f, Y = 28.5f } }, // Akyaali Crab
  363. { 10716, new PositionInfo { X = 08.2f, Y = 16.2f } }, // Valras
  364. // Garlemald
  365. { 10648, new PositionInfo { X = 18.8f, Y = 09.8f } }, // Automated Satellite
  366. { 10649, new PositionInfo { X = 25.5f, Y = 17.5f } }, // Automated Death Machine
  367. { 10650, new PositionInfo { X = 15.5f, Y = 19.5f } }, // Automated Cavalry
  368. { 10651, new PositionInfo { X = 21.8f, Y = 17.4f } }, // Automated Bit
  369. { 10652, new PositionInfo { X = 15.7f, Y = 09.8f } }, // Automated Roader
  370. { 10653, new PositionInfo { X = 29.5f, Y = 13.7f } }, // Automated Slasher
  371. { 10654, new PositionInfo { X = 24.3f, Y = 14.9f } }, // Automated Colossus
  372. { 10655, new PositionInfo { X = 12.9f, Y = 11.7f } }, // Automated Avenger
  373. { 10656, new PositionInfo { X = 29.6f, Y = 30.3f } }, // Almasty
  374. { 10657, new PositionInfo { X = 14.6f, Y = 26.1f } }, // Eblan Bear
  375. { 10658, new PositionInfo { X = 31.3f, Y = 17.4f } }, // Eblan Icetrap
  376. { 10659, new PositionInfo { X = 19.8f, Y = 29.1f } }, // Ovibos
  377. { 10660, new PositionInfo { X = 22.3f, Y = 24.9f } }, // Jotunn
  378. { 10661, new PositionInfo { X = 28.4f, Y = 33.0f } }, // Ceruleum Zoblyn
  379. { 10662, new PositionInfo { X = 25.4f, Y = 31.5f } }, // Ilsabardian Tursus
  380. { 10663, new PositionInfo { X = 18.7f, Y = 24.8f } }, // Canis Lupinus
  381. { 10664, new PositionInfo { X = 26.1f, Y = 26.5f } }, // Overgrown Rose
  382. // Mare Lamentorum
  383. { 10458, new PositionInfo { X = 23.9f, Y = 20.0f } }, // Daphnia
  384. { 10459, new PositionInfo { X = 23.7f, Y = 20.3f } }, // Osculator
  385. { 10460, new PositionInfo { X = 08.6f, Y = 35.5f } }, // Sweeper
  386. { 10461, new PositionInfo { X = 27.3f, Y = 26.0f } }, // Wanderer
  387. { 10462, new PositionInfo { X = 31.1f, Y = 32.2f } }, // Weeper
  388. { 10463, new PositionInfo { X = 19.8f, Y = 22.5f } }, // Thinker
  389. { 10464, new PositionInfo { X = 26.0f, Y = 34.0f } }, // Regolith
  390. { 10465, new PositionInfo { X = 21.4f, Y = 32.2f } }, // Trimmer
  391. { 10467, new PositionInfo { X = 12.0f, Y = 36.7f } }, // Panopt
  392. { 10468, new PositionInfo { X = 11.5f, Y = 22.3f } }, // Dynamite
  393. { 10469, new PositionInfo { X = 16.7f, Y = 31.8f } }, // Armalcolite
  394. { 10470, new PositionInfo { X = 12.9f, Y = 09.6f } }, // Caretaker
  395. { 10471, new PositionInfo { X = 16.1f, Y = 24.9f } }, // Mousse
  396. { 10473, new PositionInfo { X = 31.2f, Y = 27.0f } }, // Downfall Alarum
  397. { 10474, new PositionInfo { X = 33.6f, Y = 26.2f } }, // Downfall Droid
  398. { 10475, new PositionInfo { X = 34.5f, Y = 28.0f } }, // Downfall Hunter
  399. { 10476, new PositionInfo { X = 13.0f, Y = 10.0f } }, // Supporter
  400. { 10477, new PositionInfo { X = 30.1f, Y = 11.0f } }, // Scraper
  401. // Elpis
  402. { 10590, new PositionInfo { X = 25.7f, Y = 33.9f } }, // Ophion
  403. { 10591, new PositionInfo { X = 16.5f, Y = 29.9f } }, // Yggdreant
  404. { 10592, new PositionInfo { X = 22.6f, Y = 20.0f } }, // Okyupete
  405. { 10594, new PositionInfo { X = 12.4f, Y = 31.8f } }, // Gryps
  406. { 10595, new PositionInfo { X = 26.6f, Y = 29.7f } }, // Monoceros
  407. { 10596, new PositionInfo { X = 10.1f, Y = 14.1f } }, // Pegasos
  408. { 10597, new PositionInfo { X = 28.7f, Y = 25.6f } }, // Bird of Elpis
  409. { 10599, new PositionInfo { X = 33.4f, Y = 14.3f } }, // Hippe
  410. { 10600, new PositionInfo { X = 14.1f, Y = 09.9f } }, // Harpuia
  411. { 10601, new PositionInfo { X = 25.0f, Y = 10.0f } }, // Morbol Marquis
  412. { 10602, new PositionInfo { X = 29.2f, Y = 09.3f } }, // Akantha
  413. { 10603, new PositionInfo { X = 24.4f, Y = 14.3f } }, // Lykopersikon
  414. { 10606, new PositionInfo { X = 21.5f, Y = 06.3f } }, // Lotis
  415. { 10607, new PositionInfo { X = 10.2f, Y = 34.6f } }, // Phanopsyche
  416. { 10608, new PositionInfo { X = 12.9f, Y = 23.4f } }, // Melanion
  417. { 10609, new PositionInfo { X = 12.9f, Y = 08.7f } }, // Ophiotauros
  418. { 10610, new PositionInfo { X = 13.3f, Y = 15.7f } }, // Elpis Minotaur
  419. { 10611, new PositionInfo { X = 30.7f, Y = 17.1f } }, // Remora
  420. // Ultima Thule
  421. { 10419, new PositionInfo { X = 30.1f, Y = 25.9f } }, // Broken Omicron
  422. { 10420, new PositionInfo { X = 19.3f, Y = 11.8f } }, // Drifting Ea
  423. { 10421, new PositionInfo { X = 34.8f, Y = 28.8f } }, // Beta
  424. { 10422, new PositionInfo { X = 32.9f, Y = 28.8f } }, // Delta
  425. { 10423, new PositionInfo { X = 36.5f, Y = 25.9f } }, // Lambda
  426. { 10424, new PositionInfo { X = 32.1f, Y = 26.6f } }, // Level Tricker
  427. { 10427, new PositionInfo { X = 10.0f, Y = 30.0f } }, // Stellar Amphiptere
  428. { 10430, new PositionInfo { X = 14.4f, Y = 28.2f } }, // Stellar Brobinyak
  429. { 10435, new PositionInfo { X = 16.3f, Y = 14.1f } }, // Other One
  430. };
  431. public enum OpenType {
  432. None, // Just place marker
  433. ShowOpen, // Show special map with radius
  434. MarkerOpen // Show normal map
  435. }
  436. public static unsafe void CreateMapMarker(uint territoryType, uint mapId, uint mobHuntId, string? mobHuntName,
  437. OpenType openType = OpenType.MarkerOpen) {
  438. AgentMap* map = AgentMap.Instance();
  439. if (map == null) {
  440. return;
  441. }
  442. (int X, int Y) pos = MapToWorldCoordinates(Database[mobHuntId].Coordinate, mapId);
  443. map->IsFlagMarkerSet = 0;
  444. map->SetFlagMapMarker(territoryType, mapId, pos.X, pos.Y, 60004);
  445. switch (openType) {
  446. case OpenType.None:
  447. break;
  448. case OpenType.ShowOpen:
  449. map->AgentInterface.Hide();
  450. map->AddGatheringTempMarker(pos.X, pos.Y, 150, 60004, 4, mobHuntName);
  451. map->OpenMap(mapId, territoryType, mobHuntName, MapType.GatheringLog);
  452. break;
  453. case OpenType.MarkerOpen:
  454. map->AgentInterface.Hide();
  455. map->OpenMap(mapId, territoryType);
  456. break;
  457. default:
  458. throw new ArgumentOutOfRangeException(nameof(openType), openType, null);
  459. }
  460. }
  461. public static unsafe void CreateMapMarker(MobHuntEntry mob, OpenType openType) => CreateMapMarker(mob.TerritoryType, mob.MapId, mob.MobHuntId, mob.Name, openType);
  462. public static unsafe void CreateMapMarker(MobHuntEntry mob) => CreateMapMarker(mob.TerritoryType, mob.MapId, mob.MobHuntId, mob.Name);
  463. private static (int X, int Y) MapToWorldCoordinates(Vector2 pos, uint mapId) {
  464. ushort scale = Service.DataManager.GetExcelSheet<Map>()?.GetRow(mapId)?.SizeFactor ?? 100;
  465. float num = scale / 100f;
  466. float x = (float)(((pos.X - 1.0) * num / 41.0 * 2048.0) - 1024.0) / num * 1000f;
  467. float y = (float)(((pos.Y - 1.0) * num / 41.0 * 2048.0) - 1024.0) / num * 1000f;
  468. x = (int)(MathF.Round(x, 3, MidpointRounding.AwayFromZero) * 1000) * 0.001f / 1000f;
  469. y = (int)(MathF.Round(y, 3, MidpointRounding.AwayFromZero) * 1000) * 0.001f / 1000f;
  470. return ((int)x, (int)y);
  471. }
  472. private static Vector2 ConvertPixelPositionToMapCoordinate(int x, int y, float scale) {
  473. float num = scale / 100f;
  474. return new Vector2(
  475. ConvertRawPositionToMapCoordinate((int)((x - 1024) * num * 1000f), scale),
  476. ConvertRawPositionToMapCoordinate((int)((y - 1024) * num * 1000f), scale));
  477. }
  478. private static float ConvertRawPositionToMapCoordinate(int pos, float scale) {
  479. float num1 = scale / 100f;
  480. float num2 = (float)(pos * (double)num1 / 1000.0f);
  481. return (40.96f / num1 * ((num2 + 1024.0f) / 2048.0f)) + 1.0f;
  482. }
  483. public static void TeleportToNearestAetheryte(uint territoryType, uint mapId, uint mobHuntId) {
  484. Map? mapRow = Service.DataManager.Excel.GetSheet<Map>()?.GetRow(mapId);
  485. if (mapRow == null) {
  486. return;
  487. }
  488. ushort? nearestAetheryteId = Service.DataManager.Excel.GetSheet<MapMarker>()
  489. ?.Where(x => x.DataType == 3 && x.RowId == mapRow.MapMarkerRange)
  490. .Select(
  491. x => new {
  492. distance = Vector2.DistanceSquared(
  493. Database[mobHuntId].Coordinate,
  494. ConvertPixelPositionToMapCoordinate(x.X, x.Y, mapRow.SizeFactor)),
  495. rowId = x.DataKey
  496. })
  497. .OrderBy(x => x.distance)
  498. .FirstOrDefault()?.rowId;
  499. Aetheryte? nearestAetheryte =
  500. territoryType == 399 // Support the unique case of aetheryte not being in the same map
  501. ? mapRow.TerritoryType?.Value?.Aetheryte.Value
  502. : Service.DataManager.Excel.GetSheet<Aetheryte>()?.FirstOrDefault(
  503. x =>
  504. x.IsAetheryte && x.Territory.Row == territoryType && x.RowId == nearestAetheryteId);
  505. if (nearestAetheryte == null) {
  506. return;
  507. }
  508. Plugin.TeleportConsumer?.Teleport(nearestAetheryte.RowId);
  509. }
  510. }