HousingPackets.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. #include "../ClientPacketFunctions.h"
  2. #include "../World.h"
  3. #include "../client.h"
  4. #include "../WorldDatabase.h"
  5. #include "../Rules/Rules.h"
  6. extern ConfigReader configReader;
  7. extern World world;
  8. extern WorldDatabase database;
  9. extern RuleManager rule_manager;
  10. void ClientPacketFunctions::SendHousePurchase(Client* client, HouseZone* hz, int32 spawnID) {
  11. PacketStruct* packet = configReader.getStruct("WS_PlayerHousePurchase", client->GetVersion());
  12. if (packet) {
  13. int8 disable_alignment_req = rule_manager.GetGlobalRule(R_Player, DisableHouseAlignmentRequirement)->GetInt8();
  14. packet->setDataByName("house_name", hz->name.c_str());
  15. packet->setDataByName("house_id", hz->id);
  16. packet->setDataByName("spawn_id", spawnID);
  17. packet->setDataByName("purchase_coins", hz->cost_coin);
  18. packet->setDataByName("purchase_status", hz->cost_status);
  19. packet->setDataByName("upkeep_coins", hz->upkeep_coin);
  20. packet->setDataByName("upkeep_status", hz->upkeep_status);
  21. packet->setDataByName("vendor_vault_slots", hz->vault_slots);
  22. string req;
  23. if (hz->alignment > 0 && !disable_alignment_req) {
  24. req = "You must be of ";
  25. if (hz->alignment == 1)
  26. req.append("Good");
  27. else
  28. req.append("Evil");
  29. req.append(" alignment");
  30. }
  31. if (hz->guild_level > 0) {
  32. if (req.length() > 0) {
  33. req.append(", and a guild level of ");
  34. char temp[5];
  35. sprintf(temp, "%i", hz->guild_level);
  36. req.append(temp);
  37. //req.append(std::to_string(static_cast<long long>(hz->guild_level)));
  38. }
  39. else {
  40. req.append("Requires a guild of level ");
  41. char temp[5];
  42. sprintf(temp, "%i", hz->guild_level);
  43. req.append(temp);
  44. //req.append(std::to_string(static_cast<long long>(hz->guild_level)))
  45. req.append(" or above");
  46. }
  47. }
  48. if (req.length() > 0) {
  49. req.append(" in order to purchase a home within the ");
  50. req.append(hz->name);
  51. req.append(".");
  52. }
  53. packet->setDataByName("additional_reqs", req.c_str());
  54. bool enable_buy = true;
  55. if (hz->alignment > 0 && client->GetPlayer()->GetAlignment() != hz->alignment && !disable_alignment_req)
  56. enable_buy = false;
  57. if (hz->guild_level > 0 && (!client->GetPlayer()->GetGuild() || (client->GetPlayer()->GetGuild() && client->GetPlayer()->GetGuild()->GetLevel() < hz->guild_level)))
  58. enable_buy = false;
  59. packet->setDataByName("enable_buy", enable_buy ? 1 : 0);
  60. //packet->PrintPacket();
  61. client->QueuePacket(packet->serialize());
  62. }
  63. safe_delete(packet);
  64. }
  65. void ClientPacketFunctions::SendHousingList(Client* client) {
  66. if(client->GetVersion() <= 561) {
  67. return; // not supported
  68. }
  69. std::vector<PlayerHouse*> houses = world.GetAllPlayerHouses(client->GetCharacterID());
  70. // this packet must be sent first otherwise it blocks out the enter house option after paying upkeep
  71. PacketStruct* packet = configReader.getStruct("WS_CharacterHousingList", client->GetVersion());
  72. if(!packet) {
  73. return;
  74. }
  75. packet->setArrayLengthByName("num_houses", houses.size());
  76. for (int i = 0; i < houses.size(); i++)
  77. {
  78. PlayerHouse* ph = (PlayerHouse*)houses[i];
  79. HouseZone* hz = world.GetHouseZone(ph->house_id);
  80. string name;
  81. name = ph->player_name;
  82. name.append("'s ");
  83. name.append(hz->name);
  84. packet->setArrayDataByName("house_id", ph->unique_id, i);
  85. string zone_name = database.GetZoneName(hz->zone_id);
  86. if(zone_name.length() > 0)
  87. packet->setArrayDataByName("zone", zone_name.c_str(), i);
  88. packet->setArrayDataByName("house_city", hz->name.c_str(), i);
  89. packet->setArrayDataByName("house_address", "", i); // need this pulled from live
  90. packet->setArrayDataByName("house_description", name.c_str(), i);
  91. packet->setArrayDataByName("index", i, i); // they send 2, 4, 6, 8 as the index ID's on the client..
  92. // this seems to be some kind of timestamp, if we keep updating then in conjunction with upkeep_due
  93. // in SendBaseHouseWindow/WS_PlayerHouseBaseScreen being a >0 number we can access 'enter house'
  94. int32 upkeep_due = 0;
  95. if (((sint64)ph->upkeep_due - (sint64)Timer::GetUnixTimeStamp()) > 0)
  96. upkeep_due = ph->upkeep_due - Timer::GetUnixTimeStamp();
  97. if ( client->GetVersion() >= 63119 )
  98. packet->setArrayDataByName("unknown2a", 0xFFFFFFFF, i);
  99. else
  100. packet->setArrayDataByName("unknown2", 0xFFFFFFFF, i);
  101. }
  102. client->QueuePacket(packet->serialize());
  103. safe_delete(packet);
  104. }
  105. void ClientPacketFunctions::SendBaseHouseWindow(Client* client, HouseZone* hz, PlayerHouse* ph, int32 spawnID) {
  106. // if we don't send this then the enter house option won't be available if upkeep is paid
  107. if (!hz || !ph)
  108. {
  109. client->SimpleMessage(CHANNEL_COLOR_RED, "HouseZone or PlayerHouse missing and cannot send SendBaseHouseWindow");
  110. return;
  111. }
  112. string name;
  113. name = ph->player_name;
  114. name.append("'s ");
  115. name.append(hz->name);
  116. if (spawnID)
  117. SendHousingList(client);
  118. int32 upkeep_due = 0;
  119. if (((sint64)ph->upkeep_due - (sint64)Timer::GetUnixTimeStamp()) > 0)
  120. upkeep_due = ph->upkeep_due - Timer::GetUnixTimeStamp();
  121. // need this to enable the "enter house" button
  122. PacketStruct* packet = nullptr;
  123. if(client->GetVersion() > 561 && client->GetCurrentZone()->GetInstanceType() != PERSONAL_HOUSE_INSTANCE
  124. && client->GetCurrentZone()->GetInstanceType() != GUILD_HOUSE_INSTANCE) {
  125. packet = configReader.getStruct("WS_UpdateHouseAccessDataMsg", client->GetVersion());
  126. if(!packet) {
  127. return; // we need this for these clients or enter house will not work properly
  128. }
  129. if (packet) {
  130. packet->setDataByName("house_id", 0xFFFFFFFFFFFFFFFF);
  131. packet->setDataByName("success", (upkeep_due > 0) ? 0xFFFFFFFF : 0);
  132. packet->setDataByName("unknown2", 0xFFFFFFFF);
  133. packet->setDataByName("unknown3", 0xFFFFFFFF);
  134. }
  135. client->QueuePacket(packet->serialize());
  136. }
  137. safe_delete(packet);
  138. packet = configReader.getStruct("WS_PlayerHouseBaseScreen", client->GetVersion());
  139. if (packet) {
  140. packet->setDataByName("house_id", ph->unique_id);
  141. packet->setDataByName("spawn_id", spawnID);
  142. packet->setDataByName("character_id", client->GetPlayer()->GetCharacterID());
  143. packet->setDataByName("house_name", name.c_str());
  144. packet->setDataByName("zone_name", hz->name.c_str());
  145. packet->setDataByName("upkeep_cost_coins", hz->upkeep_coin);
  146. packet->setDataByName("upkeep_cost_status", hz->upkeep_status);
  147. packet->setDataByName("upkeep_due", upkeep_due);
  148. packet->setDataByName("escrow_balance_coins", ph->escrow_coins);
  149. packet->setDataByName("escrow_balance_status", ph->escrow_status);
  150. // temp - set priv level to owner for now
  151. packet->setDataByName("privlage_level", 4);
  152. // temp - set house type to personal house for now
  153. packet->setDataByName("house_type", 0);
  154. if(client->GetCurrentZone()->GetInstanceType() == PERSONAL_HOUSE_INSTANCE
  155. || client->GetCurrentZone()->GetInstanceType() == GUILD_HOUSE_INSTANCE) {
  156. packet->setDataByName("inside_house", 1);
  157. packet->setDataByName("public_access_level", 1);
  158. }
  159. packet->setDataByName("num_access", 0);
  160. packet->setDataByName("num_history", 0);
  161. // allows deposits/history to be seen -- at this point seems plausible supposed to be 'inside_house'..?
  162. packet->setDataByName("unknown3", (ph->deposits.size() || ph->history.size()) ? 1 : 0);
  163. packet->setArrayLengthByName("num_deposit", ph->deposits.size());
  164. list<Deposit>::iterator itr;
  165. int d = 0;
  166. for (itr = ph->deposits.begin(); itr != ph->deposits.end(); itr++)
  167. {
  168. packet->setArrayDataByName("deposit_name", itr->name.c_str(), d);
  169. packet->setArrayDataByName("deposit_total_coin", itr->amount, d);
  170. packet->setArrayDataByName("deposit_time_stamp", itr->timestamp, d);
  171. packet->setArrayDataByName("deposit_last_coin", itr->last_amount, d);
  172. packet->setArrayDataByName("deposit_total_status", itr->status, d);
  173. packet->setArrayDataByName("deposit_last_status", itr->last_status, d);
  174. d++;
  175. }
  176. packet->setArrayLengthByName("num_history", ph->history.size());
  177. list<HouseHistory>::iterator hitr;
  178. d = 0;
  179. for (hitr = ph->history.begin(); hitr != ph->history.end(); hitr++)
  180. {
  181. packet->setArrayDataByName("history_name", hitr->name.c_str(), d);
  182. packet->setArrayDataByName("history_coins", hitr->amount, d);
  183. packet->setArrayDataByName("history_status", hitr->status, d);
  184. packet->setArrayDataByName("history_time_stamp", hitr->timestamp, d);
  185. packet->setArrayDataByName("history_reason", hitr->reason.c_str(), d);
  186. packet->setArrayDataByName("history_add_flag", hitr->pos_flag, d);
  187. d++;
  188. }
  189. EQ2Packet* pack = packet->serialize();
  190. //DumpPacket(pack);
  191. client->QueuePacket(pack);
  192. }
  193. safe_delete(packet);
  194. }
  195. void ClientPacketFunctions::SendHouseVisitWindow(Client* client, vector<PlayerHouse*> houses) {
  196. PacketStruct* packet = configReader.getStruct("WS_DisplayVisitScreen", client->GetVersion());
  197. if (packet) {
  198. vector<PlayerHouse*>::iterator itr;
  199. packet->setArrayLengthByName("num_houses", houses.size());
  200. int16 i = 0;
  201. for (itr = houses.begin(); itr != houses.end(); itr++) {
  202. PlayerHouse* ph = *itr;
  203. if (ph) {
  204. HouseZone* hz = world.GetHouseZone(ph->house_id);
  205. if (hz) {
  206. packet->setArrayDataByName("house_id", ph->unique_id, i);
  207. packet->setArrayDataByName("house_owner", ph->player_name.c_str(), i);
  208. packet->setArrayDataByName("house_location", hz->name.c_str(), i);
  209. packet->setArrayDataByName("house_zone", client->GetCurrentZone()->GetZoneName(), i);
  210. if ( string(client->GetPlayer()->GetName()).compare(ph->player_name) == 0 )
  211. packet->setArrayDataByName("access_level", 4, i);
  212. else
  213. packet->setArrayDataByName("access_level", 1, i);
  214. packet->setArrayDataByName("visit_flag", 0, i); // 0 = allowed to visit, 1 = owner hasn't paid upkeep
  215. i++;
  216. }
  217. }
  218. }
  219. client->QueuePacket(packet->serialize());
  220. }
  221. safe_delete(packet);
  222. }
  223. /*
  224. <Struct Name="WS_DisplayVisitScreen" ClientVersion="1193" OpcodeName="OP_DisplayInnVisitScreenMsg">
  225. <Data ElementName="num_houses" Type="int16" Size="1" />
  226. <Data ElementName="visithouse_array" Type="Array" ArraySizeVariable="num_houses">
  227. <Data ElementName="house_id" Type="int64" />
  228. <Data ElementName="house_owner" Type="EQ2_16Bit_String" />
  229. <Data ElementName="house_location" Type="EQ2_16Bit_string" />
  230. <Data ElementName="house_zone" Type="EQ2_16Bit_String" />
  231. <Data ElementName="access_level" Type="int8" Size="1" />
  232. <Data ElementName="unknown3" Type="int8" Size="3" />
  233. <Data ElementName="visit_flag" Type="int8" Size="1" />
  234. </Data>
  235. <Data ElementName="unknown4" Type="int32" Size="1" />
  236. <Data ElementName="unknown5" Type="int8" Size="1" />
  237. </Struct>
  238. */
  239. void ClientPacketFunctions::SendLocalizedTextMessage(Client* client)
  240. {
  241. /***
  242. -- OP_ReloadLocalizedTxtMsg --
  243. 5/26/2020 19:08:41
  244. 69.174.200.100 -> 192.168.1.1
  245. 0000: 01 FF 63 01 62 00 00 00 1C 00 49 72 6F 6E 74 6F ..c.b.....Ironto
  246. 0010: 65 73 20 45 61 73 74 20 4C 61 72 67 65 20 49 6E es East Large In
  247. 0020: 6E 20 52 6F 6F 6D 07 01 00 00 00 1C 00 49 72 6F n Room.......Iro
  248. 0030: 6E 74 6F 65 73 20 45 61 73 74 20 4C 61 72 67 65 ntoes East Large
  249. 0040: 20 49 6E 6E 20 52 6F 6F 6D 07 02 00 00 00 1C 00 Inn Room.......
  250. 0050: 49 72 6F 6E 74 6F 65 73 20 45 61 73 74 20 4C 61 Irontoes East La
  251. 0060: 72 67 65 20 49 6E 6E 20 52 6F 6F 6D 07 03 00 00 rge Inn Room....
  252. 0070: 00 1C 00 49 72 6F 6E 74 6F 65 73 20 45 61 73 74 ...Irontoes East
  253. 0080: 20 4C 61 72 67 65 20 49 6E 6E 20 52 6F 6F 6D 07 Large Inn Room.
  254. 0090: 04 00 00 00 1C 00 49 72 6F 6E 74 6F 65 73 20 45 ......Irontoes E
  255. 00A0: 61 73 74 20 4C 61 72 67 65 20 49 6E 6E 20 52 6F ast Large Inn Ro
  256. 00B0: 6F 6D 07 05 00 00 00 1C 00 49 72 6F 6E 74 6F 65 om.......Irontoe
  257. 00C0: 73 20 45 61 73 74 20 4C 61 72 67 65 20 49 6E 6E s East Large Inn
  258. 00D0: 20 52 6F 6F 6D 07 06 00 00 00 1C 00 49 72 6F 6E Room.......Iron
  259. 00E0: 74 6F 65 73 20 45 61 73 74 20 4C 61 72 67 65 20 toes East Large
  260. 00F0: 49 6E 6E 20 52 6F 6F 6D 07 07 00 00 00 19 00 51 Inn Room.......Q
  261. 0100: 65 79 6E 6F 73 20 47 75 69 6C 64 20 48 61 6C 6C eynos Guild Hall
  262. 0110: 2C 20 54 69 65 72 20 31 07 08 00 00 00 16 00 4C , Tier 1.......L
  263. 0120: 69 6F 6E 27 73 20 4D 61 6E 65 20 53 75 69 74 65 ion's Mane Suite
  264. 0130: 20 52 6F 6F 6D 07 09 00 00 00 16 00 4C 69 6F 6E Room.......Lion
  265. 0140: 27 73 20 4D 61 6E 65 20 53 75 69 74 65 20 52 6F 's Mane Suite Ro
  266. 0150: 6F 6D 07 0A 00 00 00 16 00 4C 69 6F 6E 27 73 20 om.......Lion's
  267. 0160: 4D 61 6E 65 20 53 75 69 74 65 20 52 6F 6F 6D 07 Mane Suite Room.
  268. 0170: 0B 00 00 00 16 00 4C 69 6F 6E 27 73 20 4D 61 6E ......Lion's Man
  269. 0180: 65 20 53 75 69 74 65 20 52 6F 6F 6D 07 0C 00 00 e Suite Room....
  270. 0190: 00 0E 00 32 20 4C 75 63 69 65 20 53 74 72 65 65 ...2 Lucie Stree
  271. 01A0: 74 07 0D 00 00 00 0F 00 31 37 20 54 72 61 6E 71 t.......17 Tranq
  272. 01B0: 75 69 6C 20 57 61 79 07 0E 00 00 00 0E 00 38 20 uil Way.......8
  273. 01C0: 4C 75 63 69 65 20 53 74 72 65 65 74 07 0F 00 00 Lucie Street....
  274. 01D0: 00 0F 00 31 32 20 4C 75 63 69 65 20 53 74 72 65 ...12 Lucie Stre
  275. 01E0: 65 74 07 10 00 00 00 0F 00 31 38 20 4C 75 63 69 et.......18 Luci
  276. 01F0: 65 20 53 74 72 65 65 74 07 11 00 00 00 0F 00 32 e Street.......2
  277. 0200: 30 20 4C 75 63 69 65 20 53 74 72 65 65 74 07 12 0 Lucie Street..
  278. 0210: 00 00 00 0E 00 33 20 54 72 61 6E 71 75 69 6C 20 .....3 Tranquil
  279. 0220: 57 61 79 07 13 00 00 00 0E 00 37 20 54 72 61 6E Way.......7 Tran
  280. 0230: 71 75 69 6C 20 57 61 79 07 14 00 00 00 0F 00 31 quil Way.......1
  281. 0240: 33 20 54 72 61 6E 71 75 69 6C 20 57 61 79 07 15 3 Tranquil Way..
  282. 0250: 00 00 00 0F 00 31 35 20 54 72 61 6E 71 75 69 6C .....15 Tranquil
  283. 0260: 20 57 61 79 07 16 00 00 00 19 00 51 65 79 6E 6F Way.......Qeyno
  284. 0270: 73 20 47 75 69 6C 64 20 48 61 6C 6C 2C 20 54 69 s Guild Hall, Ti
  285. 0280: 65 72 20 32 07 17 00 00 00 0F 00 38 20 45 72 6F er 2.......8 Ero
  286. 0290: 6C 6C 69 73 69 20 4C 61 6E 65 07 18 00 00 00 0F llisi Lane......
  287. 02A0: 00 35 20 45 72 6F 6C 6C 69 73 69 20 4C 61 6E 65 .5 Erollisi Lane
  288. 02B0: 07 19 00 00 00 0E 00 35 20 4B 61 72 61 6E 61 20 .......5 Karana
  289. 02C0: 43 6F 75 72 74 07 1A 00 00 00 0D 00 32 20 42 61 Court.......2 Ba
  290. 02D0: 79 6C 65 20 43 6F 75 72 74 07 1B 00 00 00 0D 00 yle Court.......
  291. 02E0: 34 20 42 61 79 6C 65 20 43 6F 75 72 74 07 1C 00 4 Bayle Court...
  292. 02F0: 00 00 16 00 4C 69 6F 6E 27 73 20 4D 61 6E 65 20 ....Lion's Mane
  293. 0300: 53 75 69 74 65 20 52 6F 6F 6D 07 1D 00 00 00 16 Suite Room......
  294. 0310: 00 4C 69 6F 6E 27 73 20 4D 61 6E 65 20 53 75 69 .Lion's Mane Sui
  295. 0320: 74 65 20 52 6F 6F 6D 07 1E 00 00 00 16 00 4C 69 te Room.......Li
  296. 0330: 6F 6E 27 73 20 4D 61 6E 65 20 53 75 69 74 65 20 on's Mane Suite
  297. 0340: 52 6F 6F 6D 07 1F 00 00 00 16 00 4C 69 6F 6E 27 Room.......Lion'
  298. 0350: 73 20 4D 61 6E 65 20 53 75 69 74 65 20 52 6F 6F s Mane Suite Roo
  299. 0360: 6D 07 20 00 00 00 0E 00 35 20 4C 75 63 69 65 20 m. .....5 Lucie
  300. 0370: 53 74 72 65 65 74 07 21 00 00 00 0F 00 32 30 20 Street.!.....20
  301. 0380: 4B 61 72 61 6E 61 20 43 6F 75 72 74 07 22 00 00 Karana Court."..
  302. 0390: 00 0E 00 39 20 4C 75 63 69 65 20 53 74 72 65 65 ...9 Lucie Stree
  303. 03A0: 74 07 23 00 00 00 0F 00 31 35 20 4C 75 63 69 65 t.#.....15 Lucie
  304. 03B0: 20 53 74 72 65 65 74 07 24 00 00 00 0F 00 31 37 Street.$.....17
  305. 03C0: 20 4C 75 63 69 65 20 53 74 72 65 65 74 07 25 00 Lucie Street.%.
  306. 03D0: 00 00 0F 00 32 31 20 4C 75 63 69 65 20 53 74 72 ....21 Lucie Str
  307. 03E0: 65 65 74 07 26 00 00 00 0E 00 36 20 4B 61 72 61 eet.&.....6 Kara
  308. 03F0: 6E 61 20 43 6F 75 72 74 07 27 00 00 00 0F 00 31 na Court.'.....1
  309. 0400: 32 20 4B 61 72 61 6E 61 20 43 6F 75 72 74 07 28 2 Karana Court.(
  310. 0410: 00 00 00 0F 00 31 34 20 4B 61 72 61 6E 61 20 43 .....14 Karana C
  311. 0420: 6F 75 72 74 07 29 00 00 00 0F 00 31 38 20 4B 61 ourt.).....18 Ka
  312. 0430: 72 61 6E 61 20 43 6F 75 72 74 07 2A 00 00 00 1E rana Court.*....
  313. 0440: 00 43 6F 6E 63 6F 72 64 69 75 6D 20 54 6F 77 65 .Concordium Towe
  314. 0450: 72 20 4D 61 67 69 63 61 6C 20 4D 61 6E 6F 72 07 r Magical Manor.
  315. 0460: 2B 00 00 00 15 00 41 72 63 61 6E 65 20 41 63 61 +.....Arcane Aca
  316. 0470: 64 65 6D 79 20 50 6F 72 74 61 6C 07 2C 00 00 00 demy Portal.,...
  317. 0480: 13 00 43 6F 75 72 74 20 6F 66 20 74 68 65 20 4D ..Court of the M
  318. 0490: 61 73 74 65 72 07 2D 00 00 00 13 00 43 69 74 79 aster.-.....City
  319. 04A0: 20 6F 66 20 4D 69 73 74 20 45 73 74 61 74 65 07 of Mist Estate.
  320. 04B0: 2E 00 00 00 10 00 44 61 72 6B 6C 69 67 68 74 20 ......Darklight
  321. 04C0: 50 61 6C 61 63 65 07 2F 00 00 00 11 00 44 65 65 Palace./.....Dee
  322. 04D0: 70 77 61 74 65 72 20 52 65 74 72 65 61 74 07 30 pwater Retreat.0
  323. 04E0: 00 00 00 24 00 44 68 61 6C 67 61 72 20 50 72 65 ...$.Dhalgar Pre
  324. 04F0: 63 69 70 69 63 65 20 6F 66 20 74 68 65 20 44 65 cipice of the De
  325. 0500: 65 70 20 50 6F 72 74 61 6C 07 31 00 00 00 12 00 ep Portal.1.....
  326. 0510: 44 69 6D 65 6E 73 69 6F 6E 61 6C 20 50 6F 63 6B Dimensional Pock
  327. 0520: 65 74 07 32 00 00 00 0B 00 44 6F 6A 6F 20 50 6F et.2.....Dojo Po
  328. 0530: 72 74 61 6C 07 33 00 00 00 21 00 45 6C 61 62 6F rtal.3...!.Elabo
  329. 0540: 72 61 74 65 20 45 73 74 61 74 65 20 6F 66 20 55 rate Estate of U
  330. 0550: 6E 72 65 73 74 20 50 6F 72 74 61 6C 07 34 00 00 nrest Portal.4..
  331. 0560: 00 11 00 45 74 68 65 72 6E 65 72 65 20 45 6E 63 ...Ethernere Enc
  332. 0570: 6C 61 76 65 07 35 00 00 00 10 00 45 76 65 72 66 lave.5.....Everf
  333. 0580: 72 6F 73 74 20 50 6F 72 74 61 6C 07 36 00 00 00 rost Portal.6...
  334. 0590: 16 00 46 65 61 72 66 75 6C 20 52 65 74 72 65 61 ..Fearful Retrea
  335. 05A0: 74 20 50 6F 72 74 61 6C 07 37 00 00 00 0F 00 46 t Portal.7.....F
  336. 05B0: 65 6C 77 69 74 68 65 20 50 6F 72 74 61 6C 07 38 elwithe Portal.8
  337. 05C0: 00 00 00 10 00 46 72 65 65 62 6C 6F 6F 64 20 50 .....Freeblood P
  338. 05D0: 6F 72 74 61 6C 07 39 00 00 00 0C 00 46 72 69 67 ortal.9.....Frig
  339. 05E0: 68 74 20 4D 61 6E 6F 72 07 3A 00 00 00 11 00 47 ht Manor.:.....G
  340. 05F0: 61 6C 6C 65 6F 6E 20 6F 66 20 44 72 65 61 6D 73 alleon of Dreams
  341. 0600: 07 3B 00 00 00 14 00 48 61 6C 6C 20 6F 66 20 74 .;.....Hall of t
  342. 0610: 68 65 20 43 68 61 6D 70 69 6F 6E 07 3C 00 00 00 he Champion.<...
  343. 0620: 10 00 48 75 61 20 4D 65 69 6E 20 52 65 74 72 65 ..Hua Mein Retre
  344. 0630: 61 74 07 3D 00 00 00 1C 00 49 73 6C 65 20 6F 66 at.=.....Isle of
  345. 0640: 20 52 65 66 75 67 65 20 50 72 65 73 74 69 67 65 Refuge Prestige
  346. 0650: 20 48 6F 6D 65 07 3E 00 00 00 0F 00 4B 65 72 61 Home.>.....Kera
  347. 0660: 66 79 72 6D 27 73 20 4C 61 69 72 07 3F 00 00 00 fyrm's Lair.?...
  348. 0670: 0E 00 4B 72 6F 6D 7A 65 6B 20 50 6F 72 74 61 6C ..Kromzek Portal
  349. 0680: 07 40 00 00 00 10 00 4C 61 76 61 73 74 6F 72 6D .@.....Lavastorm
  350. 0690: 20 50 6F 72 74 61 6C 07 41 00 00 00 0E 00 4C 69 Portal.A.....Li
  351. 06A0: 62 72 61 72 79 20 50 6F 72 74 61 6C 07 42 00 00 brary Portal.B..
  352. 06B0: 00 0B 00 4D 61 72 61 20 45 73 74 61 74 65 07 43 ...Mara Estate.C
  353. 06C0: 00 00 00 21 00 4D 61 6A 27 44 75 6C 20 41 73 74 ...!.Maj'Dul Ast
  354. 06D0: 72 6F 6E 6F 6D 65 72 27 73 20 54 6F 77 65 72 20 ronomer's Tower
  355. 06E0: 50 6F 72 74 61 6C 07 44 00 00 00 14 00 4D 61 6A Portal.D.....Maj
  356. 06F0: 27 44 75 6C 20 53 75 69 74 65 20 50 6F 72 74 61 'Dul Suite Porta
  357. 0700: 6C 07 45 00 00 00 17 00 4D 69 73 74 6D 6F 6F 72 l.E.....Mistmoor
  358. 0710: 65 20 43 72 61 67 73 20 45 73 74 61 74 65 73 07 e Crags Estates.
  359. 0720: 46 00 00 00 0D 00 4F 61 6B 6D 79 73 74 20 47 6C F.....Oakmyst Gl
  360. 0730: 61 64 65 07 47 00 00 00 12 00 4F 70 65 72 61 20 ade.G.....Opera
  361. 0740: 48 6F 75 73 65 20 50 6F 72 74 61 6C 07 48 00 00 House Portal.H..
  362. 0750: 00 16 00 50 65 72 73 6F 6E 61 6C 20 47 72 6F 74 ...Personal Grot
  363. 0760: 74 6F 20 50 6F 72 74 61 6C 07 49 00 00 00 17 00 to Portal.I.....
  364. 0770: 52 75 6D 20 52 75 6E 6E 65 72 73 20 43 6F 76 65 Rum Runners Cove
  365. 0780: 20 50 6F 72 74 61 6C 07 4A 00 00 00 12 00 50 6C Portal.J.....Pl
  366. 0790: 61 6E 65 74 61 72 69 75 6D 20 50 6F 72 74 61 6C anetarium Portal
  367. 07A0: 07 4B 00 00 00 14 00 52 65 73 65 61 72 63 68 65 .K.....Researche
  368. 07B0: 72 27 73 20 53 61 6E 63 74 75 6D 07 4C 00 00 00 r's Sanctum.L...
  369. 07C0: 1E 00 52 65 73 69 64 65 6E 63 65 20 6F 66 20 74 ..Residence of t
  370. 07D0: 68 65 20 42 6C 61 64 65 73 20 50 6F 72 74 61 6C he Blades Portal
  371. 07E0: 07 4D 00 00 00 16 00 53 61 6E 63 74 75 73 20 53 .M.....Sanctus S
  372. 07F0: 65 72 75 20 50 72 6F 6D 65 6E 61 64 65 07 4E 00 eru Promenade.N.
  373. 0800: 00 00 22 00 53 61 6E 74 61 20 47 6C 75 67 27 73 ..".Santa Glug's
  374. 0810: 20 43 68 65 65 72 66 75 6C 20 48 6F 6C 69 64 61 Cheerful Holida
  375. 0820: 79 20 48 6F 6D 65 07 4F 00 00 00 17 00 53 65 63 y Home.O.....Sec
  376. 0830: 6C 75 64 65 64 20 53 61 6E 63 74 75 6D 20 50 6F luded Sanctum Po
  377. 0840: 72 74 61 6C 07 50 00 00 00 18 00 53 6B 79 62 6C rtal.P.....Skybl
  378. 0850: 61 64 65 20 53 6B 69 66 66 20 4C 61 75 6E 63 68 ade Skiff Launch
  379. 0860: 70 61 64 07 51 00 00 00 0E 00 53 6E 6F 77 79 20 pad.Q.....Snowy
  380. 0870: 44 77 65 6C 6C 69 6E 67 07 52 00 00 00 1D 00 53 Dwelling.R.....S
  381. 0880: 70 72 6F 63 6B 65 74 27 73 20 49 6E 74 65 72 6C procket's Interl
  382. 0890: 6F 63 6B 69 6E 67 20 50 6C 61 6E 65 07 53 00 00 ocking Plane.S..
  383. 08A0: 00 17 00 53 74 6F 72 6D 20 54 6F 77 65 72 20 49 ...Storm Tower I
  384. 08B0: 73 6C 65 20 50 6F 72 74 61 6C 07 54 00 00 00 21 sle Portal.T...!
  385. 08C0: 00 52 65 6C 69 63 20 54 69 6E 6B 65 72 20 50 72 .Relic Tinker Pr
  386. 08D0: 65 73 74 69 67 65 20 48 6F 6D 65 20 50 6F 72 74 estige Home Port
  387. 08E0: 61 6C 07 55 00 00 00 10 00 54 65 6E 65 62 72 6F al.U.....Tenebro
  388. 08F0: 75 73 20 50 6F 72 74 61 6C 07 56 00 00 00 10 00 us Portal.V.....
  389. 0900: 54 68 65 20 42 61 75 62 62 6C 65 73 68 69 72 65 The Baubbleshire
  390. 0910: 07 57 00 00 00 0F 00 54 69 6E 6B 65 72 65 72 27 .W.....Tinkerer'
  391. 0920: 73 20 49 73 6C 65 07 58 00 00 00 12 00 54 6F 77 s Isle.X.....Tow
  392. 0930: 65 72 20 6F 66 20 4B 6E 6F 77 6C 65 64 67 65 07 er of Knowledge.
  393. 0940: 59 00 00 00 15 00 55 6E 63 61 6E 6E 79 20 45 73 Y.....Uncanny Es
  394. 0950: 74 61 74 65 20 50 6F 72 74 61 6C 07 5A 00 00 00 tate Portal.Z...
  395. 0960: 1E 00 56 61 63 61 6E 74 20 45 73 74 61 74 65 20 ..Vacant Estate
  396. 0970: 6F 66 20 55 6E 72 65 73 74 20 50 6F 72 74 61 6C of Unrest Portal
  397. 0980: 07 5B 00 00 00 18 00 56 61 6C 65 20 6F 66 20 48 .[.....Vale of H
  398. 0990: 61 6C 66 70 69 6E 74 20 44 65 6C 69 67 68 74 07 alfpint Delight.
  399. 09A0: 5C 00 00 00 26 00 4C 69 6F 6E 27 73 20 4D 61 6E \...&.Lion's Man
  400. 09B0: 65 20 56 65 73 74 69 67 65 20 52 6F 6F 6D 20 2D e Vestige Room -
  401. 09C0: 20 4E 65 74 74 6C 65 76 69 6C 6C 65 07 5D 00 00 Nettleville.]..
  402. 09D0: 00 2C 00 4C 69 6F 6E 27 73 20 4D 61 6E 65 20 56 .,.Lion's Mane V
  403. 09E0: 65 73 74 69 67 65 20 52 6F 6F 6D 20 2D 20 53 74 estige Room - St
  404. 09F0: 61 72 63 72 65 73 74 20 43 6F 6D 6D 75 6E 65 07 arcrest Commune.
  405. 0A00: 5E 00 00 00 29 00 4C 69 6F 6E 27 73 20 4D 61 6E ^...).Lion's Man
  406. 0A10: 65 20 56 65 73 74 69 67 65 20 52 6F 6F 6D 20 2D e Vestige Room -
  407. 0A20: 20 47 72 61 79 73 74 6F 6E 65 20 59 61 72 64 07 Graystone Yard.
  408. 0A30: 5F 00 00 00 2C 00 4C 69 6F 6E 27 73 20 4D 61 6E _...,.Lion's Man
  409. 0A40: 65 20 56 65 73 74 69 67 65 20 52 6F 6F 6D 20 2D e Vestige Room -
  410. 0A50: 20 43 61 73 74 6C 65 76 69 65 77 20 48 61 6D 6C Castleview Haml
  411. 0A60: 65 74 07 60 00 00 00 2A 00 4C 69 6F 6E 27 73 20 et.`...*.Lion's
  412. 0A70: 4D 61 6E 65 20 56 65 73 74 69 67 65 20 52 6F 6F Mane Vestige Roo
  413. 0A80: 6D 20 2D 20 54 68 65 20 57 69 6C 6C 6F 77 20 57 m - The Willow W
  414. 0A90: 6F 6F 64 07 61 00 00 00 2B 00 4C 69 6F 6E 27 73 ood.a...+.Lion's
  415. 0AA0: 20 4D 61 6E 65 20 56 65 73 74 69 67 65 20 52 6F Mane Vestige Ro
  416. 0AB0: 6F 6D 20 2D 20 54 68 65 20 42 61 75 62 62 6C 65 om - The Baubble
  417. 0AC0: 73 68 69 72 65 07 62 00 00 00 FF FF FF FF shire.b.......
  418. */
  419. }