Location.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Numerics;
  4. using Dalamud.Game.Text.SeStringHandling.Payloads;
  5. using Lumina.Excel.GeneratedSheets;
  6. namespace HuntBuddy
  7. {
  8. public static class Location
  9. {
  10. public class PositionInfo
  11. {
  12. public float X { get; set; }
  13. public float Y { get; set; }
  14. public Vector2 Coordinate => new (this.X, this.Y);
  15. }
  16. // MobHuntId as key
  17. public static readonly Dictionary<uint, PositionInfo> Database = new()
  18. {
  19. // Shadowbringers
  20. // Lakeland
  21. { 08498, new PositionInfo { X = 19.0f, Y = 09.0f } }, // Chiliad Cama
  22. { 08502, new PositionInfo { X = 28.0f, Y = 23.2f } }, // Violet Triffid
  23. { 08503, new PositionInfo { X = 14.0f, Y = 16.5f } }, // Gnole
  24. { 08504, new PositionInfo { X = 24.4f, Y = 23.9f } }, // Wetland Warg
  25. { 08505, new PositionInfo { X = 33.2f, Y = 10.0f } }, // White Gremlin
  26. { 08507, new PositionInfo { X = 25.8f, Y = 23.3f } }, // Hoptrap
  27. { 08508, new PositionInfo { X = 28.5f, Y = 36.7f } }, // Wolverine
  28. { 08511, new PositionInfo { X = 11.3f, Y = 11.0f } }, // Smilodon
  29. { 08514, new PositionInfo { X = 34.2f, Y = 17.0f } }, // Ya-te-veo
  30. { 08515, new PositionInfo { X = 29.0f, Y = 17.6f } }, // Proterosuchus
  31. { 08786, new PositionInfo { X = 20.5f, Y = 25.3f } }, // Lake Viper
  32. // Kholusia
  33. { 08517, new PositionInfo { X = 31.9f, Y = 18.9f } }, // Ironbeard
  34. { 08518, new PositionInfo { X = 36.4f, Y = 28.7f } }, // Hobgoblin
  35. { 08520, new PositionInfo { X = 17.0f, Y = 18.0f } }, // Defective Talos
  36. { 08522, new PositionInfo { X = 34.8f, Y = 10.5f } }, // Sulfur Byrgen
  37. { 08523, new PositionInfo { X = 35.4f, Y = 29.2f } }, // Maultasche
  38. { 08524, new PositionInfo { X = 14.3f, Y = 11.4f } }, // Huldu
  39. { 08525, new PositionInfo { X = 14.3f, Y = 27.1f } }, // Island Rail
  40. { 08527, new PositionInfo { X = 17.0f, Y = 11.0f } }, // Cliffkite
  41. { 08528, new PositionInfo { X = 27.1f, Y = 13.8f } }, // Cliffmole
  42. { 08529, new PositionInfo { X = 08.0f, Y = 18.0f } }, // Scree Gnome
  43. { 08532, new PositionInfo { X = 17.8f, Y = 26.5f } }, // Wood Eyes
  44. { 08533, new PositionInfo { X = 25.0f, Y = 23.5f } }, // Island Wolf
  45. { 08534, new PositionInfo { X = 10.1f, Y = 29.6f } }, // Kholusian Bison
  46. { 08536, new PositionInfo { X = 32.5f, Y = 26.2f } }, // Whiptail
  47. { 08538, new PositionInfo { X = 22.5f, Y = 09.6f } }, // Highland Hyssop
  48. { 08539, new PositionInfo { X = 19.9f, Y = 33.0f } }, // Tragopan
  49. { 08540, new PositionInfo { X = 13.0f, Y = 15.0f } }, // Saichania
  50. { 08541, new PositionInfo { X = 21.0f, Y = 08.7f } }, // Gulgnu
  51. { 08542, new PositionInfo { X = 21.6f, Y = 32.0f } }, // Germinant
  52. // Amh Araeng
  53. { 08544, new PositionInfo { X = 11.4f, Y = 30.4f } }, // Masterless Talos
  54. { 08545, new PositionInfo { X = 19.1f, Y = 20.9f } }, // Evil Weapon
  55. { 08547, new PositionInfo { X = 30.4f, Y = 12.3f } }, // Gigantender
  56. { 08550, new PositionInfo { X = 30.1f, Y = 27.2f } }, // Ancient Lizard
  57. { 08556, new PositionInfo { X = 29.4f, Y = 21.7f } }, // Sand Mole
  58. { 08557, new PositionInfo { X = 12.7f, Y = 19.0f } }, // Thistle Mole
  59. { 08558, new PositionInfo { X = 30.9f, Y = 27.3f } }, // Scissorjaws
  60. { 08559, new PositionInfo { X = 21.5f, Y = 09.7f } }, // Gnome
  61. { 08561, new PositionInfo { X = 13.9f, Y = 18.2f } }, // Debitage
  62. { 08562, new PositionInfo { X = 27.1f, Y = 29.6f } }, // Ghilman
  63. { 08563, new PositionInfo { X = 25.0f, Y = 34.3f } }, // Flame Zonure
  64. { 08565, new PositionInfo { X = 15.2f, Y = 16.7f } }, // Phorusrhacos
  65. { 08566, new PositionInfo { X = 21.7f, Y = 09.8f } }, // Desert Coyote
  66. { 08567, new PositionInfo { X = 23.9f, Y = 31.8f } }, // Molamander
  67. // Il Mheg
  68. { 08155, new PositionInfo { X = 08.4f, Y = 30.0f } }, // Flower Basket
  69. { 08569, new PositionInfo { X = 18.0f, Y = 31.0f } }, // Echevore
  70. { 08574, new PositionInfo { X = 31.0f, Y = 14.3f } }, // Garden Porxie
  71. { 08575, new PositionInfo { X = 19.9f, Y = 16.3f } }, // Phooka
  72. { 08576, new PositionInfo { X = 11.1f, Y = 26.0f } }, // Etainmoth
  73. { 08577, new PositionInfo { X = 29.4f, Y = 12.7f } }, // Green Glider
  74. { 08578, new PositionInfo { X = 21.0f, Y = 08.8f } }, // Moss Fungus
  75. { 08581, new PositionInfo { X = 07.8f, Y = 18.7f } }, // Hawker
  76. { 08582, new PositionInfo { X = 25.0f, Y = 11.0f } }, // Rainbow Lorikeet
  77. { 08583, new PositionInfo { X = 29.5f, Y = 11.4f } }, // Tot Aevis
  78. { 08584, new PositionInfo { X = 30.4f, Y = 10.6f } }, // Rabbit's Tail
  79. { 08585, new PositionInfo { X = 19.0f, Y = 32.0f } }, // Rosebear
  80. { 08586, new PositionInfo { X = 31.6f, Y = 06.4f } }, // Garden Crocota
  81. { 08587, new PositionInfo { X = 32.0f, Y = 05.8f } }, // Werewood
  82. { 08590, new PositionInfo { X = 09.4f, Y = 15.0f } }, // Killer Bee
  83. // The Rak'tika Greatwood
  84. { 08596, new PositionInfo { X = 08.8f, Y = 35.6f } }, // Tomatl
  85. { 08597, new PositionInfo { X = 27.3f, Y = 25.6f } }, // Forest Echo
  86. { 08598, new PositionInfo { X = 25.1f, Y = 14.2f } }, // Cracked Ronkan Doll
  87. { 08599, new PositionInfo { X = 23.0f, Y = 14.0f } }, // Cracked Ronkan Thorn
  88. { 08600, new PositionInfo { X = 16.0f, Y = 32.0f } }, // Vampire Vine
  89. { 08601, new PositionInfo { X = 23.4f, Y = 07.6f } }, // Greatwood Rail
  90. { 08603, new PositionInfo { X = 29.4f, Y = 21.7f } }, // Snapweed
  91. { 08604, new PositionInfo { X = 12.0f, Y = 34.0f } }, // Atrociraptor
  92. { 08606, new PositionInfo { X = 27.7f, Y = 23.2f } }, // Gizamaluk
  93. { 08609, new PositionInfo { X = 16.9f, Y = 33.3f } }, // Helm Beetle
  94. { 08610, new PositionInfo { X = 34.1f, Y = 16.5f } }, // Floor Mandrill
  95. { 08611, new PositionInfo { X = 15.0f, Y = 19.4f } }, // Wild Swine
  96. { 08612, new PositionInfo { X = 24.9f, Y = 30.2f } }, // Caracal
  97. { 08614, new PositionInfo { X = 25.0f, Y = 07.2f } }, // Woodbat
  98. { 08616, new PositionInfo { X = 27.9f, Y = 21.2f } }, // Tarichuk
  99. { 08789, new PositionInfo { X = 21.1f, Y = 13.2f } }, // Cracked Ronkan Vessel
  100. // The Tempest
  101. { 08618, new PositionInfo { X = 28.6f, Y = 06.2f } }, // Clinoid
  102. { 08619, new PositionInfo { X = 28.2f, Y = 18.3f } }, // Dagon
  103. { 08621, new PositionInfo { X = 22.6f, Y = 31.7f } }, // Cubus
  104. { 08622, new PositionInfo { X = 25.1f, Y = 18.6f } }, // Sea Anemone
  105. { 08623, new PositionInfo { X = 32.1f, Y = 11.7f } }, // Amphisbaena
  106. { 08625, new PositionInfo { X = 32.5f, Y = 21.5f } }, // Morgawr
  107. { 08626, new PositionInfo { X = 36.6f, Y = 16.6f } }, // Trilobite
  108. { 08629, new PositionInfo { X = 27.7f, Y = 08.7f } }, // Sea Gelatin
  109. { 08630, new PositionInfo { X = 29.0f, Y = 21.0f } }, // Tempest Swallow
  110. { 08631, new PositionInfo { X = 35.8f, Y = 07.2f } }, // Blue Swimmer
  111. // Endwalker
  112. // Labyrinthos
  113. { 10668, new PositionInfo { X = 28.8f, Y = 08.8f } }, // Troll
  114. { 10669, new PositionInfo { X = 31.0f, Y = 25.5f } }, // Genomos
  115. { 10670, new PositionInfo { X = 15.0f, Y = 06.5f } }, // Caribou
  116. { 10672, new PositionInfo { X = 32.0f, Y = 08.8f } }, // Limascabra
  117. { 10673, new PositionInfo { X = 21.5f, Y = 13.5f } }, // Luncheon Toad
  118. { 10674, new PositionInfo { X = 17.0f, Y = 12.0f } }, // Yakow
  119. { 10677, new PositionInfo { X = 34.0f, Y = 15.0f } }, // Labyrinth Screamer
  120. { 10678, new PositionInfo { X = 24.0f, Y = 10.7f } }, // Northern Snapweed
  121. { 10679, new PositionInfo { X = 26.0f, Y = 14.5f } }, // Pephredo
  122. { 10683, new PositionInfo { X = 37.5f, Y = 19.5f } }, // Mythrilcap
  123. // Thavnair
  124. { 10697, new PositionInfo { X = 19.0f, Y = 23.9f } }, // Pisaca
  125. { 10698, new PositionInfo { X = 13.8f, Y = 18.5f } }, // Vajralangula
  126. { 10699, new PositionInfo { X = 19.2f, Y = 32.6f } }, // Kacchapa
  127. { 10700, new PositionInfo { X = 18.4f, Y = 26.7f } }, // Hamsa
  128. { 10701, new PositionInfo { X = 29.1f, Y = 12.2f } }, // Asvattha
  129. { 10702, new PositionInfo { X = 27.1f, Y = 27.8f } }, // Guhasaya
  130. { 10703, new PositionInfo { X = 27.0f, Y = 17.4f } }, // Bhujamga
  131. { 10704, new PositionInfo { X = 17.6f, Y = 17.8f } }, // Sotormurg
  132. { 10705, new PositionInfo { X = 22.7f, Y = 30.4f } }, // Gaja
  133. { 10706, new PositionInfo { X = 19.1f, Y = 11.7f } }, // Thavnairian Jhammel
  134. { 10707, new PositionInfo { X = 25.9f, Y = 19.0f } }, // Ufiti
  135. { 10709, new PositionInfo { X = 09.2f, Y = 12.8f } }, // Chamrosh
  136. { 10711, new PositionInfo { X = 16.1f, Y = 09.2f } }, // Starmite
  137. { 10712, new PositionInfo { X = 14.3f, Y = 12.7f } }, // Manjusaka
  138. { 10713, new PositionInfo { X = 23.3f, Y = 19.9f } }, // Odqan
  139. { 10715, new PositionInfo { X = 13.4f, Y = 28.5f } }, // Akyaali Crab
  140. { 10716, new PositionInfo { X = 08.2f, Y = 16.2f } }, // Valras
  141. // Garlemald
  142. { 10648, new PositionInfo { X = 18.8f, Y = 09.8f } }, // Automated Satellite
  143. { 10649, new PositionInfo { X = 25.5f, Y = 17.5f } }, // Automated Death Machine
  144. { 10650, new PositionInfo { X = 15.5f, Y = 19.5f } }, // Automated Cavalry
  145. { 10651, new PositionInfo { X = 21.8f, Y = 17.4f } }, // Automated Bit
  146. { 10652, new PositionInfo { X = 15.7f, Y = 09.8f } }, // Automated Roader
  147. { 10653, new PositionInfo { X = 29.5f, Y = 13.7f } }, // Automated Slasher
  148. { 10654, new PositionInfo { X = 24.3f, Y = 14.9f } }, // Automated Colossus
  149. { 10655, new PositionInfo { X = 12.9f, Y = 11.7f } }, // Automated Avenger
  150. { 10656, new PositionInfo { X = 29.6f, Y = 30.3f } }, // Almasty
  151. { 10657, new PositionInfo { X = 14.6f, Y = 26.1f } }, // Eblan Bear
  152. { 10658, new PositionInfo { X = 31.3f, Y = 17.4f } }, // Eblan Icetrap
  153. { 10659, new PositionInfo { X = 19.8f, Y = 29.1f } }, // Ovibos
  154. { 10660, new PositionInfo { X = 22.3f, Y = 24.9f } }, // Jotunn
  155. { 10661, new PositionInfo { X = 28.4f, Y = 33.0f } }, // Ceruleum Zoblyn
  156. { 10662, new PositionInfo { X = 25.4f, Y = 31.5f } }, // Ilsabardian Tursus
  157. { 10663, new PositionInfo { X = 18.7f, Y = 24.8f } }, // Canis Lupinus
  158. { 10664, new PositionInfo { X = 26.1f, Y = 26.5f } }, // Overgrown Rose
  159. // Mare Lamentorum
  160. { 10458, new PositionInfo { X = 23.9f, Y = 20.0f } }, // Daphnia
  161. { 10459, new PositionInfo { X = 23.7f, Y = 20.3f } }, // Osculator
  162. { 10460, new PositionInfo { X = 08.6f, Y = 35.5f } }, // Sweeper
  163. { 10461, new PositionInfo { X = 27.3f, Y = 26.0f } }, // Wanderer
  164. { 10462, new PositionInfo { X = 31.1f, Y = 32.2f } }, // Weeper
  165. { 10463, new PositionInfo { X = 19.8f, Y = 22.5f } }, // Thinker
  166. { 10464, new PositionInfo { X = 26.0f, Y = 34.0f } }, // Regolith
  167. { 10465, new PositionInfo { X = 21.4f, Y = 32.2f } }, // Trimmer
  168. { 10467, new PositionInfo { X = 12.0f, Y = 36.7f } }, // Panopt
  169. { 10468, new PositionInfo { X = 11.5f, Y = 22.3f } }, // Dynamite
  170. { 10469, new PositionInfo { X = 16.7f, Y = 31.8f } }, // Armalcolite
  171. { 10470, new PositionInfo { X = 12.9f, Y = 09.6f } }, // Caretaker
  172. { 10471, new PositionInfo { X = 16.1f, Y = 24.9f } }, // Mousse
  173. { 10473, new PositionInfo { X = 31.2f, Y = 27.0f } }, // Downfall Alarum
  174. { 10474, new PositionInfo { X = 33.6f, Y = 26.2f } }, // Downfall Droid
  175. { 10475, new PositionInfo { X = 34.5f, Y = 28.0f } }, // Downfall Hunter
  176. { 10476, new PositionInfo { X = 13.0f, Y = 10.0f } }, // Supporter
  177. { 10477, new PositionInfo { X = 30.1f, Y = 11.0f } }, // Scraper
  178. // Elpis
  179. { 10590, new PositionInfo { X = 25.7f, Y = 33.9f } }, // Ophion
  180. { 10591, new PositionInfo { X = 16.5f, Y = 29.9f } }, // Yggdreant
  181. { 10592, new PositionInfo { X = 22.6f, Y = 20.0f } }, // Okyupete
  182. { 10594, new PositionInfo { X = 12.4f, Y = 31.8f } }, // Gryps
  183. { 10595, new PositionInfo { X = 26.6f, Y = 29.7f } }, // Monoceros
  184. { 10596, new PositionInfo { X = 10.1f, Y = 14.1f } }, // Pegasos
  185. { 10597, new PositionInfo { X = 28.7f, Y = 25.6f } }, // Bird of Elpis
  186. { 10599, new PositionInfo { X = 33.4f, Y = 14.3f } }, // Hippe
  187. { 10600, new PositionInfo { X = 14.1f, Y = 09.9f } }, // Harpuia
  188. { 10601, new PositionInfo { X = 25.0f, Y = 10.0f } }, // Morbol Marquis
  189. { 10602, new PositionInfo { X = 29.2f, Y = 09.3f } }, // Akantha
  190. { 10603, new PositionInfo { X = 24.4f, Y = 14.3f } }, // Lykopersikon
  191. { 10606, new PositionInfo { X = 21.5f, Y = 06.3f } }, // Lotis
  192. { 10607, new PositionInfo { X = 10.2f, Y = 34.6f } }, // Phanopsyche
  193. { 10608, new PositionInfo { X = 12.9f, Y = 23.4f } }, // Melanion
  194. { 10609, new PositionInfo { X = 12.9f, Y = 08.7f } }, // Ophiotauros
  195. { 10610, new PositionInfo { X = 13.3f, Y = 15.7f } }, // Elpis Minotaur
  196. { 10611, new PositionInfo { X = 30.7f, Y = 17.1f } }, // Remora
  197. // Ultima Thule
  198. { 10419, new PositionInfo { X = 30.1f, Y = 25.9f } }, // Broken Omicron
  199. { 10420, new PositionInfo { X = 19.3f, Y = 11.8f } }, // Drifting Ea
  200. { 10421, new PositionInfo { X = 34.8f, Y = 28.8f } }, // Beta
  201. { 10422, new PositionInfo { X = 32.9f, Y = 28.8f } }, // Delta
  202. { 10423, new PositionInfo { X = 36.5f, Y = 25.9f } }, // Lambda
  203. { 10424, new PositionInfo { X = 32.1f, Y = 26.6f } }, // Level Tricker
  204. { 10427, new PositionInfo { X = 10.0f, Y = 30.0f } }, // Stellar Amphiptere
  205. { 10430, new PositionInfo { X = 14.4f, Y = 28.2f } }, // Stellar Brobinyak
  206. { 10435, new PositionInfo { X = 16.3f, Y = 14.1f } }, // Other One
  207. };
  208. public static void OpenMapLink(uint territoryType, uint mapId, uint mobHuntId)
  209. {
  210. var mapLinkPayload = new MapLinkPayload(territoryType, mapId, Database[mobHuntId].X, Database[mobHuntId].Y);
  211. Plugin.GameGui.OpenMapWithMapLink(mapLinkPayload);
  212. }
  213. private static Vector2 ConvertPixelPositionToMapCoordinate(int x, int y, float scale)
  214. {
  215. var num = scale / 100f;
  216. return new Vector2(ConvertRawPositionToMapCoordinate((int)((x - 1024) * num * 1000f), scale),
  217. ConvertRawPositionToMapCoordinate((int)((y - 1024) * num * 1000f), scale));
  218. }
  219. private static float ConvertRawPositionToMapCoordinate(int pos, float scale)
  220. {
  221. var num1 = scale / 100f;
  222. var num2 = (float) (pos * (double) num1 / 1000.0);
  223. return (float) (41.0 / num1 * ((num2 + 1024.0) / 2048.0) + 1.0);
  224. }
  225. public static void TeleportToNearestAetheryte(uint territoryType, uint mapId, uint mobHuntId)
  226. {
  227. var mapRow = Plugin.DataManager.Excel.GetSheet<Map>()?.GetRow(mapId);
  228. if (mapRow == null)
  229. {
  230. return;
  231. }
  232. var nearestAetheryteId = Plugin.DataManager.Excel.GetSheet<MapMarker>()
  233. ?.Where(x => x.DataType == 3 && x.RowId == mapRow.MapMarkerRange)
  234. .Select(x => new
  235. {
  236. distance = Vector2.DistanceSquared(Database[mobHuntId].Coordinate,
  237. ConvertPixelPositionToMapCoordinate(x.X, x.Y, mapRow.SizeFactor)),
  238. rowId = x.DataKey
  239. })
  240. .OrderBy(x => x.distance)
  241. .FirstOrDefault()?.rowId;
  242. var nearestAetheryte = Plugin.DataManager.Excel.GetSheet<Aetheryte>()?.FirstOrDefault(x =>
  243. x.IsAetheryte && x.Territory.Row == territoryType && x.RowId == nearestAetheryteId);
  244. if (nearestAetheryte == null)
  245. {
  246. return;
  247. }
  248. Plugin.TeleportConsumer?.Teleport(nearestAetheryte.RowId);
  249. }
  250. }
  251. }