/* ==================================================================== * ÆÄ ÀÏ : * ¸ñ Àû : * ÀÛ ¼º ÀÚ : Á¤¼º´ë * ÀÛ ¼º ÀÏ : 2006.08.29 * * Ãß°¡³»¿ë : * Ãß°¡³¯Â¥ ÀÛ¾÷ÀÚ Ãß°¡³»¿ë * 2006.08.29 Á¤¼º´ë »ý¼º * * ÁÖÀÇ»çÇ× : * =================================================================== */ #pragma once #include "Player.h" #include "Npc_Common.h" #include "IndexGenerator.h" #include "Gathering_Common.h" #include "Monster_Common.h" #include "PlayerNamePool.h" class cBaseObject; class cMonster; class cNpc; class cItem; class cTotem; class cGridManager; class cStatusCalc_Server; class cDamageCalc; class cStatusScript; class cMonsterScript; class cLevelScript; class cNPCScript; class cTotemScript; class cVehicleScript; class cGatheringScript; class cGathering; class cFlag; class cFlagPoint; class cShortCutScript; class cUserPortal; class cTutorialScript; class cTutorialSkillScript; struct PerSocketContext; struct sObject; enum eOBJECTTYPE; /// ÃßÀû À§Ä¡ ¹øÈ£º° À§Ä¡°ª const NiPoint2 FOLLOW_POS_VALUE[FOLLOW_POS_MAX] = { NiPoint2( -1, 1 ), NiPoint2( 0, 1 ), NiPoint2( 1, 1 ), NiPoint2( -1, 0 ), NiPoint2( 0, 0 ), NiPoint2( 1, 0 ), NiPoint2( -1, -1 ), NiPoint2( 0, -1 ), NiPoint2( 1, -1 ) }; class cObjectManager { /// pool typedef tPool cPlayerPool; typedef tPool cMonsterPool; typedef tPool cNpcPool; typedef tPool cItemPool; typedef tPool cTotemPool; typedef tPool cGatheringPool; typedef tPool cUserPortalPool; /// hashmap typedef tPointerHashMap cPlayerMap; typedef tPointerHashMap cMonsterMap; typedef tPointerHashMap cNpcMap; typedef tPointerHashMap cItemMap; typedef tPointerHashMap cTotemMap; typedef tPointerHashMap cGatheringMap; typedef tPointerHashMap cPointHashMap; public: static cObjectManager* mpObjectManager; public: cObjectManager(void); ~cObjectManager(void); bool Init( int serverType ); void StageScriptInit( unsigned short mapType ); void Release(); void ThemeDataClear(); void Process( unsigned long elapsedTime, unsigned long accumTime ); /// pool alloc & free cPlayer* AllocPlayer(); void FreePlayer( cPlayer* ptr ); cMonster* AllocMonster(); void FreeMonster( cMonster* ptr ); cNpc* AllocNpc(); void FreeNpc( cNpc* ptr ); cItem* AllocItem( ); void FreeItem( cItem* ptr ); cTotem* AllocTotem( ); void FreeTotem( cTotem* ptr ); cGathering* AllocGathering( ); void FreeGathering( cGathering* ptr ); cUserPortal* AllocUserPortal( ); void FreeUserPortal( cUserPortal* ptr ); /// add & remove functions cPlayer* GetPlayer ( unsigned long playerIdx ) { return mpPlayerMap->GetAt( playerIdx ); } cPlayer* GetPlayer ( wchar_t* charName ); cPlayer* AddPlayer ( unsigned long connectionIdx, unsigned long playerIdx, wchar_t* playerName, unsigned long money, unsigned long deposit ); bool RemovePlayer ( unsigned long playerIdx ); /// 061201 PKH ¸ó½ºÅÍ Ãß°¡ cMonster* GetMonster ( unsigned long monsterIdx ) { return (cMonster*)mpMonsterMap->GetAt( monsterIdx ); } cMonster* AddMonster ( unsigned long monsterIdx, unsigned long calssIdx, unsigned long regenIdx, unsigned short mapNumber, unsigned char levelMode ); bool RemoveMonster ( unsigned long monsterIdx ); void InsertDeleteMonster( unsigned long monsterIdx ); void MonJobProcess( cMonster* pMonster, eACTION_ID actionid, eACTION_CHANGE actionstate ); cMonster* GetDeathMonster ( unsigned long monsterIdx ) { return (cMonster*)mpDeathMonsterMap->GetAt( monsterIdx ); } void AddDeathMonster( cMonster* pMonster ); void RecoverDeathMonster( cMonster* pMonster ); cNpc* GetNpc ( unsigned long npcIdx ) { return mpNpcMap->GetAt( npcIdx ); } cNpc* AddNpc ( int uniqueIdx, unsigned long classIdx, unsigned short mapNumber, float x, float y, float dir ); bool RemoveNpc ( unsigned long npcIdx ); cItem* GetItem ( unsigned long itemIdx ) { return mpItemMap->GetAt( itemIdx ); } cItem* AddItem ( unsigned long itemIdx, cBaseObject* baseObject, bool getAuto=false ); bool RemoveItem ( unsigned long itemIdx ); cTotem* GetTotem ( unsigned long totemIdx ) { return mpTotemMap->GetAt( totemIdx ); } cTotem* AddTotem ( unsigned long calssIdx, unsigned long partyIdx, unsigned long partyUnionIdx, NiPoint2 pos, sObject attacker, eAPPLYTYPE applyType, eATTRIBUTETYPE attributeType, unsigned long skillIdx, float direction, unsigned char applyCnt ); cTotem* PvPAddTotem ( unsigned char teamType, unsigned long calssIdx, unsigned short pvpIdx, NiPoint2 pos, eAPPLYTYPE applyType, eATTRIBUTETYPE attributeType ); bool RemoveTotem ( unsigned long totemIdx ); void InsertDeleteTotem( unsigned long totemIdx ); cGathering* GetGathering ( unsigned long gatheringIdx ) { return (cGathering*)mpGatheringMap->GetAt( gatheringIdx ); } cGathering* AddGathering ( unsigned long regenIdx, unsigned long gatheringIdx, unsigned short mapNumber, float posX, float posY, float direction, float height ); bool RemoveGathering ( unsigned long gatheringIdx ); void InsertDeleteGathering( unsigned long gatheringIdx ); cUserPortal* GetUserPortal ( unsigned long objectIdx ) { return (cUserPortal*)mpUserPortalMap->GetAt( objectIdx ); } cUserPortal* AddUserPortal ( unsigned long mapChangePosIdx, unsigned long creatorIdx, unsigned short mapNumber, float posX, float posY ); bool RemoveUserPortal ( unsigned long objectIdx ); void InsertDeleteUserPortal( unsigned long objectIdx ); /// 070622 PKH Á¢¼ÓÇÑ Ç÷¹À̾°Ô¸¸ ¸ó½ºÅÍ ¸ðµ¨ Á¤º¸¸¦ º¸³»ÁØ´Ù. void SendMsgMonsterModelNumberToPlayer( ULONG_PTR socketContext, unsigned long mapNum ); /// 070622 PKH Á¢¼ÓÇÑ Ç÷¹À̾°Ô¸¸ NPC ¸ðµ¨ Á¤º¸¸¦ º¸³»ÁØ´Ù. void SendMsgNpcModelNumberToPlayer( ULONG_PTR socketContext, unsigned long mapNum ); cBaseObject* GetObject( unsigned char objectType, unsigned long idx ); /// 071029 KCJ NPC¸Ê ¹Ýȯ void* GetNpcMap ( ) { return mpNpcMap; } /// 071113 KCJ ITEM¸Ê ¹Ýȯ void* GetItemMap ( ) { return mpItemMap; } /// 070627 PKH NPCµ¥ÀÌÅ͸¦ pool¿¡ µî·ÏÇÑ´Ù. void LoadNpcInfo(); /// 070817 PKH ¸ñÇ¥ ÁöÁ¡À» ±âÁØÀ¸·Î ¹üÀ§¾È¿¡ ÇØ´çÇÏ´Â Ç÷¹À̾î¿Í °¹¼ö¸¦ ¾Ë·ÁÁÜ //void PlayerInCenterPoint( unsigned short centerMapNum, NiPoint3 centerPoint, float range, tArray* targetAry, bool applyHP, // unsigned char maxTargetCnt = TARGET_CNT_MAX ); ///// 080429 PKH °áÅõ ½Ã½ºÅÛµî player°¡ player¸¦ °ø°ÝÇÏ´Â ÇüÅ //void PlayerInCenterPoint( unsigned short centerMapNum, NiPoint3 centerPoint, float range, tArray* targetAry, // unsigned long attackerIdx, bool applyHP, unsigned char maxTargetCnt = TARGET_CNT_MAX ); /// 070817 PKH ¸ñÇ¥ ÁöÁ¡À» ±âÁØÀ¸·Î ¹üÀ§¾È¿¡ ÇØ´çÇÏ´Â ¸ó½ºÅÍ¿Í °¹¼ö¸¦ ¾Ë·ÁÁÜ //void MonsterInCenterPoint( unsigned short centerMapNum, NiPoint3 centerPoint, float range, tArray* targetAry, bool applyHP, // unsigned char maxTargetCnt = TARGET_CNT_MAX ); //void MonsterInBox( unsigned short centerMapNum, float direction, NiPoint3 centerPos3, // float rangeX, float rangeY, tArray* targetAry, bool applyHP, unsigned char maxTargetCnt = TARGET_CNT_MAX ); float ObjectSizeRange( cBaseObject* object1, cBaseObject* object2, float range ); /// ±âÁØÁ¡À¸·Î ÃßÀû ÆÛÁüÀ§Ä¡ ÁÂÇ¥°ª °è»ê NiPoint2 CalcFollowPos( unsigned char followPos, NiPoint2 centerPos, float range ); /// npc¿Í ´ëÈ­ °¡´É ¿©ºÎ¸¦ ÆÇº°ÇØ ÁØ´Ù. unsigned long IsNpcTalk( unsigned long npcIdx, cPlayer* pPlayer, eNPC_TALK_TYPE npcTalkType, unsigned long value, ULONG_PTR socketContext = 0 ); void SendNotice( char* msg, unsigned long size ); /// ġƮ void CheatRemoveItemRange( cBaseObject* obj, float radius ); void CheatRemoveMonsterRange( cBaseObject* pCenter, float size, bool isCheatKill = false ); void CheatRemoveMonster( unsigned long monsterIdx ); void CheatKillMonster( unsigned long monsterIdx, unsigned long playerIdx ); void QuestRemoveMonster( unsigned long monsterIdx ); // void SendPVPNotice( unsigned char leftMinute, unsigned short PvPType, unsigned long aryPos ); void SendMsgSynPVPReadyQuestion( unsigned short pvpType, unsigned long aryPos ); //void SendMsgSynPVPReadyClose( unsigned long aryPos ); // void SendTimeEventQuest(); /// GM À̺¥Æ® void AddGMEvent( sGMEventInfo eventInfo ); void DelGMEvent( unsigned long DBIndex, unsigned long influenceIdx ); protected: // Memory Pool - cPlayerNamePool class. cPlayerNamePool* mpPlayerNamePool; /// Objects Pool & Map cPlayerPool* mpPlayerPool; cMonsterPool* mpMonsterPool; cNpcPool* mpNpcPool; cItemPool* mpItemPool; cTotemPool* mpTotemPool; cGatheringPool* mpGatheringPool; cUserPortalPool* mpUserPortalPool; cPlayerMap* mpPlayerMap; cMonsterMap* mpMonsterMap; cNpcMap* mpNpcMap; cItemMap* mpItemMap; cTotemMap* mpTotemMap; cGatheringMap* mpGatheringMap; cPointHashMap* mpUserPortalMap; cMonsterMap* mpDeathMonsterMap; typedef tArray cArray; typedef tHashSet cHashSet; /// 070115 PKH µ¥¹ÌÁö °è»ê±â cStatusCalc_Server* mpStatusCalc; cDamageCalc* mpDamageCalc; cStatusScript* mpStatusScript; /// 070130 PKH ¸ó½ºÅÍ cMonsterScript* mpMonsterScript; cArray mDelMonster; cArray mDelMonsterMapOnly; /// ·¹º§ ½ºÅ©¸³Æ® cLevelScript* mpLevelScript; cNPCScript* mpNpcScript; /// 081212 PKH ÅäÅÛ cTotemScript* mpTotemScript; cIndexGenerator mTotemIdxGen; cArray mDelTotem; /// 081212 PKH äÁý cGatheringScript* mpGatheringScript; cIndexGenerator mGatheringIdxGen; cArray mDelGathering; cIndexGenerator mUserPortalIdxGen; cArray mDelUserPortal; /// 090106 PKH Å»°Í cVehicleScript* mpVehicleScript; /// Äü½½·Ô µðÆúÆ® ¼¼ÆÃ cShortCutScript* mpShortCutScript; // Æ©Å丮¾ó ½ºÅ©¸³Æ® cTutorialScript* mpTutorialScript; // Æ©Å丮¾ó ½ºÅ³ ½ºÅ©¸³Æ® cTutorialSkillScript* mpTutorialSkillScript; }; #define OBJECTMANAGER cObjectManager::mpObjectManager