Files
Sun1602/Server/AgentServer/UserSessions/UserInfo.Structures.h
T
2022-10-26 12:25:11 +08:00

280 lines
7.5 KiB
C++

#pragma once
#include "UserInfo.Constants.h"
//////////////////////////////////////////////////////////////////////////
// <User에 연결된 LinkedServer 관리>
class ServerSessionEx;
class UserSession;
class User;
class LinkedServerSession
{
private:
User* m_pUser;
ServerSessionEx* m_pServerSession;
DWORD m_dwSessionIndex;
//ITimeout m_Timeout;
public:
LinkedServerSession() : m_pUser(NULL), m_pServerSession(NULL), m_dwSessionIndex(0) {}
LinkedServerSession(UserSession* pUser, DWORD dwServerSessionIndex);
inline User* GetLinkedUser() const { return m_pUser; }
inline ServerSessionEx* GetLinkedServer() const { return m_pServerSession; }
inline DWORD GetLinkedServerSessionIndex() const { return m_dwSessionIndex; }
// <SESSION CONTROL>
BOOL LinkUserWithServer(UserSession* pUser, DWORD dwServerSessionIndex);
BOOL LinkUserWithServer(UserSession* pUser, ServerSessionEx* pServerSession);
inline void UnLinkServer() { m_pUser = NULL; m_pServerSession = NULL; m_dwSessionIndex = 0; }
//
BOOL SendToServer(MSG_BASE_FORWARD* pMsg, WORD wSize);
private:
BOOL IsAcceptableUser(UserSession* pUser, BOOL bLogging = FALSE);
};
struct ClosingUserTransInfo
{
bool is_transaction_;
MAPCODE map_code_;
FIELDCODE field_code_;
WzVector user_pos_;
};
class ClosingUserTransController
{
public:
ClosingUserTransController(ClosingUserTransInfo& trans_info)
: closing_user_trans_info_(trans_info)
{
}
inline void Init()
{
closing_user_trans_info_.is_transaction_ = FALSE;
}
inline void EndTransaction()
{
Init();
}
inline bool SetClosingUserTransaction(MAPCODE map_code,
FIELDCODE field_code,
const WzVector& user_pos)
{
bool is_success = true;
is_success = is_success && !!(closing_user_trans_info_.map_code_ = map_code);
is_success = is_success && !!(closing_user_trans_info_.field_code_ = field_code);
closing_user_trans_info_.user_pos_ = user_pos;
return closing_user_trans_info_.is_transaction_ = is_success;
}
inline bool IsTransaction() const
{
return closing_user_trans_info_.is_transaction_;
}
inline MAPCODE GetMapCode() const
{
return closing_user_trans_info_.map_code_;
}
inline FIELDCODE GetFieldCode() const
{
return closing_user_trans_info_.field_code_;
}
inline WzVector& GetRandomPos() const
{
return closing_user_trans_info_.user_pos_;
}
private:
ClosingUserTransInfo& closing_user_trans_info_;
ClosingUserTransController();
__DISABLE_COPY(ClosingUserTransController);
};
struct PartyReturnInfo
{
WzVector ReturnPos;
FIELDCODE ReturnFieldCode;
eZONETYPE ReturnZoneType;
KEYTYPE ReturnZoneKey;
void Init()
{
ReturnPos.x = 0;
ReturnPos.y = 0;
ReturnPos.z = 0;
ReturnFieldCode = 0;
ReturnZoneType = eZONETYPE_MAX;
ReturnZoneKey = 0;
}
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <ISSQHandlerD>
// - SSQ Handler for User
// - 특정 캐릭터에 대해서 SSQ 처리를 담당하는 처리 Proxy.
// <Usage>
// - ISSQHandlerD& rSSQH;
// - if(rSSQH.IsAvailable())
// - rSSQH->(HandlerInterface)();
class User;
class ISSQHandler;
class ISSQHandlerD
{
public:
ISSQHandlerD() : m_pUser(0), m_pISSQHandler(0) {}
ISSQHandlerD(const ISSQHandlerD& ref) : m_pUser(ref.m_pUser), m_pISSQHandler(ref.m_pISSQHandler) {}
ISSQHandlerD(User* const pUser, ISSQHandler* const pHandler) : m_pUser(pUser), m_pISSQHandler(pHandler) {}
~ISSQHandlerD() { m_pUser = 0; m_pISSQHandler = 0; }
inline BOOLEAN IsAvailable() const { return m_pUser && m_pISSQHandler; }
inline User* GetUser() const { return m_pUser; }
inline ISSQHandler* GetHandler() const { return m_pISSQHandler; }
inline ISSQHandler* const operator->() { return m_pISSQHandler; }
private:
User* m_pUser;
ISSQHandler* m_pISSQHandler;
};
class PortalUserInfo
{
public:
enum eCommand {
eCommand_CreatePortal,
eCommand_ChangePortal,
eCommand_EnterPortal,
eCommand_ClosePortal,
eCommand_GetState,
eCommand_UserClose,
};
enum eState {
eState_Success,
// 세부 예외 처리 제어는 차후에 하기로 하고 일단 실패로만 처리해보자.
eState_ChangedPortal,
eState_Transaction,
eState_NoRelevant, // 포탈 생성 이후 파티 변화시 해당 사항 없는 경우
//eState_DifferentZone,
//eState_TooLong,...이것은 처리할지 여부 확인 필요
//eState_DisabledAction, // for disconnect
//eState_NotFoundPortal, // for in close process
eState_Fail, // User == 0
};
PortalUserInfo()
: m_pUser(0)
, m_PortalKey(INVALID_PORTAL_KEY)
, m_State(eState_Fail)
{}
~PortalUserInfo();
inline void SetUser(User* pUser)
{
m_pUser = pUser;
m_PortalKey = INVALID_PORTAL_KEY;
m_State = eState_Fail;
}
inline PORTALKEY GetPortalKey() const { return m_PortalKey; }
BOOLEAN IsValidState();
eState TryChangeState(eCommand command, PORTALKEY portalKey, PORTALKEY* OUT prevPortalKey);
private:
User* m_pUser;
PORTALKEY m_PortalKey;
eState m_State;
};
#ifdef __NA001334_090420_SERVER_SELECT_FACILITY__
namespace nsPacket {
struct ReAuthInfo : public ReAuthInfoBase
{
public:
enum eReAuthSlot {
eReAuthSlot_AuthServerSide,
eReAuthSlot_GameServerSide,
eReAuthSlot_Count, // upperbound
eReAuthSlot_AllSide, // special command for User Control
};
typedef eReAuthStep ReAuthStepSlot[eReAuthSlot_Count];
ReAuthInfo();
~ReAuthInfo();
void Clear();
inline ReAuthKeyType GetReAuthKey() const { return m_ReAuthKey; }
inline BOOLEAN IsExpired() { return m_Timeout.IsExpired(); };
inline const ReAuthStepSlot& CurrentStep() const { return m_ReAuthSteps; }
inline const ReAuthTokenStream* GetReAuthStream() const { return m_pReAuthStream; }
private:
//inline BOOLEAN ChangeStep(eReAuthSlot where, eReAuthStep step);
void SetReAuthStream(const ReAuthTokenStream* arg);
BOOLEAN m_bUseReAuth;
ReAuthKeyType m_ReAuthKey;
ITimeout m_Timeout;
ReAuthStepSlot m_ReAuthSteps; // Client가 서버 처리보다 먼저 이뤄지는 상황 지연 처리 목적
ReAuthTokenStream* m_pReAuthStream;
friend class User;
};
//inline BOOLEAN
//ReAuthInfo::ChangeStep(eReAuthSlot where, eReAuthStep step)
//{
// BOOLEAN bAccept = where < eReAuthSlot_Count;
// if(bAccept == false)
// return false;
//
// bAccept = step < eReAuthStep_Count;
// if(bAccept == false)
// return false;
//
// m_ReAuthSteps[where] = step;
// return true;
//}
}; //end of namespace
#endif
#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL
#ifdef __NA000000_SHOP_USERID_50_PASSING_PROC__
struct MSG_CG_SHOP_SEND_GIFT_SYN;
class ShopUserQuerySlot
{
public:
ShopUserQuerySlot()
: transaction_(0)
, message_(0)
{}
~ShopUserQuerySlot() { assert(message_ == 0); }
BOOLEAN QueryStart(const MSG_CG_SHOP_SEND_GIFT_SYN* message);
BOOLEAN IsTransaction() const { return transaction_; }
const MSG_CG_SHOP_SEND_GIFT_SYN* GetMessage() { return message_; }
void QueryEnd();
private:
BOOLEAN transaction_;
MSG_CG_SHOP_SEND_GIFT_SYN* message_;
};
#endif
#endif //#if !defined _NA_0_20110613_GAME_SHOP_RENEWAL