World.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  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 EQ2_WORLD_H
  17. #define EQ2_WORLD_H
  18. #include <string>
  19. #include <vector>
  20. #include <map>
  21. #include <list>
  22. #include "SpawnLists.h"
  23. #include "zoneserver.h"
  24. #include "NPC.h"
  25. #include "Widget.h"
  26. #include "Object.h"
  27. #include "GroundSpawn.h"
  28. #include "Sign.h"
  29. #include "Variables.h"
  30. #include "MutexList.h"
  31. #include "PlayerGroups.h"
  32. using namespace std;
  33. struct MerchantInfo{
  34. vector<int32> inventory_ids;
  35. /*int32 faction_id;
  36. sint32 faction_min;
  37. sint32 faction_max;
  38. float low_buy_multiplier;
  39. float high_buy_multiplier;
  40. float low_sell_multiplier;
  41. float high_sell_multiplier;*/
  42. };
  43. struct MerchantItemInfo{
  44. int32 item_id;
  45. int16 quantity;
  46. int32 price_item_id;
  47. int32 price_item2_id;
  48. int16 price_item_qty;
  49. int16 price_item2_qty;
  50. int32 price_status;
  51. int64 price_coins;
  52. int32 price_stationcash;
  53. };
  54. struct LootTable{
  55. string name;
  56. int32 mincoin;
  57. int32 maxcoin;
  58. int16 maxlootitems;
  59. float lootdrop_probability;
  60. float coin_probability;
  61. };
  62. struct LootDrop{
  63. int32 item_id;
  64. int16 item_charges;
  65. bool equip_item;
  66. float probability;
  67. };
  68. struct GroundSpawnEntry {
  69. int16 min_skill_level;
  70. int16 min_adventure_level;
  71. int8 bonus_table;
  72. float harvest1;
  73. float harvest3;
  74. float harvest5;
  75. float harvest_imbue;
  76. float harvest_rare;
  77. float harvest10;
  78. int32 harvest_coin;
  79. };
  80. struct GroundSpawnEntryItem {
  81. int32 item_id;
  82. int8 is_rare;
  83. int32 grid_id;
  84. };
  85. struct TransportDestination{
  86. int32 unique_id;
  87. int8 type;
  88. string display_name;
  89. string message;
  90. int32 destination_zone_id;
  91. float destination_x;
  92. float destination_y;
  93. float destination_z;
  94. float destination_heading;
  95. int32 cost;
  96. int8 min_level;
  97. int8 max_level;
  98. int32 req_quest;
  99. int16 req_quest_step;
  100. int32 req_quest_complete;
  101. int32 map_x;
  102. int32 map_y;
  103. int32 faction_id;
  104. int32 faction_value;
  105. };
  106. struct LocationTransportDestination{
  107. int32 unique_id;
  108. string message;
  109. int32 destination_zone_id;
  110. float destination_x;
  111. float destination_y;
  112. float destination_z;
  113. float destination_heading;
  114. float trigger_x;
  115. float trigger_y;
  116. float trigger_z;
  117. float trigger_radius;
  118. int32 cost;
  119. int32 faction_id;
  120. int32 faction_value;
  121. };
  122. //ideally we wouldn't need to store this information as we could get it from the Client object,
  123. //however since the client object disconnects from the server when zoning we can't count on it being available
  124. /*struct PlayerGroup;
  125. struct GroupOptions{
  126. int8 loot_method;
  127. int8 loot_items_rarity;
  128. int8 auto_split;
  129. int8 default_yell;
  130. int8 group_autolock;
  131. int8 solo_autolock;
  132. };
  133. struct GroupMemberInfo{
  134. string name;
  135. string zone;
  136. sint32 hp_current;
  137. sint32 hp_max;
  138. sint32 power_current;
  139. sint32 power_max;
  140. int16 level_current;
  141. int16 level_max;
  142. int8 race_id;
  143. int8 class_id;
  144. Client* client;
  145. PlayerGroup* group;
  146. };
  147. struct PlayerGroup{
  148. deque<GroupMemberInfo*> members;
  149. GroupOptions options;
  150. };*/
  151. struct LottoPlayer {
  152. int32 end_time;
  153. int8 num_matches;
  154. bool set;
  155. };
  156. struct HouseZone {
  157. int32 id;
  158. string name;
  159. int64 cost_coin;
  160. int32 cost_status;
  161. int64 upkeep_coin;
  162. int32 upkeep_status;
  163. int8 vault_slots;
  164. int8 alignment;
  165. int8 guild_level;
  166. int32 zone_id;
  167. int32 exit_zone_id;
  168. float exit_x;
  169. float exit_y;
  170. float exit_z;
  171. float exit_heading;
  172. };
  173. struct Deposit {
  174. int32 timestamp;
  175. int64 amount;
  176. int64 last_amount;
  177. int32 status;
  178. int32 last_status;
  179. string name;
  180. };
  181. struct PlayerHouse {
  182. int32 house_id;
  183. int64 unique_id;
  184. int32 instance_id;
  185. int32 upkeep_due;
  186. int64 escrow_coins;
  187. int32 escrow_status;
  188. string player_name;
  189. list<Deposit> deposits;
  190. map<string, Deposit> depositsMap;
  191. };
  192. // Constants for STATs counters
  193. // Server Utilization
  194. #define STAT_SERVER_OS_TYPE 1 // what OS this server is running on
  195. #define STAT_SERVER_CPU_TYPE 2 // cpu type/speed (ie., Intel P4 3.0GHz)
  196. #define STAT_SERVER_CPU_CURRENT 3 // current CPU usage by EQ2World.exe process
  197. #define STAT_SERVER_CPU_PEAK 4 // highest CPU usage by EQ2World.exe this session
  198. #define STAT_SERVER_PHYSICAL_RAM_TOTAL 5 // total RAM in server
  199. #define STAT_SERVER_PHYSICAL_RAM_CURRENT 6 // current RAM usage by EQ2World.exe
  200. #define STAT_SERVER_PHYSICAL_RAM_PEAK 7 // highest RAM usage by EQ2World.exe this session
  201. #define STAT_SERVER_VIRTUAL_RAM_TOTAL 8 // total vRAM in server
  202. #define STAT_SERVER_VIRTUAL_RAM_CURRENT 9 // current vRAM usage by EQ2World.exe
  203. #define STAT_SERVER_VIRTUAL_RAM_PEAK 10 // highest vRAM usage by EQ2World.exe this session
  204. #define STAT_SERVER_DISK_USAGE 11 // size of /eq2emulator folder and contents
  205. #define STAT_SERVER_THREAD_COUNT 12 // thread count of EQ2World.exe process
  206. #define STAT_SERVER_AVG_LATENCY 13 // network latency between world and loginserver
  207. // Server Stats
  208. #define STAT_SERVER_CREATED 100 // unix_timestamp of date server first came online
  209. #define STAT_SERVER_START_TIME 101 // unix_timestamp of date/time server booted up
  210. #define STAT_SERVER_ACCEPTED_CONNECTION 102 // successful connections since server startup
  211. #define STAT_SERVER_MOST_CONNECTIONS 103 // most players online in history of server
  212. #define STAT_SERVER_NUM_ACCOUNTS 104 // total number of unique accounts
  213. #define STAT_SERVER_NUM_CHARACTERS 105 // total number of player characters
  214. #define STAT_SERVER_AVG_CHAR_LEVEL 106 // average level of player characters
  215. #define STAT_SERVER_NUM_ACTIVE_ZONES 107 // number of currently running/loaded zones
  216. #define STAT_SERVER_NUM_ACTIVE_INSTANCES 108 // number of active zones that are "instances"
  217. // Player PvE counters
  218. #define STAT_PLAYER_TOTAL_NPC_KILLS 1000 // total NPC kills by player
  219. #define STAT_PLAYER_TOTAL_DEATHS 1001 // total non-PvP deaths of player
  220. #define STAT_PLAYER_KVD_RATIO 1002 // kill-versus-death ratio of player
  221. #define STAT_PLAYER_HIGHEST_MELEE_HIT 1003 // players highest melee hit to date
  222. #define STAT_PLAYER_HIGHEST_MAGIC_HIT 1004 // players highest magic hit to date
  223. #define STAT_PLAYER_HIGHEST_HO_HIT 1005 // players highest heroic opportunity hit
  224. #define STAT_PLAYER_TOTAL_STATUS 1006 // player total status
  225. #define STAT_PLAYER_TOTAL_WEALTH 1007 // player total wealth
  226. #define STAT_PLAYER_QUESTS_COMPLETED 1008 // total quests completed
  227. #define STAT_PLAYER_RECIPES_KNOWN 1009 // total recipes player knows
  228. #define STAT_PLAYER_TOTAL_CRAFTED_ITEMS 1010 // total items crafted by player
  229. #define STAT_PLAYER_ITEMS_DISCOVERED 1011 // total items discovered by player
  230. #define STAT_PLAYER_RARES_HARVESTED 1012 // total rare harvests by player
  231. #define STAT_PLAYER_ITEMS_HARVESTED 1013 // total rare harvests by player
  232. #define STAT_PLAYER_MASTER_ABILITIES 1014 // total master abilities player has
  233. #define STAT_PLAYER_HIGHEST_FALLING_HIT 1015 // player's highest damage amount taken from falling
  234. // Player PvP counters
  235. #define STAT_PLAYER_TOTAL_PVP_KILLS 1100 // total PVP kills by player
  236. #define STAT_PLAYER_PVP_KILL_STREAK 1101 // longest PVP kill streak of player
  237. #define STAT_PLAYER_TOTAL_PVP_DEATHS 1102 // total PVP deaths of player
  238. #define STAT_PLAYER_PVP_DEATH_STREAK 1103 // longest PVP death streak of player
  239. #define STAT_PLAYER_PVP_KVD_RATIO 1104 // PVP kill-versus-death ratio of player
  240. #define STAT_PLAYER_TOTAL_ARENA_KILLS 1105 // total Arena kills of player
  241. // MOST stats for players
  242. #define STAT_PLAYER_MOST_NPC_KILLS 1200 // IPvP: Player with most NPC kills
  243. #define STAT_PLAYER_MOST_NPC_DEATHS 1201 // IPvP: Player with most non-PVP deaths
  244. #define STAT_PLAYER_MOST_PVP_KILLS 1202 // IPvP: Player with most PvP kills
  245. #define STAT_PLAYER_MOST_PVP_DEATHS 1203 // IPvP: Player with most PvP deaths
  246. #define STAT_PLAYER_MOST_ARENA_KILLS 1204 // IPvP: Player with most Arena kills
  247. #define STAT_PLAYER_MOST_STATUS 1205 // IPvP: Player with most Status
  248. #define STAT_PLAYER_MOST_WEALTH 1206 // IPvP: Player with most Wealth
  249. // HIGHEST stats for players
  250. #define STAT_PLAYER_HIGHEST_NPC_KVD_RATIO 1300 // IPvP: Player with highest NPC kill-versus-death ratio
  251. #define STAT_PLAYER_HIGHEST_PVP_KILL_STREAK 1301 // IPvP: Player with longest PvP kill streak
  252. #define STAT_PLAYER_HIGHEST_PVP_DEATH_STREAK 1302 // IPvP: Player with longest PvP death streak
  253. #define STAT_PLAYER_HIGHEST_PVP_KVD_RATIO 1303 // IPvP: Player with highest PvP kill-versus-death ratio
  254. #define STAT_PLAYER_HIGHEST_HP 1304 // IPvP: Player with highest HP on server
  255. #define STAT_PLAYER_HIGHEST_POWER 1305 // IPvP: Player with highest Power on server
  256. #define STAT_PLAYER_HIGHEST_RESISTS 1306 // IPvP: Player with highest Resists on server
  257. struct Statistic {
  258. int32 stat_id;
  259. sint32 stat_value;
  260. int32 stat_date;
  261. bool save_needed;
  262. };
  263. // Player EVENT defines
  264. // Some EVENTs are single occurrance (S), while others are cummulative throughout the life of the player (C)
  265. #define PLAYER_EVENT_NEW_ADV_LEVEL 2000 // (C) player achieves a new adventure level
  266. #define PLAYER_EVENT_NEW_TS_LEVEL 2001 // (C) player achieves a new tradeskill level
  267. #define PLAYER_EVENT_NEW_AA 2002 // (C) player earns AA pt
  268. #define PLAYER_EVENT_NEW_ACHIEVEMENT 2003 // (C) player new achievement
  269. #define PLAYER_EVENT_LAST_DEATH 2004 // (S) player was last killed
  270. #define PLAYER_EVENT_LAST_KILL 2005 // (S) player last killed spawn_id
  271. #define PLAYER_EVENT_DISCOVER_POI 2006 // (C) player discovers location_id
  272. // These maybe should be World stat events, since it is about 1 player discovering a new item?
  273. #define PLAYER_EVENT_DISCOVER_ITEM 2007 // (C) player discovers item_id
  274. #define PLAYER_EVENT_DISCOVER_RECIPE 2008 // (C) player discovers recipe_id
  275. struct PlayerHistory {
  276. int32 history_zone;
  277. int32 history_id;
  278. sint32 history_value;
  279. int32 history_date;
  280. bool save_needed;
  281. };
  282. struct GlobalLoot {
  283. int8 minLevel;
  284. int8 maxLevel;
  285. int32 table_id;
  286. };
  287. #define TRANSPORT_TYPE_LOCATION 0
  288. #define TRANSPORT_TYPE_ZONE 1
  289. #define TRANSPORT_TYPE_GENERIC 2
  290. class ZoneList {
  291. public:
  292. ZoneList();
  293. ~ZoneList();
  294. void Add(ZoneServer* zone);
  295. void Remove(ZoneServer* zone);
  296. ZoneServer* Get(int32 id, bool loadZone = true);
  297. ZoneServer* Get(const char* zone_name, bool loadZone=true);
  298. ZoneServer* GetByInstanceID(int32 id, int32 zone_id=0);
  299. /// <summary>Get the instance for the given zone id with the lowest population</summary>
  300. /// <param name='zone_id'>The id of the zone to look up</param>
  301. /// <returns>ZoneServer* of an active zone with the given id</returns>
  302. ZoneServer* GetByLowestPopulation(int32 zone_id);
  303. void AddClientToMap(string name, Client* client){
  304. name = ToLower(name);
  305. MClientList.lock();
  306. client_map[name] = client;
  307. MClientList.unlock();
  308. }
  309. void CheckFriendList(Client* client);
  310. void CheckFriendZoned(Client* client);
  311. // move to Chat/Chat.h?
  312. bool HandleGlobalChatMessage(Client* from, char* to, int16 channel, const char* message, const char* channel_name = 0);
  313. void HandleGlobalBroadcast(const char* message);
  314. void HandleGlobalAnnouncement(const char* message);
  315. //
  316. int32 Count();
  317. Client* GetClientByCharName(string name){
  318. name = ToLower(name);
  319. Client* ret = 0;
  320. MClientList.lock();
  321. if(client_map.count(name) > 0)
  322. ret = client_map[name];
  323. MClientList.unlock();
  324. return ret;
  325. }
  326. Client* GetClientByCharID(int32 id) {
  327. Client* ret = 0;
  328. MClientList.lock();
  329. map<string, Client*>::iterator itr;
  330. for (itr = client_map.begin(); itr != client_map.end(); itr++) {
  331. if (itr->second->GetCharacterID() == id) {
  332. ret = itr->second;
  333. break;
  334. }
  335. }
  336. MClientList.unlock();
  337. return ret;
  338. }
  339. Client* GetClientByEQStream(EQStream* eqs) {
  340. Client* ret = 0;
  341. if (eqs) {
  342. MClientList.lock();
  343. map<string, Client*>::iterator itr;
  344. for (itr = client_map.begin(); itr != client_map.end(); itr++) {
  345. if (itr->second->getConnection() == eqs) {
  346. ret = itr->second;
  347. break;
  348. }
  349. }
  350. MClientList.unlock();
  351. }
  352. return ret;
  353. }
  354. void UpdateVitality(float amount);
  355. void RemoveClientFromMap(string name, Client* client){
  356. name = ToLower(name);
  357. MClientList.lock();
  358. if(client_map.count(name) > 0 && client_map[name] == client)
  359. client_map.erase(name);
  360. MClientList.unlock();
  361. }
  362. bool ClientConnected(int32 account_id);
  363. void ReloadClientQuests();
  364. bool DepopFinished();
  365. void Depop();
  366. void Repop();
  367. void DeleteSpellProcess();
  368. void LoadSpellProcess();
  369. void ProcessWhoQuery(const char* query, Client* client);
  370. void ProcessWhoQuery(vector<string>* queries, ZoneServer* zone, vector<Entity*>* players, bool isGM);
  371. void SendZoneList(Client* client);
  372. void WritePlayerStatistics();
  373. void ShutDownZones();
  374. void ReloadMail();
  375. void ReloadSpawns();
  376. private:
  377. Mutex MClientList;
  378. Mutex MZoneList;
  379. map<ZoneServer*, int32> removed_zoneservers;
  380. map<string,Client*> client_map;
  381. list<ZoneServer*> zlist;
  382. };
  383. class World {
  384. public:
  385. World();
  386. ~World();
  387. int8 GetClassID(const char* name);
  388. void Process();
  389. void init();
  390. PacketStruct* GetWorldTime(int16 version);
  391. void WorldTimeTick();
  392. float GetXPRate();
  393. float GetTSXPRate();
  394. void LoadVitalityInformation();
  395. void UpdateVitality();
  396. WorldTime* GetWorldTimeStruct(){
  397. return &world_time;
  398. }
  399. ulong GetCurrentThreadID();
  400. int64 GetThreadUsageCPUTime();
  401. // These 2 functions are never used. What was their purpose? Should they be removed?
  402. void AddNPCAppearance(int32 id, AppearanceData* appearance){ npc_appearance_list[id] = appearance; }
  403. AppearanceData* GetNPCAppearance(int32 id) { return npc_appearance_list[id]; }
  404. void ReloadGuilds();
  405. bool ReportBug(string data, char* player_name, int32 account_id, const char* spawn_name, int32 spawn_id, int32 zone_id);
  406. void AddSpawnScript(int32 id, const char* name);
  407. void AddSpawnEntryScript(int32 id, const char* name);
  408. void AddSpawnLocationScript(int32 id, const char* name);
  409. void AddZoneScript(int32 id, const char* name);
  410. const char* GetSpawnScript(int32 id);
  411. const char* GetSpawnEntryScript(int32 id);
  412. const char* GetSpawnLocationScript(int32 id);
  413. const char* GetZoneScript(int32 id);
  414. void ResetSpawnScripts();
  415. void ResetZoneScripts();
  416. int16 GetMerchantItemQuantity(int32 merchant_id, int32 item_id);
  417. void DecreaseMerchantQuantity(int32 merchant_id, int32 item_id, int16 amount);
  418. int32 GetInventoryID(int32 merchant_id, int32 item_id);
  419. void AddMerchantItem(int32 inventory_id, MerchantItemInfo ItemInfo);
  420. void RemoveMerchantItem(int32 inventory_id, int32 item_id);
  421. vector<MerchantItemInfo>* GetMerchantList(int32 merchant_id);
  422. vector<MerchantItemInfo>* GetMerchantItemList(int32 merchant_id, int8 merchant_type, Player* player);
  423. MerchantInfo* GetMerchantInfo(int32 merchant_id);
  424. map<int32, MerchantInfo*>* GetMerchantInfo();
  425. void AddMerchantInfo(int32 merchant_id, MerchantInfo* multiplier);
  426. void DeleteMerchantsInfo();
  427. void DeleteMerchantItems();
  428. void DeleteSpawns();
  429. vector<Variable*>* GetClientVariables();
  430. void WritePlayerStatistics();
  431. void WriteServerStatistics();
  432. void AddServerStatistic(int32 stat_id, sint32 stat_value, int32 stat_date);
  433. void UpdateServerStatistic(int32 stat_id, sint32 stat_value, bool overwrite = false);
  434. sint32 GetServerStatisticValue(int32 stat_id);
  435. void RemoveServerStatistics();
  436. //PlayerGroup* AddGroup(Client* leader);
  437. //void AddGroupMember(PlayerGroup* group, Client* member);
  438. //void RemoveGroupMember(Client* member, bool immediate = false);
  439. //void DisbandGroup(PlayerGroup* group, bool lock = true);
  440. void SendGroupQuests(PlayerGroup* group, Client* client);
  441. //void UpdateGroupBuffs();
  442. //void RemoveGroupBuffs(PlayerGroup *group, Client *client);
  443. //void SetPendingGroup(char* name, char* leader);
  444. //void GroupMessage(PlayerGroup* group, const char* message, ...);
  445. //void SimpleGroupMessage(PlayerGroup* group, const char* message);
  446. //void GroupChatMessage(PlayerGroup* group, Spawn* from, const char* message);
  447. //const char* GetPendingGroup(string name);
  448. //void GroupReadLock();
  449. //void GroupReadUnLock();
  450. //void CheckRemoveGroupedPlayer();
  451. //void SendGroupUpdate(PlayerGroup* group, Client* exclude = 0);
  452. void RejoinGroup(Client* client);
  453. //bool MakeLeader(Client* leader, string new_leader);
  454. void AddBonuses(ItemStatsValues* values, int16 type, sint32 value, Entity* entity);
  455. void CreateGuild(const char* guild_name, Client* leader = 0, int32 group_id = 0);
  456. void SaveGuilds();
  457. void PickRandomLottoDigits(int32* digits);
  458. void AddLottoPlayer(int32 character_id, int32 end_time);
  459. void RemoveLottoPlayer(int32 character_id);
  460. void SetLottoPlayerNumMatches(int32 character_id, int8 num_matches);
  461. void CheckLottoPlayers();
  462. void PopulateTOVStatMap();
  463. int32 LoadItemBlueStats();
  464. sint16 GetItemStatTOVValue(sint16 subtype);
  465. sint16 GetItemStatDOVValue(sint16 subtype);
  466. sint16 GetItemStatCOEValue(sint16 subtype);
  467. sint16 GetItemStatKAValue(sint16 subtype);
  468. sint16 GetItemStatTESTValue(sint16 subtype);
  469. vector<string> biography;
  470. volatile bool items_loaded;
  471. volatile bool spells_loaded;
  472. volatile bool achievments_loaded;
  473. void AddHouseZone(int32 id, string name, int64 cost_coins, int32 cost_status, int64 upkeep_coins, int32 upkeep_status, int8 vault_slots, int8 alignment, int8 guild_level, int32 zone_id, int32 exit_zone_id, float exit_x, float exit_y, float exit_z, float exit_heading);
  474. HouseZone* GetHouseZone(int32 id);
  475. void AddPlayerHouse(int32 char_id, int32 house_id, int64 unique_id, int32 instance_id, int32 upkeep_due, int64 escrow_coins, int32 escrow_status, string player_name);
  476. PlayerHouse* GetPlayerHouseByHouseID(int32 char_id, int32 house_id);
  477. PlayerHouse* GetPlayerHouseByUniqueID(int64 unique_id);
  478. PlayerHouse* GetPlayerHouseByInstanceID(int32 instance_id);
  479. vector<PlayerHouse*> GetAllPlayerHouses(int32 char_id);
  480. vector<PlayerHouse*> GetAllPlayerHousesByHouseID(int32 house_id);
  481. PlayerGroupManager* GetGroupManager() { return &m_playerGroupManager; }
  482. bool CheckTempBugCRC(char* msg);
  483. private:
  484. //void RemovePlayerFromGroup(PlayerGroup* group, GroupMemberInfo* info, bool erase = true);
  485. //void DeleteGroupMember(GroupMemberInfo* info);
  486. Mutex MMerchantList;
  487. Mutex MSpawnScripts;
  488. Mutex MZoneScripts;
  489. //Mutex MGroups;
  490. map<int32, MerchantInfo*> merchant_info;
  491. map<int32, vector<MerchantItemInfo> > merchant_inventory_items;
  492. int32 vitality_frequency;
  493. float vitality_amount;
  494. float xp_rate;
  495. float ts_xp_rate; // JA
  496. WorldTime world_time;
  497. map<int32,AppearanceData*> npc_appearance_list;
  498. map<int32, string> spawn_scripts;
  499. map<int32, string> spawnentry_scripts;
  500. map<int32, string> spawnlocation_scripts;
  501. map<int32, string> zone_scripts;
  502. //vector<PlayerGroup*> player_groups;
  503. //map<GroupMemberInfo*, int32> group_removal_pending;
  504. //map<string, string> pending_groups;
  505. map<int32, Statistic*> server_statistics;
  506. MutexMap<int32, LottoPlayer*> lotto_players;
  507. int32 last_checked_time;
  508. Timer save_time_timer;
  509. Timer time_tick_timer;
  510. Timer vitality_timer;
  511. Timer player_stats_timer;
  512. Timer server_stats_timer;
  513. //Timer remove_grouped_player;
  514. Timer guilds_timer;
  515. Timer lotto_players_timer;
  516. Timer group_buff_updates;
  517. map<int32, HouseZone*> m_houseZones;
  518. // Map <house id, map<char id, player house>>
  519. map<int32, map<int32, PlayerHouse*> > m_playerHouses;
  520. Mutex MHouseZones;
  521. Mutex MPlayerHouses;
  522. map<int16,int16> tov_itemstat_conversion;
  523. map<int16,int16> dov_itemstat_conversion;
  524. map<int16,int16> coe_itemstat_conversion;
  525. map<int16,int16> ka_itemstat_conversion;
  526. PlayerGroupManager m_playerGroupManager;
  527. Mutex MBugReport;
  528. map<sint32, bool> bug_report_crc;
  529. };
  530. #endif