#ifndef _CCELL_H_ #define _CCELL_H_ #pragma once #pragma warning(disable:4800) #include #include #include #include #include #include #include #include #include // Àü¹æ ÂüÁ¶ class CParty; class CCreature; class CAggresiveCreature; class CMonster; class CCharacter; class CSiegeObject; class CBuffer; struct PktBase; struct PktMVEx; namespace Item { class CItem; }; class CCell { public: enum ErrorCode { S_SUCCESS = 0, S_AUTO_ROUTING = 1, E_NOT_ENOUGH_MEMORY = 2, E_NOT_OWNER_OF_ITEM = 3, E_NOT_ITEM = 4, E_CREATE_ITEM_FAIL = 5, E_NOT_EXIST_GUILD = 6, E_GOLD_OVERFLOW = 7 }; enum Const { CONNECT_NUM = 9, CHECK_TIME = 100, // ¾ÆÀÌÅÛÀÌ »ç¶óÁ®¾ß ÇÏ´ÂÁö üũÇÏ´Â °£°Ý (10ÃÊ) ITEM_RIGHT_TIME = 1600, // Ç÷¹À̾ µå¶øÇÑ ¾ÆÀÌÅÛÀÇ °æ¿ì ¼ÒÀ¯±ÇÀº 10ÃÊ, ´Ù½Ã 2ºÐ 30ÃÊ ÈÄ¿£ »ç¶óÁø´Ù. ITEM_LIFE_TIME = 1800, // ¸Ê¿¡ ¾ÆÀÌÅÛÀÌ ³²¾ÆÀÖ´Â ½Ã°£ (3ºÐ) NO_OWNER_TIME = 1500, // ¾ÆÀÌÅÛ¿¡ ¼ÒÀ¯±ÇÀÌ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀº ½Ã°£ (2ºÐ 30ÃÊ) BROADCASTING_TIME = 10, // ±âÁ¸ ºê·Îµå ij½ºÆÃ ŸÀÓ (1ÃÊ) MONEY_BIT = 0x80000000, TYPE_CHECK_BIT = 0xF0000000, ITEM_PROTOTYPE_ID_BIT = 0x0000FFFF, MAX_MONEY_AMOUNT = 0x0FFFFFFF }; enum TurnConst { TURN_OF_CHARACTER = 0, TURN_OF_SIEGE_OBJECT = 1, TURN_OF_MONSTER = 2, TURN_END = 3 }; enum Weather { WEATHER_FINE = 0, // ¸¼À½ WEATHER_RAIN = 1, // ºñ WEATHER_SNOW = 2, // ´« MAX_WEATHER = 3 }; enum ItemAutoRouting { NONE = 0, // ·çÆÃ ÇÏÁö ¾Ê´Â´Ù. PARTY = 1, // ÆÄƼ¿ø¿¡°Ô ·çÆÃ GUILD = 2, // ±æµå¿ø¿¡°Ô ·çÆÃ }; enum ConnectCell { NO = 0, UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4, UPPERLEFT = 5, UPPERRIGHT = 6, LOWERLEFT = 7, LOWERRIGHT = 8 }; enum CellSize { CELL_SIZE_DEFAULT = 128, CELL_SIZE_BATTLE_SERVER = 70, CELL_DISTANCE = 32, CELL_RESOLUTION = 5 }; static unsigned char ms_CellSize; struct IDField { enum { MAX_UID = UCHAR_MAX }; unsigned long dwUID; // À¯´ÏÅ© ID (»ý¼ºµÈ ¼ø¼­¿¡ µû¶ó Â÷·Ê´ë·Î...) unsigned short wMapIndex; // °¡»ó ¸ÊÀÇ °æ¿ì ±× À妽º unsigned char cCellX; // ¼¿ À妽º X unsigned char cCellZ; // ¼¿ À妽º Z }; struct ItemInfo { Position m_Pos; // ¿ùµå¸Ê »óÀÇ À§Ä¡ union { unsigned __int64 m_nUniqueID; // À¯´ÏÅ© ID IDField m_Field; } UID; Item::CItem* m_lpItem; // ¾ÆÀÌÅÛ unsigned long m_dwGold; // µ· unsigned long m_dwOwnerID; // ¼ÒÀ¯±Ç unsigned short m_wPulse; // ¼Ò¸ê±îÁö ³²Àº ÆÞ½º unsigned char m_cAutoRouting; // ¿ÀÅä·çÆÃµÉ ¾ÆÀÌÅÛÀΰ¡? (ItemAutoRouting enum Âü°í) ItemInfo(); void MakeFieldObject(FieldObject& fieldObject); }; typedef std::list > MonsterList; typedef std::list > CharacterList; typedef std::list > ItemList; typedef std::list > SiegeObjectList; //-------------------------------------------------------------------------------------------- // ÃʱâÈ­ CCell(); ~CCell(); void Initialize(unsigned char cIndexX, unsigned char cIndexZ); // ¼¿ ÁÂÇ¥¸¦ ÃʱâÈ­Çϰí, ¼ÒÆ®µÈ ¸µÅ©¸¦ »ý¼ºÇÑ´Ù. void SetMapIndex(unsigned short wMapIndex) { m_wMapIndex = wMapIndex; } unsigned short GetMapIndex() { return m_wMapIndex; } //-------------------------------------------------------------------------------------------- // interface CCell* GetConnectCell(unsigned int Dir); void SetConnectCell(unsigned int Dir, CCell* lpConnectedCell); bool IsNearCell(CCell* lpNearCell); //-------------------------------------------------------------------------------------------- // ¼¿ Á¤º¸ unsigned char GetIndexX() const { return m_cIndexX; } unsigned char GetIndexZ() const { return m_cIndexZ; } size_t GetMonsterNum() const { return m_lstMonster.size(); } size_t GetCharacterNum() const { return m_lstCharacter.size(); } size_t GetItemNum() const { return m_lstItem.size(); } size_t GetSiegeObjectNum() const { return m_lstSiegeObject.size(); } size_t GetNearCellCharacterNum() const; //-------------------------------------------------------------------------------------------- // ¼¿¿¡ Å©¸®ÃÄ Ãß°¡ ¹× »èÁ¦, ¾ò¾î ¿À±â. void SetCreature(unsigned long dwCID, CCreature* lpCreature, CCell* lpLastLogoutCell = 0); void DeleteCreature(unsigned long dwCID, CCell* lpPrepareLoginCell = 0); CCreature* GetCreature(unsigned long dwCID); CAggresiveCreature* GetFirstAggresiveCreature(); CAggresiveCreature* GetNextAggresiveCreature(); void KillAll(CCharacter* lpAttacker); //-------------------------------------------------------------------------------------------- // ¸ó½ºÅÍ °ü·Ã ó¸® bool IsMonster() const { return !(m_lstMonster.empty()); } CMonster* GetFirstMonster(); CMonster* GetNextMonster() { return (++m_MonsterIt != m_lstMonster.end()) ? *m_MonsterIt : NULL; } void LogoutAllMonster() { m_lstMonster.clear(); } //-------------------------------------------------------------------------------------------- // °ø¼º ¿ÀºêÁ§Æ® °ü·Ã ó¸® bool IsSiegeObject() { return !(m_lstSiegeObject.empty()); } CSiegeObject* GetFirstAirShip(); CSiegeObject* GetNextAirShip(); CSiegeObject* GetFirstSiegeObject(); CSiegeObject* GetNextSiegeObject(); void UpgradeByEmblem(unsigned long dwCID); void DegradeByEmblem(); bool IsDetectionCell() { return ( 0 != m_dwCastleEmblemCID ); } void DetectionAttack(CSiegeObject* lpEmblem, CAggresiveCreature* lpTargetCreature); bool SendStealthInfo(CCharacter& character, bool bUseStealth); //-------------------------------------------------------------------------------------------- // ij¸¯ÅÍ °ü·Ã ó¸® bool IsCharacter() { return !(m_lstCharacter.empty()); } CCharacter* GetFirstCharacter(); CCharacter* GetNextCharacter() { return (++m_CharacterIt != m_lstCharacter.end()) ? *m_CharacterIt : NULL; } template inline void ProcessAllMonster(FnProcess fnProcess) { std::for_each(m_lstMonster.begin(), m_lstMonster.end(), fnProcess); } template inline void ProcessAllCharacter(FnProcess fnProcess) { std::for_each(m_lstCharacter.begin(), m_lstCharacter.end(), fnProcess); } void RespawnAllCharacter(unsigned char cExceptNation); //-------------------------------------------------------------------------------------------- // ¾ÆÀÌÅÛ °ü·Ã ó¸® bool IsItem(void) { return !(m_lstItem.empty()); } void SetItem(const Position& Pos, Item::CItem* lpItem, unsigned long dwGold, unsigned long dwOwnerID, unsigned char cAutoRouting, CCell::ItemInfo& cellItemInfo); CCell::ErrorCode GetItem(unsigned long dwCreatureID, unsigned __int64 nItemInfoID, Item::CItem** lppItem, unsigned long& dwMoney_Out); void CheckDeleteItem(void); void DeleteAllItem(void); //-------------------------------------------------------------------------------------------- // ¼¿ °ü·Ã ºê·Îµå ij½ºÆÃ void PrepareBroadCast(); void BroadCast(unsigned long dwCurrentPulse); // ¸¸µç ÆÐŶÀ», WrapÇÏÁö ¸»°í º¸³½´Ù(³»ºÎ¿¡¼­ WrapÇÔ. srvState³ª usError´Â ³ÖÀ»¼ö ¾ø´Ù.) // ÆÐŶ ¼ø¼­°¡ ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î ÁÖÀÇÇÑ´Ù. void SendAllNearCellCharacter(const PktBase* lpPktBase, unsigned short usLength, unsigned char cCMD); void SendAllCharacter(const PktBase* lpPktBase, unsigned short usLength, unsigned char cCMD); void SendNowAllNearCellCharacter(const char* szData, unsigned short usLength, unsigned char cCMD); void SendNowAllCharacter(const char* szData, unsigned short usLength, unsigned char cCMD); void SendAttackInfo(unsigned long AttackerID_In, const AtType &AtType_In, unsigned char DefenserNum_In, DefenserNode* lpNode_In); void SendCastObjectInfo(unsigned long SenderID, unsigned long ReceiverID, CastObject& CastObject_In); private: //-------------------------------------------------------------------------------------------- // ÆÐŶ Àü¼Û °ü·Ã (³»ºÎ¿¡¼­¸¸ È£ÃâÇÏ´Â ÇÔ¼öµé) void SendPullDownInfo(unsigned long dwOwnerID, ItemInfo& itemInfo); void SendPickUpInfo(unsigned long dwCreatureID, unsigned __int64 nItemInfoID); void SendCellLogin(CAggresiveCreature* lpAggresiveCreature, CCell* lpLastLogoutCell); void SendCellLogout(CAggresiveCreature* lpAggresiveCreature, CCell* lpPrepareLoginCell); // ¹öÆÛ¸¦ ÀüºÎ ReleaseÇÑ´Ù. static void ReleaseAllBuffer(CBuffer*& lpBuffer); //-------------------------------------------------------------------------------------------- // µ¥ÀÌÅÍ CCell* m_lpConnectCell[CONNECT_NUM]; // ÁÖº¯ ¿¬°á ¸®½ºÆ®. ÀÚ±â Àڽŵµ Æ÷ÇÔÇÑ´Ù. CCell* m_lpSortedConnectedCell[CONNECT_NUM]; // ÁÖº¯ ¿¬°á ¸®½ºÆ®¸¦ Æ÷ÀÎÅͼøÀ¸·Î ¼ÒÆÃÇÑ ¹è¿­. CharacterList m_lstCharacter; MonsterList m_lstMonster; ItemList m_lstItem; SiegeObjectList m_lstSiegeObject; // ´ÜÁö ¸®½ºÆ®¸¦ °¡Áö°í ÀÖÀ» »Ó, ¸ðµç °ø¼º ¿ÀºêÁ§Æ®´Â CSiegeObjectMgr ÀÌ °ü¸®ÇÑ´Ù. MonsterList::iterator m_MonsterIt; // ¹ü¿ëÀû... ÇÑ ³à¼®ÀÌ ´Ù ¾²±â Àü¿¡ ´Ù¸¥ ³à¼®ÀÌ ´Þ¶ó°í ÇÏ¸é °ï¶õÇÕ´Ï´Ù. CharacterList::iterator m_CharacterIt; // ¹ü¿ëÀû... ÇÑ ³à¼®ÀÌ ´Ù ¾²±â Àü¿¡ ´Ù¸¥ ³à¼®ÀÌ ´Þ¶ó°í ÇÏ¸é °ï¶õÇÕ´Ï´Ù. SiegeObjectList::iterator m_SiegeObjectIt; // ¹ü¿ëÀû... ÇÑ ³à¼®ÀÌ ´Ù ¾²±â Àü¿¡ ´Ù¸¥ ³à¼®ÀÌ ´Þ¶ó°í ÇÏ¸é °ï¶õÇÕ´Ï´Ù. CBuffer* m_lpBroadcast2ndBuffer; // ºê·Îµåij½ºÆ® 2nd¹öÆÛ(»õ ºê·Îµåij½ºÆ® ¹öÆÛ, ij¸¯ÅÍ ¹× ¾ÆÀÌÅÛ¿ë) unsigned long m_dwCastleEmblemCID; // ¼º »ó¡¹°ÀÇ µðÅØ¼Ç ¹üÀ§¿¡ ÀÖ´Â ¼¿ÀÌ¸é »ó¡¹°ÀÇ CID¸¦ °¡Áö°í ÀÖ´Ù. unsigned short m_wMapIndex; // ¸Ê À妽º unsigned char m_cIndexX; // ¸Ê XÁÂÇ¥ unsigned char m_cIndexZ; // ¸Ê ZÁÂÇ¥ unsigned char m_cTurnOfGetAggresiveCreature; CCell::Weather m_eWeather; // ÇöÀç ³¯¾¾ }; #endif