#ifndef SUN_GAMESERVER_GAMEBATTLERESULT_H_ #define SUN_GAMESERVER_GAMEBATTLERESULT_H_ #if _MSC_VER > 1000 #pragma once #endif //_NA_0_20091118_GAMEROOM_BATTLE_RESULT /* Ŭ·¡½º ´ÙÀ̾î±×·¥ : 2010.03.18 by ³²±âºÀ BattlePlayer <*>---> BattleRecorder ---> Player A | <*:n> GameZone <*>-----> GameBattleResult <--- CHuntingBattleResult A | | |- DominationBattleResult | | | |- InstanceDungeonBattleResult | | | |- MissionBattleResult | | | |- PVPBattleResult < > CG_ZONE_PLAYER_BATTLE_RESULT_SYN */ /* class GameBattleResult : 2010.03.18 by ³²±âºÀ - GameZone ¿¡ [Ãß°¡/»èÁ¦]µÈ PlayerµéÀ» ÇØ½Ã¸ÊÀ¸·Î °ü¸®Çϸç, Ŭ¶óÀ̾ðÆ®ÀÇ ÀüÅõ »óȲ ¿äû½Ã PlayerÀÇ ÀüÅõ »óȲÀÌ ±â·ÏµÇ´Â class BattleRecord °ªÀ» ÂüÁ¶ÇÏ¿© ÀüÅõ°á°ú°ªÀ» º¸³½´Ù. - class BattlePlayer´Â Ŭ¶óÀÌ¾ðÆ®¿¡¼­ PlayerµéÀÇ ÀüÅõ°á°ú ¿äû½Ã º¯°æµÈ[Ãß°¡/»èÁ¦/Á¤º¸] Á¤º¸¸¸ º¸³»±â À§ÇØ [Ãß°¡/»èÁ¦/Á¤º¸]»óŸ¦ °ü¸®ÇÏ´Â Hash MapÀ» »ç¿ëÇϸç À̸¦ 'CheckKeyHash'À̶ó ÇÑ´Ù. < Check Key Hash Map > key value BattlePlayer --- CHARGUID insert/remove/update |- CHARGUID insert/remove/update |- CHARGUID insert/remove/update |- CHARGUID insert/remove/update |- ... ... - Player ÀÇ Zone¿¡ Ãß°¡½Ã óÀ½ Çѹø ÇØ½Ã¸Ê¿¡ »ý¼ºÈÄ ZoneÀÇ ÆÄ±«½Ã Á¦°ÅÇÑ´Ù. ÀÌ´Â Á¢¼Ó À¯ÀúÀÇ Á¾·á ÈÄ »õ·Î¿î Á¢¼Ó¿¡ µû¸¥ Player°¡ °¡Áö´Â ÀüÅõ »óȲ°ªÀÇ ÃʱâÈ­ ½ÃÁ¡ÀÇ ¹®Á¦ ÇØ°áÀ» À§ÇÑ ¹æ¾ÈÀ¸·Î Á»´õ ³ªÀº ´ëÃ¥ÀÌ ³ª¿À¸é º¯°æÇϵµ·Ï ÇÑ´Ù. */ #include "BattleRecorder.h" class Player; class Character; class UpdateSelector { public: struct UpdateKey { uint match_number; uint dirty_number; }; UpdateSelector() : update_key_(0) {} ~UpdateSelector() {} void ResetUpdateSelector() { update_key_ = 0; } void ResetUpdateKey(UpdateKey& updatekey) { updatekey.match_number = 0; updatekey.dirty_number = 0; } bool IsUpdated(UpdateKey& source, UpdateKey& target) { return (source.match_number >= target.dirty_number) ? true : false; } void DoUpdate(UpdateKey& updatekey) { updatekey.match_number = update_key_; } void DoDirty(UpdateKey& updatekey) { ++update_key_; updatekey.dirty_number = update_key_; } private: uint update_key_; }; class GameBattleResult { public: enum { HOME_TEAM = 0, AWAY_TEAM = 1, }; GameBattleResult(void); virtual ~GameBattleResult(void); bool Init(bool enable_pvp); void Release(); void Clear(); virtual bool Enter(Player* player); virtual void Leave(Player* player, bool abnormal_disconnect); virtual bool SendBattleResult(Player* player, int team_flag = GameBattleResult::HOME_TEAM); #ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH void DoRecord(Character* character, eBATTLE_RECORD_TYPE record_type, int impact_value); #else void DoRecord(Character* character, eBATTLE_RECORD_TYPE record_type, uint impact_value); #endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH //_NA_001990_ACSYSTEM_ADD const BattleRecorder::Record* GetPlayerBattleResult(Player* player); #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG void AddToTalDropHeim(MONEY add_heim); MONEY GetTotalDropHeim() const; #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG protected: struct BattlePlayer { //Player* player; CHARGUID char_guid; //player->GetCharGuid(); int team; BattleRecorder battle_recorder; UpdateSelector::UpdateKey update_key; BattlePlayer() { char_guid = 0; team = 0; ZeroMemory(&battle_recorder, sizeof(battle_recorder)); ZeroMemory(&update_key, sizeof(update_key)); } }; GameBattleResult::BattlePlayer* FindBattlePlayer(CHARGUID character_guid); virtual void update_team(GameBattleResult::BattlePlayer* battle_player); //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND virtual void NotifyEnterMessage(GameBattleResult::BattlePlayer* battle_player); virtual void NotifyLeaveMessage(GameBattleResult::BattlePlayer* battle_player, bool abnormal_disconnect); void ReleaseBattlePlayer(); VOID _SendEnterMessageToExistPlayer(GameBattleResult::BattlePlayer* battle_player); VOID _SendEnterMessageToEnterPlayer(GameBattleResult::BattlePlayer* battle_player); GameBattleResult::BattlePlayer* _RegisterBattlePlayer(Player* player); protected: typedef STLX_HASH_MAP BattlePlayerHash; typedef util::CMemoryPoolFactory BattlePlayerPool; BattlePlayerHash battle_player_hash_; BattlePlayerPool battle_player_pool_; UpdateSelector update_selector_; bool enable_pvp_; #ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG MONEY total_droped_heim_; #endif // _NA_007750_20141113_WZDAT_MODIFY_LOG }; //--------------------------------------------------------------------------------- inline GameBattleResult::BattlePlayer* GameBattleResult::FindBattlePlayer(CHARGUID character_guid) { if (battle_player_hash_.empty()) return 0; BattlePlayerHash::iterator iter = battle_player_hash_.find(character_guid); if (iter != battle_player_hash_.end()) return iter->second; return 0; } #endif //SUN_GAMESERVER_GAMEBATTLERESULT_H_