Files
2022-10-26 12:25:11 +08:00

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("");
}