370 lines
8.6 KiB
C++
370 lines
8.6 KiB
C++
#include "stdafx.h"
|
|
#include "ObjectManager.h"
|
|
//
|
|
#include <PacketStruct_CG.h>
|
|
|
|
#include <Object/Monster.h>
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// <MODULE VARIABLEs>
|
|
ObjectManager* ObjectManager::m_pInstance = NULL;
|
|
|
|
struct sOBJTYPE_PAIR
|
|
{
|
|
GAME_OBJECT::TYPE eTYPE;
|
|
eWISE_OBJECT_INDEX eOBJTYPE;
|
|
};
|
|
|
|
const sOBJTYPE_PAIR OBJPAIR_TABLE[GAME_OBJECT::GOBJ_MAX] =
|
|
{
|
|
{ GAME_OBJECT::GOBJ_USER, OBJTYPE_USER },
|
|
{ GAME_OBJECT::GOBJ_PLAYER, OBJTYPE_PLAYER },
|
|
{ GAME_OBJECT::GOBJ_MONSTER, OBJTYPE_MONSTER },
|
|
};
|
|
|
|
static const DWORD OBJPAIR_UPPERBOUND = sizeof(OBJPAIR_TABLE)/sizeof(sOBJTYPE_PAIR);
|
|
|
|
inline static GAME_OBJECT::TYPE OBJTYPE_2_GAME_OBJTYPE(eWISE_OBJECT_INDEX eTYPE)
|
|
{
|
|
sOBJTYPE_PAIR* pOFFSET = (sOBJTYPE_PAIR*)OBJPAIR_TABLE;
|
|
for(DWORD dwIdx=0 ; dwIdx<OBJPAIR_UPPERBOUND ; ++dwIdx, ++pOFFSET)
|
|
{
|
|
if(pOFFSET->eOBJTYPE == eTYPE)
|
|
return pOFFSET->eTYPE;
|
|
}
|
|
|
|
return GAME_OBJECT::GOBJ_MAX;
|
|
}
|
|
|
|
inline static eWISE_OBJECT_INDEX GAME_OBJTYPE_2_OBJTYPE(GAME_OBJECT::TYPE eTYPE)
|
|
{
|
|
sOBJTYPE_PAIR* pOFFSET = (sOBJTYPE_PAIR*)OBJPAIR_TABLE;
|
|
for(DWORD dwIdx=0 ; dwIdx<OBJPAIR_UPPERBOUND ; ++dwIdx, ++pOFFSET)
|
|
{
|
|
if(pOFFSET->eTYPE == eTYPE)
|
|
return pOFFSET->eOBJTYPE;
|
|
}
|
|
|
|
return OBJTYPE_MAX;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
|
|
ObjectManager::ObjectManager()
|
|
{
|
|
}
|
|
|
|
ObjectManager::~ObjectManager()
|
|
{
|
|
}
|
|
|
|
void ObjectManager::CreateInstance()
|
|
{
|
|
m_pInstance = new ObjectManager();
|
|
|
|
sSIG_OBJCTRL sSIG;
|
|
|
|
sSIG.SUBTYPE() = sSIG_OBJCTRL::ST_ENTER;
|
|
sSIG.OBJTYPE() = OBJTYPE_USER;
|
|
sSIG.OBJECT_KEY() = 10;
|
|
|
|
m_pInstance->OnMsg(&sSIG);
|
|
}
|
|
|
|
void ObjectManager::DestroyInstance()
|
|
{
|
|
SAFE_DELETE(m_pInstance);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
BOOL ObjectManager::ObjectManagerUpdater::DoInit()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ObjectManager::ObjectManagerUpdater::DoProcess()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ObjectManager::ObjectManagerUpdater::IsComplete()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL ObjectManager::ObjectManagerUpdater::DoRelease()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
void ObjectManager::ObjectManagerUpdater::OnMsg(sSIG_MSG* pSIG_MSG)
|
|
{
|
|
sSIG_OBJCTRL& rMSG = *(sSIG_OBJCTRL*)pSIG_MSG;
|
|
|
|
if(rMSG.SIGTYPE() != eSIG_WISEMSG::GAMEOBJ_CONTROL)
|
|
return;
|
|
|
|
ObjectManager& rMANAGER = *m_pInstance;
|
|
RenderObject* pOBJECT = rMANAGER.FindObject(rMSG.OBJECT_KEY());
|
|
|
|
eWISE_OBJECT_INDEX eOBJTYPE = rMSG.OBJTYPE();
|
|
|
|
BYTE streamOBJ[20];
|
|
|
|
OBJ_OP_BASE* pHANDLER = NULL;
|
|
switch(eOBJTYPE)
|
|
{
|
|
case OBJTYPE_USER:
|
|
pHANDLER = new (streamOBJ) OBJ_OP_USER(pOBJECT);
|
|
break;
|
|
case OBJTYPE_PLAYER:
|
|
pHANDLER = new (streamOBJ) OBJ_OP_PLAYER(pOBJECT);
|
|
break;
|
|
case OBJTYPE_MONSTER:
|
|
pHANDLER = new (streamOBJ) OBJ_OP_MONSTER(pOBJECT);
|
|
break;
|
|
default:
|
|
pHANDLER = new (streamOBJ) OBJ_OP_BASE(pOBJECT);
|
|
break;
|
|
}
|
|
|
|
eWISESUBTYPE eSUBTYPE = rMSG.SUBTYPE();
|
|
|
|
switch(eSUBTYPE)
|
|
{
|
|
case sSIG_OBJCTRL::ST_RENDERINFO:
|
|
pHANDLER->OnRenderInfo(rMANAGER, rMSG);
|
|
break;
|
|
case sSIG_OBJCTRL::ST_ENTER:
|
|
pHANDLER->OnEnter(rMANAGER, rMSG);
|
|
break;
|
|
case sSIG_OBJCTRL::ST_LEAVE:
|
|
pHANDLER->OnLeave(rMANAGER, rMSG);
|
|
break;
|
|
case sSIG_OBJCTRL::ST_ATTACK:
|
|
pHANDLER->OnAttack(rMANAGER, rMSG);
|
|
break;
|
|
case sSIG_OBJCTRL::ST_MOVE:
|
|
pHANDLER->OnMove(rMANAGER, rMSG);
|
|
break;
|
|
case sSIG_OBJCTRL::ST_STATUS:
|
|
pHANDLER->OnStatus(rMANAGER, rMSG);
|
|
break;
|
|
default:
|
|
DEBUG_INTERRUPT();
|
|
return;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
RenderObject* ObjectManager::FindObject(DWORD dwObjectKey)
|
|
{
|
|
ObjectManager& rMANAGER = *m_pInstance;
|
|
GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP;
|
|
GAME_OBJECT_MAP_IT itFIND = rMAP.find(dwObjectKey);
|
|
|
|
if(itFIND != rMAP.end())
|
|
{
|
|
RenderObject* pOBJECT = itFIND->second;
|
|
return pOBJECT;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
BOOL ObjectManager::RegisterObject(RenderObject* pOBJECT)
|
|
{
|
|
ObjectManager& rMANAGER = *m_pInstance;
|
|
GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP;
|
|
|
|
DWORD dwObjectKey = pOBJECT->GetObjectKey();
|
|
if(!dwObjectKey)
|
|
return FALSE;
|
|
|
|
rMAP.insert(make_pair(dwObjectKey, pOBJECT));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL ObjectManager::UnRegisterObject(RenderObject* pOBJECT)
|
|
{
|
|
ObjectManager& rMANAGER = *m_pInstance;
|
|
GAME_OBJECT_MAP& rMAP = rMANAGER.m_OBJMAP;
|
|
|
|
DWORD dwObjectKey = pOBJECT->GetObjectKey();
|
|
|
|
BOOL bRET = rMAP.erase(dwObjectKey) ? TRUE : FALSE;
|
|
|
|
return bRET;
|
|
}
|
|
|
|
RenderObject* ObjectManager::AllocObject(GAME_OBJECT::TYPE eOBJTYPE)
|
|
{
|
|
ObjectPoolRouter* pROUTER = ObjectPoolRouter::Instance();
|
|
|
|
eWISE_OBJECT_INDEX eIDX =
|
|
GAME_OBJECT::GOBJ_USER == eOBJTYPE ? OBJTYPE_USER
|
|
: GAME_OBJECT::GOBJ_PLAYER == eOBJTYPE ? OBJTYPE_PLAYER
|
|
: GAME_OBJECT::GOBJ_MONSTER == eOBJTYPE ? OBJTYPE_MONSTER
|
|
: OBJTYPE_MAX ;
|
|
|
|
RenderObject* pOBJECT = (RenderObject*)pROUTER->Alloc(eIDX);
|
|
|
|
return pOBJECT;
|
|
}
|
|
|
|
BOOL ObjectManager::FreeObject(RenderObject* pOBJECT)
|
|
{
|
|
ObjectPoolRouter* pROUTER = ObjectPoolRouter::Instance();
|
|
GAME_OBJECT::TYPE eOBJTYPE = pOBJECT->GetObjectType();
|
|
|
|
eWISE_OBJECT_INDEX eIDX =
|
|
GAME_OBJECT::GOBJ_USER == eOBJTYPE ? OBJTYPE_USER
|
|
: GAME_OBJECT::GOBJ_PLAYER == eOBJTYPE ? OBJTYPE_PLAYER
|
|
: GAME_OBJECT::GOBJ_MONSTER == eOBJTYPE ? OBJTYPE_MONSTER
|
|
: OBJTYPE_MAX ;
|
|
|
|
return pROUTER->Free(eIDX, pOBJECT);
|
|
}
|
|
|
|
//void ObjectManager::OnEnter(sSIG_OBJCTRL* pSIG_MSG)
|
|
//{
|
|
//}
|
|
//
|
|
//void ObjectManager::OnLeave(sSIG_OBJCTRL* pSIG_MSG)
|
|
//{
|
|
//}
|
|
//
|
|
//void ObjectManager::OnAttack(sSIG_OBJCTRL* pSIG_MSG)
|
|
//{
|
|
//}
|
|
//
|
|
//void ObjectManager::OnMove(sSIG_OBJCTRL* pSIG_MSG)
|
|
//{
|
|
//}
|
|
//
|
|
//void ObjectManager::OnStatus(sSIG_OBJCTRL* pSIG_MSG)
|
|
//{
|
|
//}
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
// <OBJ_OP_BASE>
|
|
// Object* 가 NULL인 경우, 신규로 설정해 준다.
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, RenderInfo)
|
|
{
|
|
if(m_pOBJECT)
|
|
return;
|
|
|
|
m_pOBJECT = ObjectManager::FindObject(rSIG_MSG.OBJECT_KEY());
|
|
if(m_pOBJECT)
|
|
return;
|
|
|
|
GAME_OBJECT::TYPE eTYPE = OBJTYPE_2_GAME_OBJTYPE(rSIG_MSG.OBJTYPE());
|
|
m_pOBJECT = rMANAGER.AllocObject(eTYPE);
|
|
m_pOBJECT->Init();
|
|
|
|
}
|
|
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, Enter)
|
|
{
|
|
}
|
|
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_BASE, Leave)
|
|
{
|
|
if(m_pOBJECT)
|
|
{
|
|
GAME_OBJECT::TYPE eTYPE = OBJTYPE_2_GAME_OBJTYPE(rSIG_MSG.OBJTYPE());
|
|
rMANAGER.UnRegisterObject(m_pOBJECT);
|
|
m_pOBJECT->Release();
|
|
rMANAGER.FreeObject(m_pOBJECT);
|
|
m_pOBJECT = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
//
|
|
//
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_USER, RenderInfo)
|
|
{
|
|
OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG);
|
|
// OBJECT KEY
|
|
rMANAGER.RegisterObject(m_pOBJECT);
|
|
}
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
//
|
|
//
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_PLAYER, RenderInfo)
|
|
{
|
|
OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG);
|
|
// OBJECT KEY
|
|
rMANAGER.RegisterObject(m_pOBJECT);
|
|
}
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
//
|
|
//
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, RenderInfo)
|
|
{
|
|
const WORD PROTOCOL_MSG_CG_SYNC_MONSTER_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MONSTER_ENTER_BRD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MONSTER_DIR_ENTER_BRD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_ALLMONSTERS_CMD = MAKEWORD(CG_SYNC, CG_SYNC_ALLMONSTERS_CMD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_MAPNPC_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_MAPNPC_ENTER_BRD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_SUMMONED_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_SUMMONED_ENTER_BRD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_TOTEMNPC_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_TOTEMNPC_ENTER_BRD);
|
|
const WORD PROTOCOL_MSG_CG_SYNC_BOSS_MONSTER_ENTER_BRD = MAKEWORD(CG_SYNC, CG_SYNC_BOSS_MONSTER_ENTER_BRD);
|
|
|
|
MSG_BASE* pMSGBASE = (MSG_BASE*)rSIG_MSG.MSG_HDR();
|
|
WORD wPROTOCOL = MAKEWORD(pMSGBASE->m_byCategory, pMSGBASE->m_byProtocol);
|
|
|
|
BYTE* pMSGDATA = (BYTE*)(pMSGBASE+1);
|
|
WORD wMSGDATA_LEN = (WORD)(rSIG_MSG.MSG_LEN()-sizeof(MSG_BASE));
|
|
|
|
switch(wPROTOCOL)
|
|
{
|
|
// 바로 MONSTER_RENDER_INFO 사용하는 것들 단일
|
|
case PROTOCOL_MSG_CG_SYNC_MONSTER_ENTER_BRD:
|
|
{
|
|
OBJ_OP_BASE::OnRenderInfo(rMANAGER, rSIG_MSG);
|
|
MONSTER_RENDER_INFO* pINFO = (MONSTER_RENDER_INFO*)pMSGDATA;
|
|
MONSTER_RENDER_INFO& rINFO =
|
|
ObjectManager::ALIGN_RENDER_INFO<MONSTER_RENDER_INFO>(m_pOBJECT, pINFO);
|
|
|
|
m_pOBJECT->SetObjectKey(rINFO.m_dwObjectKey);
|
|
}
|
|
break;
|
|
case PROTOCOL_MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD:
|
|
case PROTOCOL_MSG_CG_SYNC_MAPNPC_ENTER_BRD:
|
|
case PROTOCOL_MSG_CG_SYNC_ALLMONSTERS_CMD:
|
|
case PROTOCOL_MSG_CG_SYNC_SUMMONED_ENTER_BRD:
|
|
case PROTOCOL_MSG_CG_SYNC_TOTEMNPC_ENTER_BRD:
|
|
case PROTOCOL_MSG_CG_SYNC_BOSS_MONSTER_ENTER_BRD:
|
|
return;
|
|
}
|
|
|
|
// OBJECT KEY 가 설정되어 있어야 한다.
|
|
rMANAGER.RegisterObject(m_pOBJECT);
|
|
}
|
|
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, Enter)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
|
|
OnRenderInfo(rMANAGER, rSIG_MSG);
|
|
}
|
|
|
|
OBJCTRL_HANDLER_IMPL(OBJ_OP_MONSTER, Leave)
|
|
{
|
|
DEBUGGING_CODE_L3("");
|
|
}
|
|
|