9
3

client.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*
  2. EQ2Emulator: Everquest II Server Emulator
  3. Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net)
  4. This file is part of EQ2Emulator.
  5. EQ2Emulator is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. EQ2Emulator is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with EQ2Emulator. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #ifndef CLIENT_H
  17. #define CLIENT_H
  18. #include "../common/EQStream.h"
  19. #include <list>
  20. #include "../common/timer.h"
  21. #include "zoneserver.h"
  22. #include "Player.h"
  23. #include "Quests.h"
  24. using namespace std;
  25. #define CLIENT_TIMEOUT 60000
  26. struct TransportDestination;
  27. struct ConversationOption;
  28. #define MAIL_SEND_RESULT_SUCCESS 0
  29. #define MAIL_SEND_RESULT_UNKNOWN_PLAYER 1
  30. #define MAIL_SEND_RESULT_CANNOT_SEND_TO_PLAYER 2
  31. #define MAIL_SEND_RESULT_GIFT_WRONG_SERVER 3 /* Cannot send gifts across worlds */
  32. #define MAIL_SEND_RESULT_CANNOT_SEND_TO_SELF 4
  33. #define MAIL_SEND_RESULT_MAILBOX_FULL 5
  34. #define MAIL_SEND_RESULT_NOT_ENOUGH_COIN 6
  35. #define MAIL_SEND_RESULT_ITEM_IN_BAG 7 /* Cannot send non-empty bags as gifts */
  36. #define MAIL_SEND_RESULT_NOT_IN_GUILD 8
  37. #define MAIL_SEND_RESULT_GUILD_ACCESS_DENIED 9
  38. #define MAIL_SEND_RESULT_GIFTS_TO_GUILD 10 /* Cannot send gifts to entire guild */
  39. #define MAIL_SEND_RESULT_EMPTY_TO_LIST 11 /* Empty recipient list */
  40. #define MAIL_SEND_RESULT_TRIAL_PLAYERS 12 /* Cannot send mail to trial players */
  41. #define MAIL_SEND_RESULT_MAIL_WRONG_SERVER 13 /* Cannot send mail across worlds */
  42. #define MAIL_SEND_RESULT_UNKNOWN_ERROR 14
  43. #define MAIL_TYPE_REGULAR 0
  44. #define MAIL_TYPE_SPAM 1
  45. #define MAIL_TYPE_GM 2
  46. struct QueuedQuest{
  47. Quest* quest;
  48. int32 step;
  49. bool display_quest_helper;
  50. };
  51. struct BuyBackItem{
  52. int32 item_id;
  53. int32 unique_id;
  54. int16 quantity;
  55. int32 price;
  56. bool save_needed;
  57. };
  58. struct MacroData{
  59. string name;
  60. string text;
  61. int16 icon;
  62. };
  63. struct Mail {
  64. int32 mail_id;
  65. int32 player_to_id;
  66. string player_from;
  67. string subject;
  68. string mail_body;
  69. int8 already_read;
  70. int8 mail_type;
  71. int32 coin_copper;
  72. int32 coin_silver;
  73. int32 coin_gold;
  74. int32 coin_plat;
  75. int16 stack;
  76. int32 postage_cost;
  77. int32 attachment_cost;
  78. int32 char_item_id;
  79. int32 time_sent;
  80. int32 expire_time;
  81. int8 save_needed;
  82. };
  83. struct MailWindow {
  84. int32 coin_copper;
  85. int32 coin_silver;
  86. int32 coin_gold;
  87. int32 coin_plat;
  88. int32 char_item_id;
  89. };
  90. struct PendingGuildInvite {
  91. Guild* guild;
  92. Player* invited_by;
  93. };
  94. struct PendingResurrection {
  95. Spawn* caster;
  96. Timer* expire_timer;
  97. string spell_name;
  98. string heal_name;
  99. bool active;
  100. float hp_perc;
  101. float mp_perc;
  102. float range;
  103. int8 crit_mod;
  104. bool no_calcs;
  105. int32 subspell;
  106. bool crit;
  107. bool should_delete;
  108. int32 spell_visual;
  109. };
  110. #define PAPERDOLL_TYPE_FULL 0
  111. #define PAPERDOLL_TYPE_HEAD 1
  112. struct IncomingPaperdollImage {
  113. uchar* image_bytes;
  114. int32 current_size_bytes;
  115. int8 image_num_packets;
  116. int8 last_received_packet_index;
  117. int8 image_type;
  118. };
  119. class Client {
  120. public:
  121. Client(EQStream* ieqs);
  122. ~Client();
  123. bool Process(bool zone_process = false);
  124. void Disconnect(bool send_disconnect = true);
  125. void SetConnected(bool val){ connected = val; }
  126. bool IsConnected(){ return connected; }
  127. bool IsReadyForSpawns(){ return ready_for_spawns; }
  128. bool IsReadyForUpdates() { return ready_for_updates; }
  129. bool IsZoning(){ return client_zoning; }
  130. void SetReadyForSpawns(bool val);
  131. void QueuePacket(EQ2Packet* app);
  132. void SendLoginInfo();
  133. void SimpleMessage(int8 color, const char* message);
  134. void Message(int8 type, const char* message, ...);
  135. void SendSpellUpdate(Spell* spell);
  136. void Zone(ZoneServer* new_zone, bool set_coords = true);
  137. void Zone(const char* new_zone, bool set_coords = true);
  138. void Zone(int32 zoneid, bool set_coords = true);
  139. void Zone(int32 instanceid, bool set_coords = true, bool byInstanceID=false);
  140. void SendZoneInfo();
  141. void SendZoneSpawns();
  142. void HandleVerbRequest(EQApplicationPacket* app);
  143. void SendCharInfo();
  144. void SendLoginDeniedBadVersion();
  145. void SendCharPOVGhost();
  146. void SendPlayerDeathWindow();
  147. float DistanceFrom(Client* client);
  148. void SendDefaultGroupOptions();
  149. bool HandleLootItem(Entity* entity, int32 item_id);
  150. bool HandleLootItem(Entity* entity, Item* item);
  151. void HandleLoot(EQApplicationPacket* app);
  152. void HandleSkillInfoRequest(EQApplicationPacket* app);
  153. void HandleExamineInfoRequest(EQApplicationPacket* app);
  154. void HandleQuickbarUpdateRequest(EQApplicationPacket* app);
  155. void SendPopupMessage(int8 unknown, const char* text, const char* type, float size, int8 red, int8 green, int8 blue);
  156. void PopulateSkillMap();
  157. void ChangeLevel(int16 old_level, int16 new_level);
  158. void ChangeTSLevel(int16 old_level, int16 new_level);
  159. bool Summon(const char* search_name);
  160. bool TryZoneInstance(int32 zoneID, bool zone_coords_valid=false);
  161. bool GotoSpawn(const char* search_name);
  162. void DisplayDeadWindow();
  163. void HandlePlayerRevive(int32 point_id);
  164. void Bank(Spawn* banker, bool cancel = false);
  165. void BankWithdrawal(int64 amount);
  166. void BankDeposit(int64 amount);
  167. Spawn* GetBanker();
  168. void SetBanker(Spawn* in_banker);
  169. bool AddItem(int32 item_id, int16 quantity = 0);
  170. bool AddItem(Item* item);
  171. bool AddItemToBank(int32 item_id, int16 quantity = 0);
  172. bool AddItemToBank(Item* item);
  173. bool RemoveItem(Item *item, int16 quantity);
  174. void ProcessTeleport(Spawn* spawn, vector<TransportDestination*>* destinations, int32 transport_id = 0);
  175. void ProcessTeleportLocation(EQApplicationPacket* app);
  176. void UpdateCharacterInstances();
  177. void SetLastSavedTimeStamp(int32 unixts) { last_saved_timestamp = unixts; }
  178. int32 GetLastSavedTimeStamp() { return last_saved_timestamp; }
  179. bool CheckZoneAccess(const char* zoneName);
  180. ZoneServer* GetCurrentZone();
  181. void SetCurrentZoneByInstanceID(int32 id, int32 zoneid);
  182. //void SetCurrentZoneByInstanceID(instanceid, zoneid);
  183. void SetCurrentZone(int32 id);
  184. void SetCurrentZone(ZoneServer* zone) {
  185. current_zone = zone;
  186. player->SetZone(zone);
  187. }
  188. Player* GetPlayer(){ return player; }
  189. EQStream* getConnection(){ return eqs; }
  190. inline int32 GetIP() { return ip; }
  191. inline int16 GetPort() { return port; }
  192. inline int32 WaitingForBootup() { return pwaitingforbootup; }
  193. inline int32 GetCharacterID() { return character_id; }
  194. inline int32 GetAccountID() { return account_id; }
  195. inline const char* GetAccountName() { return account_name; }
  196. inline sint16 GetAdminStatus() { return admin_status; }
  197. inline int16 GetVersion() { return version; }
  198. void SetNameCRC(int32 val){ name_crc = val; }
  199. int32 GetNameCRC(){ return name_crc; }
  200. void SetVersion(int16 new_version){ version = new_version; }
  201. void SetAccountID(int32 in_accountid) { account_id = in_accountid; }
  202. void SetCharacterID(int32 in_characterid) { character_id = in_characterid; }
  203. void SetAdminStatus(sint16 in_status) { admin_status = in_status; }
  204. void DetermineCharacterUpdates ( );
  205. void UpdateTimeStampFlag ( int8 flagType )
  206. {
  207. if(! (timestamp_flag & flagType ) )
  208. timestamp_flag |= flagType;
  209. }
  210. int8 GetTimeStampFlag ( ) { return timestamp_flag; }
  211. bool UpdateQuickbarNeeded();
  212. void Save();
  213. bool remove_from_list;
  214. void CloseLoot();
  215. void SendPendingLoot(int32 total_coins, Entity* entity);
  216. void Loot(int32 total_coins, vector<Item*>* items, Entity* entity);
  217. void Loot(Entity* entity);
  218. void CheckPlayerQuestsKillUpdate(Spawn* spawn);
  219. void CheckPlayerQuestsChatUpdate(Spawn* spawn);
  220. void CheckPlayerQuestsItemUpdate(Item* item);
  221. void CheckPlayerQuestsSpellUpdate(Spell* spell);
  222. void CheckPlayerQuestsLocationUpdate();
  223. void AddPendingQuest(Quest* quest);
  224. Quest* GetPendingQuest(int32 id);
  225. void RemovePendingQuest(Quest* quest);
  226. void SetPlayerQuest(Quest* quest, map<int32, int32>* progress);
  227. void AddPlayerQuest(Quest* quest, bool call_accepted = true, bool send_packets = true);
  228. void RemovePlayerQuest(int32 id, bool send_update = true, bool delete_quest = true);
  229. void SendQuestJournal(bool all_quests = false, Client* client = 0);
  230. void SendQuestUpdate(Quest* quest);
  231. void SendQuestFailure(Quest* quest);
  232. void SendQuestUpdateStep(Quest* quest, int32 step, bool display_quest_helper = true);
  233. void SendQuestUpdateStepImmediately(Quest* quest, int32 step, bool display_quest_helper = true);
  234. void DisplayQuestComplete(Quest* quest);
  235. void DisplayRandomizeFeatures(int32 features);
  236. void AcceptQuestReward(Quest* quest, int32 item_id);
  237. Quest* GetPendingQuestAcceptance(int32 item_id);
  238. Quest* GetActiveQuest(int32 quest_id);
  239. void DisplayConversation(int32 conversation_id, int32 spawn_id, vector<ConversationOption>* conversations, const char* text, const char* mp3, int32 key1, int32 key2);
  240. void DisplayConversation(Item* item, vector<ConversationOption>* conversations, const char* text, int8 type, const char* mp3 = 0, int32 key1 = 0, int32 key2 = 0);
  241. void DisplayConversation(Entity* npc, int8 type, vector<ConversationOption>* conversations, const char* text, const char* mp3 = 0, int32 key1 = 0, int32 key2 = 0);
  242. void CloseDialog(int32 conversation_id);
  243. int32 GetConversationID(Spawn* spawn, Item* item);
  244. void CombineSpawns(float radius, Spawn* spawn);
  245. void AddCombineSpawn(Spawn* spawn);
  246. void RemoveCombineSpawn(Spawn* spawn);
  247. void SaveCombineSpawns(const char* name = 0);
  248. Spawn* GetCombineSpawn();
  249. bool ShouldTarget();
  250. void TargetSpawn(Spawn* spawn);
  251. void ReloadQuests();
  252. int32 GetCurrentQuestID(){ return current_quest_id; }
  253. void SetLuaDebugClient(bool val);
  254. void SetMerchantTransaction(Spawn* spawn);
  255. Spawn* GetMerchantTransaction();
  256. void SetMailTransaction(Spawn* spawn);
  257. Spawn* GetMailTransaction();
  258. void PlaySound(const char* name);
  259. void SendBuyMerchantList(bool sell = false);
  260. void SendSellMerchantList(bool sell = false);
  261. void SendBuyBackList(bool sell = false);
  262. void SendRepairList();
  263. void ShowLottoWindow();
  264. void PlayLotto(int32 price, int32 ticket_item_id);
  265. void SendGuildCreateWindow();
  266. float CalculateBuyMultiplier(int32 merchant_id);
  267. float CalculateSellMultiplier(int32 merchant_id);
  268. void BuyItem(int32 item_id, int16 quantity);
  269. void SellItem(int32 item_id, int16 quantity, int32 unique_id = 0);
  270. void BuyBack(int32 item_id, int16 quantity);
  271. void RepairItem(int32 item_id);
  272. void RepairAllItems();
  273. void AddBuyBack(int32 unique_id, int32 item_id, int16 quantity, int32 price, bool save_needed = true);
  274. deque<BuyBackItem*>* GetBuyBacks();
  275. vector<Item*>* GetRepairableItems();
  276. void SendMailList();
  277. void DisplayMailMessage(int32 mail_id);
  278. void HandleSentMail(EQApplicationPacket* app);
  279. void DeleteMail(int32 mail_id, bool from_database = false);
  280. bool AddMailCoin(int32 copper, int32 silver = 0, int32 gold = 0, int32 plat = 0);
  281. bool RemoveMailCoin(int32 copper, int32 silver = 0, int32 gold = 0, int32 plat = 0);
  282. void TakeMailAttachments(int32 mail_id);
  283. void CancelSendMail();
  284. bool GateAllowed();
  285. bool BindAllowed();
  286. bool Bind();
  287. bool Gate();
  288. void SendChatRelationship(int8 type, const char* name);
  289. void SendFriendList();
  290. void SendIgnoreList();
  291. void SendNewSpells(int8 class_id);
  292. string GetCoinMessage(int32 total_coins);
  293. void SetItemSearch(vector<Item*>* items);
  294. vector<Item*>* GetSearchItems();
  295. void SearchStore(int32 page);
  296. void SetPlayer(Player* new_player){
  297. player = new_player;
  298. }
  299. void AddPendingQuestReward(Quest* quest);
  300. void AddPendingQuestUpdate(int32 quest_id, int32 step_id, int32 progress = 0xFFFFFFFF);
  301. void ProcessQuestUpdates();
  302. void AddWaypoint(const char* waypoint_name, int8 waypoint_category, int32 spawn_id);
  303. void BeginWaypoint(const char* waypoint_name, float x, float y, float z);
  304. void InspectPlayer(Player* player_to_inspect);
  305. void SetPendingGuildInvite(Guild* guild, Player* invited_by = 0);
  306. PendingGuildInvite* GetPendingGuildInvite() {return &pending_guild_invite;}
  307. void ShowClaimWindow();
  308. void ShowGuildSearchWindow();
  309. void CheckQuestQueue();
  310. void ShowDressingRoom(Item *item, sint32 crc);
  311. void SendCollectionList();
  312. bool SendCollectionsForItem(Item *item);
  313. void HandleCollectionAddItem(int32 collection_id, Item *item);
  314. void DisplayCollectionComplete(Collection *collection);
  315. void HandInCollections();
  316. void AcceptCollectionRewards(Collection *collection, int32 selectable_item_id = 0);
  317. void SendRecipeList();
  318. void SendTitleUpdate();
  319. void SendUpdateTitles(sint16 prefix, sint16 suffix);
  320. void SendLanguagesUpdate(int32 id);
  321. void SendAchievementsList();
  322. void SendAchievementUpdate(bool first_login = false);
  323. ///<summary>Send the pet options window to the client</summary>
  324. ///<param name="type">Type of pet, 1 = combat 0 = non combat</param>
  325. void SendPetOptionsWindow(const char* pet_name, int8 type = 1);
  326. void SendBiography();
  327. bool IsCrafting();
  328. void SetRecipeListSent(bool val) {m_recipeListSent = val; }
  329. bool GetRecipeListSent() { return m_recipeListSent; }
  330. void ShowRecipeBook();
  331. PendingResurrection* GetCurrentRez();
  332. void SendResurrectionWindow();
  333. void AcceptResurrection();
  334. Mutex m_resurrect;
  335. Mutex* GetResurrectMutex();
  336. void SetPendingLastName(string last_name);
  337. void RemovePendingLastName();
  338. string* GetPendingLastName();
  339. void SendLastNameConfirmation();
  340. void SetInitialSpawnsSent(bool val) { initial_spawns_sent = val; }
  341. bool GetInitialSpawnsSent() { return initial_spawns_sent; }
  342. void SendQuestJournalUpdate(Quest* quest);
  343. void AddQuestTimer(int32 quest_id);
  344. void RemoveQuestTimer(int32 quest_id);
  345. void SetPendingFlightPath(int32 val) { pending_flight_path = val; }
  346. int32 GetPendingFlightPath() { return pending_flight_path; }
  347. void EndAutoMount();
  348. bool GetOnAutoMount() { return on_auto_mount; }
  349. bool IsCurrentTransmuteID(int32 trans_id);
  350. void SetTransmuteID(int32 trans_id);
  351. int32 GetTransmuteID();
  352. private:
  353. void SavePlayerImages();
  354. void SkillChanged(Skill* skill, int16 previous_value, int16 new_value);
  355. void GiveQuestReward(Quest* quest);
  356. void SetStepComplete(int32 quest_id, int32 step);
  357. void AddStepProgress(int32 quest_id, int32 step, int32 progress);
  358. map<int32, map<int32, int32> > quest_pending_updates;
  359. vector<QueuedQuest*> quest_queue;
  360. vector<Quest*> quest_pending_reward;
  361. volatile bool quest_updates;
  362. Mutex MQuestPendingUpdates;
  363. Mutex MQuestQueue;
  364. Mutex MDeletePlayer;
  365. vector<Item*>* search_items;
  366. Spawn* transport_spawn;
  367. Mutex MBuyBack;
  368. deque<BuyBackItem*> buy_back_items;
  369. Spawn* merchant_transaction;
  370. Spawn* mail_transaction;
  371. Mutex MPendingQuestAccept;
  372. vector<Quest*> pending_quest_accept;
  373. bool lua_debug;
  374. bool should_target;
  375. Spawn* combine_spawn;
  376. int8 num_active_failures;
  377. int32 next_conversation_id;
  378. map<int32, Spawn*> conversation_spawns;
  379. map<int32, Item*> conversation_items;
  380. map<int32, map<int8, string> > conversation_map;
  381. int32 current_quest_id;
  382. Spawn* banker;
  383. map<int32, bool> sent_spell_details;
  384. map<int32, bool> sent_item_details;
  385. Player* player;
  386. int16 version;
  387. int8 timestamp_flag;
  388. int32 ip;
  389. int16 port;
  390. int32 account_id;
  391. int32 character_id;
  392. sint16 admin_status; // -2 Banned, -1 Suspended, 0 User, etc.
  393. char account_name[64];
  394. char zone_name[64];
  395. int32 zoneID;
  396. int32 instanceID;
  397. Timer* autobootup_timeout;
  398. int32 pwaitingforbootup;
  399. int32 last_update_time;
  400. int32 last_saved_timestamp;
  401. Timer* CLE_keepalive_timer;
  402. Timer* connect;
  403. Timer* camp_timer;
  404. Timer* disconnect_timer;
  405. bool connected;
  406. bool ready_for_spawns;
  407. bool ready_for_updates;
  408. bool seencharsel;
  409. bool connected_to_zone;
  410. bool client_zoning;
  411. bool firstlogin;
  412. bool new_client_login;
  413. Timer pos_update;
  414. Timer quest_pos_timer;
  415. Timer lua_debug_timer;
  416. bool player_pos_changed;
  417. bool HandlePacket(EQApplicationPacket *app);
  418. EQStream* eqs;
  419. bool quickbar_changed;
  420. ZoneServer* current_zone;
  421. int32 name_crc;
  422. MailWindow mail_window;
  423. PendingGuildInvite pending_guild_invite;
  424. PendingResurrection current_rez;
  425. string* pending_last_name;
  426. IncomingPaperdollImage incoming_paperdoll;
  427. int32 transmuteID;
  428. bool m_recipeListSent;
  429. bool initial_spawns_sent;
  430. bool should_load_spells;
  431. // int32 = quest id
  432. vector<int32> quest_timers;
  433. Mutex MQuestTimers;
  434. int32 pending_flight_path;
  435. bool on_auto_mount;
  436. bool EntityCommandPrecheck(Spawn* spawn, const char* command);
  437. };
  438. class ClientList {
  439. public:
  440. ClientList();
  441. ~ClientList();
  442. bool ContainsStream(EQStream* eqs);
  443. void Add(Client* client);
  444. Client* Get(int32 ip, int16 port);
  445. Client* FindByAccountID(int32 account_id);
  446. Client* FindByName(char* charname);
  447. void Remove(Client* client, bool delete_data = false);
  448. void RemoveConnection(EQStream* eqs);
  449. void Process();
  450. int32 Count();
  451. void ReloadQuests();
  452. private:
  453. Mutex MClients;
  454. list<Client*> client_list;
  455. };
  456. #endif