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

273 lines
6.6 KiB
C++

#include "stdafx.h"
#include <PacketHandler/PacketHandler.h>
#include <ServerSessions/ServerSessionEx.h>
#include <ServerSessions/ServerSessionManager.h>
LinkedServerSession::LinkedServerSession( UserSession* pUser, DWORD dwServerSessionIndex )
{
LinkUserWithServer( pUser, dwServerSessionIndex );
}
BOOL LinkedServerSession::IsAcceptableUser( UserSession* pUser, BOOL bLogging )
{
if( pUser && (pUser->GetUserType() != UT_TEMP_USER) )
return TRUE;
if( bLogging )
{
MessageOut( eCRITICAL_LOG, _T("[LinkUserWithServer] Try to mapping Invalid User [%u:%s]"),
(pUser ? 1 : 0), (pUser ? _T("TEMP_USER") : _T("")) );
}
return FALSE;
}
BOOL LinkedServerSession::LinkUserWithServer( UserSession* pUser, DWORD dwServerSessionIndex )
{
ServerSessionEx* pServerSession = ServerSessionManager::Instance()->FindServer( dwServerSessionIndex );
return LinkUserWithServer( pUser, pServerSession );
}
BOOL LinkedServerSession::LinkUserWithServer( UserSession* pUser, ServerSessionEx* pServerSession )
{
if( !IsAcceptableUser( pUser, TRUE ) )
return FALSE;
m_pUser = (User*)pUser;
ASSERT( (pServerSession || !"[LinkUserWithServer]") );
if( !pServerSession )
return FALSE;
ASSERT( m_pServerSession != pServerSession );
DWORD dwSessionIndex = pServerSession->GetSessionIndex();
if( !dwSessionIndex )
{
SUNLOG( eCRITICAL_LOG, _T("[User::LinkServer] LinkedServer SessionIndex is Invalid!") );
m_dwSessionIndex = 0;
m_pServerSession = NULL;
return FALSE;
}
m_dwSessionIndex = dwSessionIndex;
m_pServerSession = pServerSession;
return TRUE;
}
BOOL LinkedServerSession::SendToServer( MSG_BASE_FORWARD* pMsg, WORD wSize )
{
if( m_pUser && GetLinkedServer() )
{
pMsg->m_dwKey = m_pUser->GetUserGUID();
SHOW_PACKET_STREAM( pMsg, wSize, "A2G" );
return GetLinkedServer()->Send( (BYTE*)pMsg, wSize );
}
SHOW_PACKET_STREAM( pMsg, wSize, "A2G FAIL!" );
if( m_pUser )
{
BYTE byCategory = pMsg->m_byCategory;
switch( byCategory )
{
case CG_SYNC:
case CG_CONVERSATION:
case CG_TRIGGER:
case CG_BATTLE:
{
//SUNLOG( eCRITICAL_LOG,
// _T("[LinkedServerIsNULL][ID:%u] : Continuous Session Connection [C:P=%03u:%03u]"),
// userOP.GetUserGUID(), pMsg->m_byCategory, pMsg->m_byProtocol );
DEBUG_INTERRUPT();
}
return FALSE;
}
SECURELOG( SECURELOG_USERINFO(m_pUser, eABUSE_LOGIC_VIOLATION, eABUSE_SUB_LOGIC_VIOLATION_UNEXPECTED_PACKET),
_T("[LinkedServerIsNULL][ID:%u] : Unexpected Packet. [C:P=%03u:%03u]"), byCategory, pMsg->m_byProtocol );
SUNLOG( eCRITICAL_LOG, _T("[LinkedServerIsNULL][ID:%u] : Unexpected Packet. [C:P=%03u:%03u]"), byCategory, pMsg->m_byProtocol );
return FALSE;
}
#ifdef _DEBUG
SUNLOG( eCRITICAL_LOG, _T("ASSERTION SYNC VIOLATION: LINKED SESSION") );
#endif
return FALSE;
}
//{__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
PortalUserInfo::~PortalUserInfo()
{
PORTALKEY portalKey;
TryChangeState(eCommand_UserClose, 0, &portalKey);
}
BOOLEAN
PortalUserInfo::IsValidState()
{
if(m_pUser->IsBeginTransaction())
return FALSE;
const eZONE_STATE zoneState = m_pUser->GetZoneState();
const BOOLEAN acceptableState = (ePRS_AT_ZONE & zoneState) &&
(ePRS_AT_CHARSELECT != zoneState ||
ePRS_AT_LOBBY != zoneState);
if(!acceptableState)
return FALSE;
return TRUE;
}
PortalUserInfo::eState
PortalUserInfo::TryChangeState(eCommand command, PORTALKEY portalKey, PORTALKEY* OUT prevPortalKey)
{
if(m_pUser == 0)
return eState_Fail;
assert(prevPortalKey);
eState result = eState_Success;
switch(command)
{
case eCommand_CreatePortal:
if(!IsValidState())
{
*prevPortalKey = m_PortalKey;
m_PortalKey = INVALID_PORTAL_KEY;
return eState_Fail;
}
if(m_PortalKey != INVALID_PORTAL_KEY)
{
*prevPortalKey = m_PortalKey;
result = eState_ChangedPortal;
}
m_PortalKey = portalKey;
return result;
case eCommand_ChangePortal:
if(!IsValidState())
{
*prevPortalKey = m_PortalKey;
m_PortalKey = INVALID_PORTAL_KEY;
return eState_Fail;
}
*prevPortalKey = m_PortalKey;
if(m_PortalKey != INVALID_PORTAL_KEY)
m_PortalKey = portalKey;
else
result = eState_NoRelevant;
return result;
case eCommand_EnterPortal:
if(!IsValidState())
{
m_PortalKey = INVALID_PORTAL_KEY;
return eState_Fail;
}
if(!FlowControl::FCAssert(m_PortalKey == portalKey))
result = eState_Fail;
return result;
case eCommand_ClosePortal:
// Thinking!!
*prevPortalKey = m_PortalKey;
m_PortalKey = INVALID_PORTAL_KEY;
return eState_Success;
case eCommand_GetState:
*prevPortalKey = m_PortalKey;
return eState_Success;
case eCommand_UserClose:
m_PortalKey = INVALID_PORTAL_KEY;
return eState_Success;
}
return eState_Fail;
}
//}__NA1279_1281_090209_TIMELINE_QUEST_BASED_MISSION__
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
namespace nsPacket {
ReAuthInfo::ReAuthInfo()
: m_bUseReAuth(0)
, m_ReAuthKey(0)
, m_pReAuthStream(0)
{
m_Timeout.Disabled();
ZeroMemory(&m_ReAuthSteps, sizeof(m_ReAuthSteps));
}
ReAuthInfo::~ReAuthInfo()
{
if (m_pReAuthStream) {
TAllocDelete(ReAuthTokenStream, m_pReAuthStream);
}
}
void
ReAuthInfo::Clear()
{
if (m_pReAuthStream) {
TAllocDelete(ReAuthTokenStream, m_pReAuthStream);
}
new (this) ReAuthInfo;
}
void
ReAuthInfo::SetReAuthStream(const ReAuthTokenStream* arg)
{
if(m_pReAuthStream == 0)
m_pReAuthStream = TAllocNew(ReAuthTokenStream);
CopyMemory(m_pReAuthStream, arg, sizeof(*m_pReAuthStream));
}
}; //end of namespace
#endif
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
BOOLEAN
ShopUserQuerySlot::QueryStart(const MSG_CG_SHOP_SEND_GIFT_SYN* message)
{
if(FlowControl::FCAssert(message_ == 0))
{
message_ = TAllocNew(MSG_CG_SHOP_SEND_GIFT_SYN);
CopyMemory(message_, message, sizeof(*message_));
message_->m_tszCharName[_countof(message_->m_tszCharName) - 1] = '\0';
//_strupr(message_->m_tszCharName);
transaction_ = true;
return true;
}
return false;
}
void
ShopUserQuerySlot::QueryEnd()
{
// QueryStart를 실패하고 들어올 수 있다는 가정으로 처리한다.
if(message_) {
TAllocDelete(MSG_CG_SHOP_SEND_GIFT_SYN, message_);
message_ = 0;
}
transaction_ = false;
}
#endif
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL