#pragma once #ifndef GAMESERVER_SECTOR_H #define GAMESERVER_SECTOR_H //================================================================================================== /// Sector class /** @author Kim Min Wook < taiyo@webzen.com > @since 2004. 12. 14 @remark - Çʵ带 ±¸¼ºÇÏ´Â ±âº» ´ÜÀ§ ¼½ÅÍ @note - @history - 2006/01/11 : Ç÷¹À̾ ¼½ÅÍ¿¡ µé¾î ¿ÔÀ» ¶§ ±æµå Á¤º¸ º¸³»ÁÖµµ·Ï Ãß°¡, ±âÁ¸ÀÇ m_ResultMsg¸¦ »ç¿ëÇÏ´ø ºÎºÐÀ» »èÁ¦, »ç¿ëÇÏÁö ¾Ê¾Æµµ µÊ. SetFirst(), GetNext() -> iterator·Î ¹Ù²Þ - 2007/10/21 : (Waverix) ÀڷᱸÁ¶ º¯°æ (ÇöÀç 172 --> º¯°æ 44) ¸Þ¸ð¸® »ç¿ë·® ¹× 󸮼ӵµ ÁõÁø - 2011/02/14 : waverix, fit in coding style - 2011/02/21 : waverix, CHANGES: f110221.4L, upgrade to using search node @old-history <0710xx> - Memory Optimization ¾ö°ÝÈ÷ µûÁö¸é ±âÁ¸ ¹æ½Ä´ë·Î °¡´Â °ÍÀÌ ³·´Ù. ÇÏÁö¸¸ ¸Þ¸ð¸® »ç¿ë·®ÀÌ ³Ê¹« ¸¹´Ù´Â ¹®Á¦°¡ ÀÖ¾úÀ¸¸ç, ºÎµæÀÌ ´ÙÀ½°ú °°Àº 󸮷Πº¯°æÇÑ´Ù. ¸Þ¸ð¸® ÃÖÀûÈ­ (Á¾Àü ´ëºñ 1/4, ¼º´É... Çâ»óµÉ °ÍÀÌ´Ù.) - ¸ðµç Object (Player, Character, Item, ...)´Â ÇϳªÀÇ List¿¡ ÀԷµȴÙ. - Object ŸÀÔº° LoopÁö¿øÀ» À§ÇØ °¢end¿ªÇÒÀ» ÇÏ´Â delimeter°¡ »ðÀԵȴÙ. ÇѸ¶µð·Î end()¿ªÇÒÀ» ÇÏ´Â iterator°¡ 2°³ Ãß°¡µÈ´Ù. (Sample - _OBJECT_LIST Ãʱ⠱¸Á¶) begin() <-> end(for Player) | begin(for Character) <-> end(for Character) | begin(for Item) <-> end() (¡Å) init list size == 2 (Sample Insert Player) list.insert(end(for Player), Player) (Sample Insert Character) list.insert(end(for Character), Character) (Sample Insert Item) list.insert(list.end(), Item) - STLX_MAPÀº °Ë»öÀ» À§ÇÑ ÀڷᱸÁ¶À̸ç, Value´Â STLX_LISTÀÇ iteratorÀÌ´Ù. ÀÌ °ªÀº »ç½Ç»ó ½ÇÁ¦ µ¥ÀÌÅÍÀÇ pointerÀÌ´Ù, (¡Å) Áß°£¿¡ »ðÀÔ/»èÁ¦°¡ ÀϾ´õ¶óµµ À¯ÁöµÇ´Â °ªÀÌ µÈ´Ù. */ //================================================================================================== #include "SkillSystem/SearchLinkNode.h" //================================================================================================== // class Sector { public: Sector(); virtual ~Sector(); void Init(DWORD dwSectorIndex); void Release(); void Update(DWORD dwDeltaTick); // RC::eSECTOR_REULT EnterObject(Object* object); RC::eSECTOR_REULT AddObject(Object* object); RC::eSECTOR_REULT LeaveObject(Object* object); RC::eSECTOR_REULT RemoveObject(Object* object); void OnEnterThisToNeighbor(Object* object); // ÀÚ½ÅÁ¤º¸¸¦ ÁÖº¯¿¡°Ô void OnEnterNeighborToThis(Object* object); // ÁÖº¯Á¤º¸¸¦ Àڽſ¡°Ô void OnLeaveThisToNeighbor(Object* object); // ÀÚ½ÅÁ¤º¸¸¦ ÁÖº¯¿¡°Ô void OnLeaveNeighborToThis(Object* object); // ÁÖº¯Á¤º¸¸¦ Àڽſ¡°Ô // DWORD GetSectorIndex() const; bool IsExistInSector(Object* object) const; DWORD GetPlayerNum() const; int GetReferenceCount() const; void UpdateReferenceCount(Object* object, BOOL bEnter); // interfaces for iterator control ns_object::SearchNodeConstIterator GetPlayerRoot() const; ns_object::SearchNodeConstIterator GetPlayerEnd() const; ns_object::SearchNodeConstIterator GetNpcRoot() const; ns_object::SearchNodeConstIterator GetNpcEnd() const; ns_object::SearchNodeConstIterator GetCharacterRoot() const; ns_object::SearchNodeConstIterator GetCharacterEnd() const; ns_object::SearchNodeConstIterator GetItemRoot() const; ns_object::SearchNodeConstIterator GetItemEnd() const; ns_object::SearchNodeConstIterator GetEtcRoot() const; ns_object::SearchNodeConstIterator GetEtcEnd() const; // inter control interfaces, handle carefully. bool Add(Object* object); bool Remove(Object* object); private: struct Delimiter : public util::__LList { // NOTE: f110607.5L, make memory optimization cheat eOBJECT_TYPE object_type; // equals to SearchNode::kNullObject }; // fields... DWORD sector_index_; // Secter Index SHORT number_of_references_; // ÀÌ ¼½ÅÍÀÇ Á¤º¸¸¦ ÂüÁ¶ÇÏ´Â Ç÷¹À̾îÀÇ ¼ö WORD number_of_players_; // ÀÌ ¼½ÅÍ¿¡ Á¸ÀçÇÏ´Â Ç÷¹ÀÌ¾î ¼ö union { util::__LList etc_end_; util::__LList player_root_; Delimiter delimiter0_; }; union { util::__LList player_end_; util::__LList npc_root_; Delimiter delimiter1_; }; union { util::__LList npc_end_; util::__LList item_root_; Delimiter delimiter2_; }; union { util::__LList item_end_; util::__LList etc_root_; Delimiter delimiter3_; }; // friend class Player; friend class GameField; friend class Skill; friend class HighLoadBalancer; // __DISABLE_COPY(Sector); }; //================================================================================================== inline DWORD Sector::GetSectorIndex() const { return sector_index_; } inline DWORD Sector::GetPlayerNum() const { return number_of_players_; } inline int Sector::GetReferenceCount() const { return number_of_references_; } //================================================================================================== inline void Sector::OnEnterThisToNeighbor(Object* object) { object->OnEnterObject(*this); } inline void Sector::OnEnterNeighborToThis(Object* object) { // ÁÖº¯ Á¤º¸(sector) ¹ÞÀ½ object->OnEnterNeighbor(*this); } inline void Sector::OnLeaveThisToNeighbor(Object* object) { // ÀÚ½ÅÀ» ÁÖº¯¿¡°Ô ¾Ë¸² object->OnLeaveObject(*this); } inline void Sector::OnLeaveNeighborToThis(Object* object) { // ÁÖº¯ Á¤º¸(sector) ¹ÞÀ½ object->OnLeaveNeighbor(*this); } //================================================================================================== // interfaces for iterator control inline ns_object::SearchNodeConstIterator Sector::GetPlayerRoot() const { ns_object::SearchNodeConstIterator it = { player_root_.next }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetPlayerEnd() const { ns_object::SearchNodeConstIterator it = { static_cast(&player_end_) }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetNpcRoot() const { ns_object::SearchNodeConstIterator it = { npc_root_.next }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetNpcEnd() const { ns_object::SearchNodeConstIterator it = { static_cast(&npc_end_) }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetCharacterRoot() const { ns_object::SearchNodeConstIterator it = { player_root_.next }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetCharacterEnd() const { ns_object::SearchNodeConstIterator it = { static_cast(&npc_end_) }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetItemRoot() const { ns_object::SearchNodeConstIterator it = { item_root_.next }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetItemEnd() const { ns_object::SearchNodeConstIterator it = { static_cast(&item_end_) }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetEtcRoot() const { ns_object::SearchNodeConstIterator it = { etc_root_.next }; return it; } inline ns_object::SearchNodeConstIterator Sector::GetEtcEnd() const { ns_object::SearchNodeConstIterator it = { static_cast(&etc_end_) }; return it; } #endif //GAMESERVER_SECTOR_H