Files
Sun1602/Client/GameClient/ObjectManager.h
T
2022-10-26 12:25:11 +08:00

153 lines
3.9 KiB
C++

/*!
* \file ObjectManager.h
* \brief 오브젝트를 생성,삭제,관리
* \bug
* \todo 최적화 필요
* \author 김경표 (lammy@webzen.co.kr)
* \version 2008/12/30 김경표 - doxygen command 작성
*/
#ifndef _OBJECTMANAGER_H
#define _OBJECTMANAGER_H
#include <ObjKeyGenerator.h>
class ObjectFactory;
class Object;
class MapObject;
struct APPEARANCEINFO;
typedef stdext::hash_map<DWORD, Object *> Object_Map;
typedef Object_Map::iterator Object_Map_Itr;
typedef std::pair<DWORD, Object *> Object_Map_Pair;
typedef util::CObjKeyGenerator<DWORD> OBJ_KEY_GENERATOR;
/*!
* \class ObjectManager Class
* \brief 오브젝트를 생성,삭제,관리
* \author 김경표 (lammy@webzen.co.kr)
*/
class ObjectManager
{
#ifdef _K2P_OBJECT_MANAGER_MODIFIDY
typedef std::multimap<DWORD, DWORD> OBJECT_MULTIMAP_TYPE;
typedef std::multimap<DWORD, DWORD>::iterator OBJECT_MULTIMAP_ITRTYPE;
typedef std::pair<OBJECT_MULTIMAP_ITRTYPE, OBJECT_MULTIMAP_ITRTYPE> OBJECT_MULTIMAP_PAIR_TYPE;
OBJECT_MULTIMAP_TYPE m_ObjectKindMap;
#endif
public:
/// 기본 생성자
ObjectManager( void );
/// 소멸자
~ObjectManager( void );
protected:
/// 오브젝트 관리하는 해쉬 맵
Object_Map m_hashmapObject;
/// 오브젝트를 생성하는 펙토리
ObjectFactory* m_pObjectFactory;
/// 펫관련
std::vector<DWORD> m_vPetContainer;
OBJ_KEY_GENERATOR* m_pPetKeyGenerator; //! 팻
OBJ_KEY_GENERATOR* m_pBattleZoneKeyGenerator; //!< 배틀존 플레이어
/// 싱글 모드의 키생성과 독립적으로 클라이언트에서 키를 생성해야 할 필요가 있을경우에 사용되는 변수
OBJ_KEY_GENERATOR* m_pPlayerKeyGenerator;
OBJ_KEY_GENERATOR* m_pMonsterKeyGenerator;
OBJ_KEY_GENERATOR* m_pNpcKeyGenerator;
OBJ_KEY_GENERATOR* m_pItemKeyGenerator;
OBJ_KEY_GENERATOR* m_pMapObjectKeyGenerator;
OBJ_KEY_GENERATOR* m_pNonCharacterKeyGenerator;
#ifndef _K2P_OBJECT_MANAGER_MODIFIDY
int m_iPlayerCount;
int m_iMonsterCount;
int m_iItemCount;
#endif
protected:
/// 키 생성 관련.
void InitKeyGenerator( void );
void RestoreKey( Object * pObject );
void ReleaseKeyGenerator();
void SafeRestoreKey(OBJ_KEY_GENERATOR* generator, DWORD key);
/// 펫관련 삭제함수
void InitPetContainer() { m_vPetContainer.clear(); }
void CheckPetSummoned( Object * pObject );
void DeletePetContainer();
BOOL DeletePet( DWORD dwObjectKey );
public:
BOOL Create( void );
void Destroy( void );
void Destroy( const std::vector<DWORD> &vdwKeys);
Object * Add( DWORD dwObjectKey, eOBJECT_TYPE objType, DWORD class_code, BOOL bHero = FALSE );
Object * AddMapObject( DWORD dwObjectKey, eOBJECT_TYPE objType, APPEARANCEINFO * pAppearInfo, OBJECT_SUB_TYPE subType = OBJECT_SUB_TYPE_NONE );
BOOL Delete( DWORD dwObjectKey );
#ifdef _MOD_CHAGNE_DELETE_HERO
BOOL DeleteHero();
#endif
Object * GetObject(DWORD dwKey);
Object * GetObject( const TCHAR *szName );
void GetMonsters(std::vector<Monster*>& pMonsterArry);
void GetPlayers(std::vector<Player*>& pPlayerArry);
Player* GetPlayer(DWORD object_key);
Character* GetCharacter(DWORD object_key);
MapObject * GetTerrainObject( DWORD dwID );//툴상의 입력된 아이디로 오브젝트를 찾는다
void DeleteObjectsByType( eOBJECT_TYPE eObjectType );
void DeletePlayersWithoutHero( DWORD dwHeroKey );
#ifdef _MOD_CHAGNE_DELETE_HERO
void DeleteAllObjectWithoutHero();
#endif
int GetObjectCount(eOBJECT_TYPE objType);
int GetAllObjectCnt();
#ifdef _K2P_OBJECT_MANAGER_MODIFIDY
void ProcessUnits( DWORD dwTick );
DWORD GetObjectKey( const char * szName );
#endif
DWORD GenerateKeyByBattleZonePlayer(eOBJECT_TYPE obj_type);
DWORD GenerateKeyByPet(eOBJECT_TYPE obj_type);
DWORD GenerateKeyAtSingleMode(eOBJECT_TYPE objType);
Object_Map::iterator GetBegin()
{
return m_hashmapObject.begin();
}
Object_Map::iterator GetEnd()
{
return m_hashmapObject.end();
}
virtual void RestoreObjectName();
void RefreshPlayerHideState();
};
extern ObjectManager g_ObjectManager;
#endif // _OBJECTMANAGER_H