#pragma once #ifndef GAMESERVER_PLAYER_MANAGER_H #define GAMESERVER_PLAYER_MANAGER_H //================================================================================================== // #include #include "ObjectDefine.h" #include class Player; class ObjectFactory; struct PlayerObjectKeyStreamAddin { DWORD CharGuid; PlayerObjectKeyStreamAddin() : CharGuid(0) {} PlayerObjectKeyStreamAddin(const DWORD char_guid) : CharGuid(char_guid) {} PlayerObjectKeyStreamAddin(const PlayerObjectKeyStreamAddin& rhs) : CharGuid(rhs.CharGuid) {} PlayerObjectKeyStreamAddin& operator=(const PlayerObjectKeyStreamAddin& rhs) { CharGuid = rhs.CharGuid; return *this; } }; //================================================================================================== // // class PlayerManager : public util::Singleton { public: PlayerManager(); ~PlayerManager(); void Update(const util::ServerTimeInfoPerFrame* time_info); bool AddPlayer(Player* player); // (NOTICE) // - CharNameÀ» ¾Æ´Â ½ÃÁ¡Àº DB·Î ºÎÅÍ Á¤º¸¸¦ ¹Þ°í ³­ ÈÄÀÇ ½ÃÁ¡À̸ç, µû¶ó¼­ ÀÌ ½ÃÁ¡¿¡ CharGuidµµ ¾Ë°Ô µÈ´Ù. bool AddPlayerName(Player* player); bool RemovePlayer(Player* player); void Disconnect(Player* player); void AllDisconnect(); Player* FindPlayerByUserKey(const DWORD user_guid) const; Player* FindPlayerByCharKey(const DWORD char_guid) const; Player* FindPlayerByObjKey(const DWORD object_key) const; Player* FindPlayerByName(const char* char_name) const; Player* FindPlayerByNameHash(const DWORD char_name_hash) const; DWORD GetNumberOfPlayers() const; ////////////////////////////////////////////////////////////////////////// // ÅëÈ­·® °ü·Ã MONEY GetAveUserTotalMoney() const; // À¯Àú Æò±Õ ÅëÈ­·® °è»ê MONEY GetUserTotalMoney() const; // À¯Àú ÃÑ º¸À¯ ·® °è»ê MONEY GetAveWarehouseTotalMoney() const; // À¯Àú Æò±Õ ÅëÈ­·® °è»ê(â°í) MONEY GetWarehouseTotalMoney() const; // À¯Àú ÃÑ º¸À¯ ·® °è»ê(â°í) #ifdef _NA_007919_20141211_ADD_GMCOMMAND_EVENT VOID SendPacketToAllPlayer(MSG_BASE_FORWARD* msg, size_t size,bool single = false); #endif //_NA_007919_20141211_ADD_GMCOMMAND_EVENT //xiaomi Ìí¼ÓÈ«·þ¹«¸æ VOID SendGmNotice(TCHAR *notice, eNOTICE_TYPE type); private: #ifdef _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM void AttendanceUpdate(const util::ServerTimeInfoPerFrame* time_info); // Á¢¼Ó ÁßÀÎÀ¯Àú Ãâ¼® °»½Å int m_attendance_day; #endif // _NA_007932_20150112_ATTENDANCE_CHECK_SYSTEM typedef ObjectKeyStream ObjectKeyStream; typedef STLX_HASH_MAP PLAYER_INDEX_HASH; // CHANGES: f110517.3L, changes hash finding accessibility about a character name typedef PLAYER_INDEX_HASH PLAYER_NAME_HASH; typedef STLX_HASH_MAP PLAYER_HASHMAP; void ReleasePlayer(Player* player); ObjectKeyStream* object_key_stream_; PLAYER_HASHMAP user_guid_table_; PLAYER_INDEX_HASH char_guid_table_; PLAYER_NAME_HASH char_name_table_; DWORD sector_delay_interval_; // Update Verification Fields DWORD m_dwDeltaTick; BOOL m_SectorUpdateOnUpdate; }; //================================================================================================== // inline implements inline DWORD PlayerManager::GetNumberOfPlayers() const { return static_cast(user_guid_table_.size()); } inline Player* PlayerManager::FindPlayerByUserKey(const DWORD user_guid) const //xiaomi ¸ù“þÓÑôGUIDŒ¤ÕÒPlayer { PLAYER_HASHMAP::const_iterator it = user_guid_table_.find(user_guid); if (it == user_guid_table_.end()) { return NULL; } Player* const player = it->second; if (player != NULL && player->IsDeleted()) { return NULL; } return player; } inline Player* PlayerManager::FindPlayerByCharKey(const DWORD char_guid) const //xiaomi ¸ù“þ½ÇÉ«GUIDŒ¤ÕÒPlayer { PLAYER_INDEX_HASH::const_iterator it = char_guid_table_.find(char_guid); if (it == char_guid_table_.end()) { return NULL; } const DWORD object_key = it->second; const ObjectKeyStream::sNode* const object_node = object_key_stream_->GetObjectInfo(object_key); if (object_node == NULL) { return NULL; }; Player* const player = object_node->pObject; if (player != NULL && player->IsDeleted()) { return NULL; } return player; } inline Player* PlayerManager::FindPlayerByObjKey(const DWORD object_key) const { const ObjectKeyStream::sNode* const object_node = object_key_stream_->GetObjectInfo(object_key); if (object_node == NULL) { return NULL; }; Player* const player = object_node->pObject; if (player != NULL && player->IsDeleted()) { return NULL; } return player; } inline Player* PlayerManager::FindPlayerByNameHash(const DWORD char_name_hash) const { PLAYER_NAME_HASH::const_iterator it = char_name_table_.find(char_name_hash); if (it == char_name_table_.end()) { return NULL; } const DWORD object_key = it->second; const ObjectKeyStream::sNode* const object_node = object_key_stream_->GetObjectInfo(object_key); if (object_node == NULL) { return NULL; }; Player* const player = object_node->pObject; if (player != NULL && player->IsDeleted()) { return NULL; } return player; } //================================================================================================== //========== Player Cast Template ========== #define PLAYER_PTR_USERKEY(type, obj, Value) \ type* obj = PlayerManager::Instance()->FindPlayerByUserKey(Value); \ if (!obj || !obj->GetField()) \ { \ SUNLOG(eDEV_LOG, "Player Not Exist"); \ return; \ } //================================================================================================== #endif //GAMESERVER_PLAYER_MANAGER_H