Files
Sun1602/Server/AgentServer/Zone/SSQ/ISSQHandler.cpp
T
2022-10-26 12:25:11 +08:00

327 lines
8.4 KiB
C++

#include "stdafx.h"
#include <PacketStruct_AG.h>
#include <UserSessions/User.h>
#include <UserSessions/UserManager.h>
#include <ServerSessions/ServerSessionManager.h>
#include <ServerSessions/BattleServerSession.h>
#include <ServerSessions/FieldServerSession.h>
#include <Zone/DungeonSSQ.h>
#include <Zone/ZoneManager.h>
#include <Party/PartyManager.h>
#include <Zone/WarControlManager.h>
#include "ISSQHandler.h"
#include "SSQControlInfos.hxx"
#include "SSQUpdateCtrl.hxx"
#include "SSQPacketProcess.hxx"
#include "SSQControlManagerImpl.hxx"
//==================================================================================================
// <ISSQHandler>
//
ISSQHandler::ISSQHandler()
: m_eState(ISSQHandler::USR_NONE_STATE)
{
m_Timer.Disabled();
ZeroMemory(&m_FLD_USR_INFO, sizeof(m_FLD_USR_INFO));
ClearDupInfo();
}
ISSQHandler::~ISSQHandler()
{
}
//template< ISSQHandler::eSTATE state >
//BOOLEAN
//ISSQHandler::ChangeStatus(const State<state>& state_info)
//{
// return FALSE;
//}
BOOLEAN
ISSQHandler::ChangeStatus(const State<MONSTER_STATE>& state_info)
{
m_eState = state_info.value;
m_Timer.Disabled();
m_FLD_USR_INFO.m_pUser = 0;
m_FLD_USR_INFO.m_IsPlayer = state_info.INFO.m_IsPlayer;
m_FLD_USR_INFO.m_ObjectKey = state_info.INFO.m_ObjectKey;
m_FLD_USR_INFO.m_MsgRouter = state_info.INFO.m_MsgRouter;
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_REGISTERED_SSQ_INDEXER>& state_info)
{
m_eState = state_info.value;
m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout);
m_FLD_USR_INFO = state_info.INFO;
//_NA_20110630_BATTLE_ZONE_RENEWAL
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_REGISTERED_SSQ_INDEXER] - timeout %u", state_info.timeout);
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_PORTAL_OBJECT_CREATED>& state_info)
{
m_eState = state_info.value;
m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout);
m_Dup.FLD_PORTAL_OBJECT = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_PORTAL_OBJECT_CREATED] - timeout %u", state_info.timeout);
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_PORTAL_TRANSACTION>& state_info)
{
m_eState = state_info.value;
m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout);
m_Dup.FLD_PORTAL_TRANS = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_PORTAL_TRANSACTION] - timeout %u", state_info.timeout);
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_ENTERING_SSQ_FIELD>& state_info)
{
ASSERT(USR_PORTAL_TRANSACTION == m_eState);
User* const pUser = m_FLD_USR_INFO.m_pUser;
//_NA_20110630_BATTLE_ZONE_RENEWAL
m_eState = state_info.value;
m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout);
m_Dup.FLD_SSQ_FIELD_ENTTRANS = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_ENTERING_SSQ_FIELD] - timeout %u", state_info.timeout);
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_ENTERED_SSQ_FIELD>& state_info)
{
//////////////////////////////////////////////////////////////////////////
// 새로운 상태를 위한 정보 설정
m_eState = state_info.value;
m_Timer.Disabled();
m_Dup.FLD_SSQ_FIELD = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_ENTERED_SSQ_FIELD] - timeout X");
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_LEAVED_SSQ_FIELD>& state_info)
{
//WAVERIX_SSQ_PORTAL_TRANSACTION_MODIFY
//////////////////////////////////////////////////////////////////////////
// 새로운 상태를 위한 정보 설정
m_eState = state_info.value;
m_Timer.Instance();
m_Dup.FLD_SSQ_FIELD_LEAVED = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "[USR_LEAVED_SSQ_FIELD] - timeout X");
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_ENTERED_ON_DEAD>& state_info)
{
m_eState = state_info.value;
m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout);
m_Dup.FLD_ON_DEAD = state_info.INFO;
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] - timeout %u", state_info.timeout);
);
return TRUE;
}
BOOLEAN
ISSQHandler::ChangeStatus(const State<USR_PORTAL_FAILED>& state_info)
{
switch(m_eState)
{
case USR_NONE_STATE:
case MONSTER_STATE:
break;
case USR_REGISTERED_SSQ_INDEXER:
case USR_PORTAL_OBJECT_CREATED:
case USR_PORTAL_TRANSACTION:
{
User* const pUser = m_FLD_USR_INFO.m_pUser;
const POSTYPE posOfItem = pUser->GetLockItemPosForInstanceDungeon();
if(INVALID_POSTYPE_VALUE != posOfItem)
{
MSG_AG_ITEM_UNLOCK_CMD msg;
msg.m_ItemIndex = SI_INVENTORY;
msg.m_ItemPos = m_FLD_USR_INFO.m_PosOfItem;
// (f100528.2L) prevent a locked state
// after an instance dungeon moving transaction failed
msg.post_action_ = msg.eAction_MoveFailed;
pUser->SendToLinkedServer(&msg, sizeof(msg));
pUser->SetLockItemPosForInstanceDungeon(INVALID_POSTYPE_VALUE);
}
switch(m_eState)
{
case USR_PORTAL_OBJECT_CREATED:
case USR_PORTAL_TRANSACTION:
{
WAR_MSG_SINGLE_ASSEMBLER_SSQ_INFO_BRD<
MSGSUB_SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED > assembler;
assembler.Completion();
assembler.SendPacket(pUser);
}
break;
}
}
break;
case USR_ENTERING_SSQ_FIELD:
case USR_ENTERED_SSQ_FIELD:
case USR_CLEAR_INFO:
case USR_LEAVED_SSQ_FIELD:
break;
};
// (WAVERIX) (090421) (BUG-FIX) ChangeState인데, 상태 변경이 안되고 있음.
m_eState = state_info.value;
return TRUE;
}
BOOLEAN
ISSQHandler::IsPreparedReqTransaction()
{
if(USR_REGISTERED_SSQ_INDEXER == m_eState)
{
return !m_Timer.IsExpired();
}
return FALSE;
}
BOOLEAN
ISSQHandler::IsWarpObjectAlived()
{
if(USR_PORTAL_OBJECT_CREATED == m_eState)
{
return !m_Timer.IsExpired();
}
return FALSE;
}
BOOLEAN
ISSQHandler::IsWarpTransaction()
{
if(USR_PORTAL_TRANSACTION == m_eState)
{
return !m_Timer.IsExpired();
}
return FALSE;
}
BOOLEAN
ISSQHandler::Update()
{
switch(m_eState)
{
case USR_NONE_STATE:
return UPDATE_FAIL;
case MONSTER_STATE:
return UPDATE_SUCCESS;
case USR_REGISTERED_SSQ_INDEXER:
{
const BOOLEAN isClosed = !!m_Timer.IsExpired(); //!IsPreparedReqTransaction();
if(isClosed)
{
// Serializing SSQInfo to client
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "USR_REGISTERED_SSQ_INDEXER - closed\n");
);
}
return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS;
}
break;
case USR_PORTAL_OBJECT_CREATED:
{
const BOOLEAN isClosed = !!m_Timer.IsExpired(); // !IsWarpObjectAlived();
if(isClosed)
{
// Serializing SSQInfo to client
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "USR_PORTAL_OBJECT_CREATED - closed\n");
);
}
return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS;
};
break;
case USR_PORTAL_TRANSACTION:
{
const BOOLEAN isClosed = !!m_Timer.IsExpired(); // !IsWarpTransaction();
if(isClosed)
{
// Serializing SSQInfo to client
WAVERIX_DEBUG_CODE(
SUNLOG(eCRITICAL_LOG, "USR_PORTAL_TRANSACTION - closed\n");
);
}
return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS;
};
break;
case USR_ENTERING_SSQ_FIELD:
return UPDATE_SUCCESS; // 시간 제어는 좀더 고민해보자.
case USR_ENTERED_SSQ_FIELD:
return UPDATE_SUCCESS; // 다른 제어가 들어갈 때까지 일단 성공으로 반환하자.
case USR_PORTAL_FAILED:
case USR_LEAVED_SSQ_FIELD:
return UPDATE_FAIL;
case USR_CLEAR_INFO:
break;
default:
ASSERT(!"Invalid Tag");
break;
};
return UPDATE_FAIL;
}
VOID
ISSQHandler::Release() // Update실패시 이 루틴을 먼저 호출해 준다.
{
ChangeStatus(State<USR_PORTAL_FAILED>());
}