Files
Sun1602/Server/GameServer/World/GameWarControlManager.cpp
T
2022-10-26 12:25:11 +08:00

333 lines
8.5 KiB
C++

#include "stdafx.h"
#include <PacketStruct_AG.h>
#include <GameInstanceDungeon.h>
#include <Status/StatusManager.h>
#include "GameWarControlManager.h"
// for debugging control
#undef WAVERIX_DEBUGGING_OUTPUTn
#undef WAVERIX_DEBUGGING_OUTPUTnV
#define WAVERIX_DEBUGGING_OUTPUTn( msg ) \
SUNLOG( eCRITICAL_LOG, "[%s][%u][%u] %s\n", __FUNCTION__, __LINE__, \
(DWORD)((GetTickCount()-tickvalue)/(1000)), msg ); \
tickvalue = GetTickCount()
#define WAVERIX_DEBUGGING_OUTPUTnV( value ) \
{ CHAR _message[10]; \
WAVERIX_DEBUGGING_OUTPUTn( itoa( value, _message, sizeof(_message) ) ); }
static DWORD tickvalue = GetTickCount();
#include "./SSQ/GameSSQControlInfos.hxx"
#include "./SSQ/GameSSQPacketProcess.hxx"
#include "./SSQ/GameSSQUpdateCtrl.hxx"
#include "./SSQ/GameSSQControlManagerImpl.hxx"
#include "./SSQ/SSQHandlerInGame.h"
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <DEFINITION #2>
//
#define MGR_SSQIMPL ((GameSSQControlManagerImpl&)*m_pSSQImpl)
#define MGR_SSQIMPLS(this_) ((GameSSQControlManagerImpl&)*((this_)->m_pSSQImpl))
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <GameWarControlManager>
WORK_KEY GameWarControlManager::ms_WorkKey = 0;
GameWarControlManager* GameWarControlManager::ms_pSSQControlManager = NULL;
GameWarControlManager::GameWarControlManager()
{
ms_pSSQControlManager = this;
m_pSSQImpl = new GameSSQControlManagerImpl();
}
GameWarControlManager::~GameWarControlManager()
{
SAFE_DELETE( m_pSSQImpl );
ms_pSSQControlManager = NULL;
}
//─────────────────────────────────────────
// <IWorkNode Interface>
BOOL
GameWarControlManager::DoInit()
{
MGR_SSQIMPL.ScheduleUpdateTimer.SetTimer(INTERVALofUPDATE);
MGR_SSQIMPL._InitializeUpdateCtrl();
return TRUE;
}
BOOL
GameWarControlManager::DoProcess()
{
ITimerBase& rTimeScheduler = MGR_SSQIMPL.ScheduleUpdateTimer;
if( rTimeScheduler.IsExpired() )
{
sTIME_INFO timeInfo;
sTIME_INFO::SetTimeValue( timeInfo );
SSQ_UPDATERS& rList = MGR_SSQIMPL.UpdateList;
FOREACH_CONTAINER( const SSQ_UPDATER_NODE& rCtrlNode, rList, SSQ_UPDATERS )
{
GameSSQUpdateCtrl* const pCtrl = rCtrlNode.pUpdater;
pCtrl->UpdateMsg( timeInfo );
pCtrl->Update( timeInfo );
}
}
return TRUE;
}
BOOL
GameWarControlManager::IsComplete()
{
return FALSE;
}
BOOL
GameWarControlManager::DoRelease()
{
MGR_SSQIMPL._ReleaseUpdateCtrl();
return TRUE;
}
// Control Interface
VOID
GameWarControlManager::OnMsg( sSIG_MSG* pSIG_MSG )
{
}
//─────────────────────────────────────────
// <INTERFACEs>
VOID
GameWarControlManager::Update()
{
}
#define SSQ_PACKET_HANDLER_CALL( c, p ) \
case MAKEWORD( c, p ): \
MGR_SSQIMPLS(this_).OnRecv_##p( static_cast<const MSG_##p*>( pMsg ), wSize, pSession.m_pSession ); \
break
VOID
GameWarControlManager::OnRecv( const MSG_BASE* pMsg, const WORD wSize, const GameSSQSessionCmd::FromClient& pSession )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
const WORD protocol = MAKEWORD( pMsg->m_byCategory, pMsg->m_byProtocol );
//switch( protocol )
//{
//default:
FlowControl::FCAssert( !"Unexpected Status" );
//}
return;
}
VOID
GameWarControlManager::OnRecv( const MSG_BASE* pMsg, const WORD wSize, const GameSSQSessionCmd::FromAgent& pSession )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
const WORD protocol = MAKEWORD( pMsg->m_byCategory, pMsg->m_byProtocol );
switch( protocol )
{
SSQ_PACKET_HANDLER_CALL( AG_ZONE, AG_ZONE_SSQ_JOIN_INFO_SYN );
SSQ_PACKET_HANDLER_CALL( AG_ZONE, AG_ZONE_SSQ_JOIN_SYN );
SSQ_PACKET_HANDLER_CALL( AG_ZONE, AG_ZONE_SSQ_ROOM_CTRL_CMD );
default:
FlowControl::FCAssert( !"Unexpected Status" );
}
return;
}
VOID
GameWarControlManager::Serialize()
{
}
BOOL
GameWarControlManager::SendPacket( const MSG_BASE* pMsg, const WORD wSize )
{
return TRUE;
}
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <GameWarControlManager><SendPacket>
VOID
GameWarControlManager::OnMsg( const GameSSQCtrlCmd::Created&, GameInstanceDungeon* const pIndun )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
// 이후 해제될 때 해제하는 루틴이 요구된다.
const MAPCODE mapCode = pIndun->GetMapCode();
SSQ_UPDATERS_IT itFind = MGR_SSQIMPLS(this_)._FindCodeOfSSQ( mapCode );
if( itFind == MGR_SSQIMPLS(this_).UpdateList.end() )
return;
SSQ_UPDATER_NODE& rNode = *itFind;
const KEYTYPE keySSQField = pIndun->GetKey();
rNode.SetKey( keySSQField );
rNode.pUpdater->SetDungeon( pIndun );
}
VOID
GameWarControlManager::OnMsg( const GameSSQCtrlCmd::Destroy&, GameInstanceDungeon* const pIndun )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
const MAPCODE mapCode = pIndun->GetMapCode();
const SSQCODE CodeOfSSQ = mapCode;
SSQ_UPDATERS_IT itFind = MGR_SSQIMPLS(this_)._FindCodeOfSSQ( CodeOfSSQ );
if( itFind == MGR_SSQIMPLS(this_).UpdateList.end() )
return;
SSQ_UPDATER_NODE& rNode = *itFind;
const KEYTYPE keySSQField = pIndun->GetKey();
SSQMsgRouterInGame* const pMsgRouter = rNode.pUpdater->GetMsgRouter();
BROADCASTER_MSG_AG_ZONE_SSQ_ROOM_CTRL_CMD& rMsgCMD = pMsgRouter->GetCMD_AG();
WAR_MSG_HDR* const pHeader = &rMsgCMD.MSG_HEADER;
{
MSGSUB_SSQ_S2S_FIELD_DESTORYED msg;
msg.CodeOfSSQ = mapCode;
msg.m_ZoneKey = keySSQField;
msg.SerializeTo( pHeader );
}
pMsgRouter->Update( CodeOfSSQ ); // side-effect : flush buffer
GameSSQUpdateCtrl::ChangeToNextUpdateCtrl( rNode.pUpdater, GameSSQControlInfo::TT_NONE );
rNode.SetKey( 0 );
rNode.pUpdater->SetDungeon( 0 );
}
VOID
GameWarControlManager::OnMsg( const GameSSQCtrlCmd::CharacterState& rInfo, GameInstanceDungeon* const pIndun )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
const MAPCODE mapCode = pIndun->GetMapCode();
const SSQCODE CodeOfSSQ = mapCode;
SSQ_UPDATERS_IT itFind = MGR_SSQIMPLS(this_)._FindCodeOfSSQ( CodeOfSSQ );
if( itFind == MGR_SSQIMPLS(this_).UpdateList.end() )
return;
SSQ_UPDATER_NODE& rNode = *itFind;
GameSSQUpdateCtrl* const pCtrl = rNode.pUpdater;
Character* const pCharacter = rInfo.pCharacter;
if( rInfo.isEnter )
{
if( MGR_SSQIMPLS(this_)._OnEnterEvent( pCtrl, pCharacter ) )
{
}
}
else
{
if( MGR_SSQIMPLS(this_)._OnLeaveEvent( pCtrl, pCharacter ) )
{
// (080913) - nothing...
}
}
}
VOID
GameWarControlManager::OnMsg( const GameSSQCtrlCmd::CharacterEvent& rInfo, GameInstanceDungeon* const pIndun )
{
if( !ms_pSSQControlManager )
return;
GameWarControlManager* const this_ = ms_pSSQControlManager;
const MAPCODE mapCode = pIndun->GetMapCode();
const SSQCODE CodeOfSSQ = mapCode;
SSQ_UPDATERS_IT itFind = MGR_SSQIMPLS(this_)._FindCodeOfSSQ( CodeOfSSQ );
if( itFind == MGR_SSQIMPLS(this_).UpdateList.end() )
return;
SSQ_UPDATER_NODE& rNode = *itFind;
GameSSQUpdateCtrl* const pCtrl = rNode.pUpdater;
//rInfo.pCharacter;
const GameSSQCtrlCmd::eCharacterEvent event = rInfo.event;
switch( event )
{
case GameSSQCtrlCmd::On_Dead:
{
typedef GameSSQCtrlCmd::CharacterEvent::OnDead CmdOnDead;
const CmdOnDead& rCmd = static_cast<const CmdOnDead&>(rInfo);
MGR_SSQIMPLS(this_)._OnDead( pCtrl, rCmd.pDest, rCmd.pSrc );
}
break;
default:
SUNLOG( eCRITICAL_LOG, "Invalid CharacterEvent (%u)", event );
}
}
namespace GameSSQControlInfo
{
static const GM_Spec::Category _GM_Categoriess[GM_Spec::eCategory_upperbound]
= {
{ GM_Spec::eCategory_SSQ, "ssq", },
};
};
BOOLEAN
GameWarControlManager::OnMsg( const GameSSQCtrlCmd::GMCmd& rInfo, Player* const pGmPlayer )
{
if( !ms_pSSQControlManager )
return FALSE;
// Type Control
GM_Spec::eCategory cate_type = GM_Spec::eCategory_upperbound;
{
typedef util::ARRAY_TYPEINFO< const GM_Spec::Category,
0, GM_Spec::eCategory_upperbound > array_info;
FOREACH_ARRAY( const GM_Spec::Category& rCate, _GM_Categoriess, array_info )
{
const INT iRet = memcmp( rCate.CateString, rInfo.Arguments[0], sizeof(GM_Spec::String) );
if( iRet )
continue;
cate_type = rCate.Cate;
break;
}
};
switch( cate_type )
{
case GM_Spec::eCategory_SSQ:
{
GameWarControlManager* const this_ = ms_pSSQControlManager;
return MGR_SSQIMPLS(this_).GM_Command_Process( rInfo, pGmPlayer );
}
break;
}
return FALSE;
}