Files
Sun1602/Server/WorldServer/User.h
T
2022-10-26 12:25:11 +08:00

530 lines
22 KiB
C++

#pragma once
#include <NetworkObject.h>
#include <string>
// 친구 관리 위해 include
#include <map>
// 암호화 처리 위해 include
#include <CryptManager.h>
#include<ItemOwnFlag.h>
#include <StructInPacket.h>
#include "GroupManager.h"
// <Cryptography>
typedef struct {
ServerSNKey m_SNKey;
CryptManager m_CryptManager;
BYTE GetCryptAlgorithmInfo( BYTE bySNKey, BYTE* cryptInfo, DWORD _dwUserKey )
{ return m_CryptManager.GetCryptAlgorithmInfo( bySNKey, cryptInfo, _dwUserKey ); }
VOID InitCryptInfo( DWORD dwUserKey, BYTE byProtoMajorVer, BYTE byProtoMinorVer ) {
m_SNKey.Initialize( dwUserKey, byProtoMajorVer, byProtoMinorVer );
/*C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO*/
m_CryptManager.Initialize( CryptManager::bServerSession );
};
// About SNKey
VOID NextRoundSNKey4Send() { m_SNKey.NextRoundSNKey4Send(); };
VOID NextRoundSNKey4Recv() { m_SNKey.NextRoundSNKey4Recv(); };
BYTE GetSendSNKey() { return m_SNKey.GetSendSNKey( RandomSNKey::c_dwBaseKey ); };
BYTE GetSendPairSNKey() { return m_SNKey.GetSendSNKey( RandomSNKey::c_dwPairKey ); };
BYTE GetRecvSNKey() { return m_SNKey.GetRecvSNKey( RandomSNKey::c_dwBaseKey ); };
BYTE GetRecvPairSNKey() { return m_SNKey.GetRecvSNKey( RandomSNKey::c_dwPairKey ); };
}STRUCT_CRYPT;
struct STRUCT_FRIEND_INFO;
struct STRUCT_BLOCK_INFO;
struct STRUCT_REVENGE_INFO;
struct STRUCT_GROUP_MEMBER_INFO;
//#define _WHATTHEHELL_CHANGE_FRIENDCHECK_20060802
class User;
//class Party;
class ChatZone;
class CommChatZone;
#ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING
#include "FriendMap.h"
#else
typedef STLX_MAP<DWORD, STRUCT_FRIEND_INFO*> FRIEND_INFO_MAP;
typedef FRIEND_INFO_MAP::iterator FRIEND_INFO_MAP_ITER;
typedef std::pair< DWORD, STRUCT_FRIEND_INFO* > FRIEND_INFO_MAP_PAIR;
#endif
typedef STLX_MAP<DWORD, STRUCT_BLOCK_INFO*> BLOCK_INFO_MAP;
typedef BLOCK_INFO_MAP::iterator BLOCK_INFO_MAP_ITER;
typedef std::pair< DWORD, STRUCT_BLOCK_INFO* > BLOCK_INFO_MAP_PAIR;
typedef STLX_MAP<DWORD, STRUCT_REVENGE_INFO*> REVENGE_INFO_MAP;
typedef REVENGE_INFO_MAP::iterator REVENGE_INFO_MAP_ITER;
typedef std::pair< DWORD, STRUCT_REVENGE_INFO* > REVENGE_INFO_MAP_PAIR;
typedef STLX_MAP<DWORD, User*> FRIEND_ONLINE_MAP;
typedef FRIEND_ONLINE_MAP::iterator FRIEND_ONLINE_MAP_ITER;
typedef std::pair< DWORD, User* > FRIEND_ONLINE_MAP_PAIR;
enum eUSER_TYPE { INVALID_USER, TEMP_USER, ACTIVE_USER };
class BaseZone;
class User : public NetworkObject
{
friend class UserManager;
friend class GroupManager;
enum { WAITING_TICK = 1000 * 100 };
enum { FRIEND_STAT_LOGIN = 0, FRIEND_STAT_LOGOUT = 1, REVENGE_STAT_LOGIN = 2, REVENGE_STAT_LOGOUT = 3, };
#ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING
public:
enum FRIEND_TYPE {FRIEND_NORMAL = 1, FRIEND_INVIATE = 5, FRIEND_BEINVIATED = 6};
#endif
protected:
// 클라이언트와 통신할 때는 반드시 암호화 여부를 체크하는 SendPacket()을 써야 하므로 protected 멤버로 뺐다.
BOOL Send( BYTE *pMsg, WORD wSize ) { return NetworkObject::Send( pMsg, wSize ); }
public:
User();
virtual ~User();
virtual VOID Init();
virtual VOID Release();
virtual VOID Update();
virtual VOID OnRedirect() {}
VOID Logout();
VOID OnEnterZone( BaseZone *pZone );
VOID OnLeaveZone( BaseZone *pZone );
VOID OnEnterSector( BaseZone *pZone );
VOID OnLeaveSector( BaseZone *pZone );
VOID ProcessLogout();
VOID ProcessCharLogout();
inline VOID SetNetworkIndex( DWORD index ) { m_dwNetworkIndex = index; }
inline DWORD GetNetworkIndex() { return m_dwNetworkIndex; }
inline VOID SetGUID( DWORD dwGUID ) { m_dwGUID = dwGUID; }
inline DWORD GetGUID() const { return m_dwGUID; }
inline VOID SetCharGuid( DWORD CharGuid ) { m_CharGuid = CharGuid; }
inline DWORD GetCharGuid() { return m_CharGuid; }
VOID SetAccountID( const TCHAR* ptszAccountID );
inline TCHAR * GetAccountID() { return m_ptszAccountID; }
inline VOID SetCharName( std::string charName ) { m_strCharName = charName; }
inline std::string& GetCharName() { return m_strCharName; }
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
VOID SetBattleGroundFalseName(TCHAR* _false_name);
inline TCHAR* GetBattleGroundFalseName() {return battleground_false_name;}
VOID ClearBattleGroundFalseName();
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
// CHANGES: f110524.2L, fixed invalid freed problem to pool
virtual eUSER_TYPE GetUserType() const = 0;
inline VOID StartTimeCheck() { m_dwTimeoutTick = GetTickCount() + WAITING_TICK; }
inline BOOL IsTimeout()
{
return GetTickCount() > m_dwTimeoutTick;
}
inline VOID SetAuthIP( const char *pszIP ) { strncpy(m_szAuthIP, pszIP, _countof(m_szAuthIP)); m_szAuthIP[_countof(m_szAuthIP) - 1] = '\0'; }
inline char* GetAuthIP() { return m_szAuthIP; }
inline VOID SetAuthID( DWORD dwAuthID ) { m_dwAuthID = dwAuthID; }
inline DWORD GetAuthID() { return m_dwAuthID; }
inline VOID SetChannelID( DWORD channelID ) { m_dwChannelID = channelID; }
inline DWORD GetChannelID() { return m_dwChannelID; }
inline VOID SetZoneKey( DWORD dwZoneKey ) { m_dwZoneKey = dwZoneKey; }
inline DWORD GetZoneKey() { return m_dwZoneKey; }
inline VOID SetStatus( eZONETYPE status ) { m_status = status; }
inline eZONETYPE GetStatus() const { return m_status; }
inline VOID SetWhisper(BOOL bWhisper) { m_bWhisper = bWhisper; } // 귓말 받을 것인지 세트. 기본 값은 TRUE(허용)
inline BOOL CanWhisper() { return m_bWhisper; } // 귓말 받는 상태인지(TRUE), 아닌지(FALSE)
void OnLogString(char *pszLog); // 상속
inline BaseZone* GetNormalChatZone() { return m_pNormalChatZone; }
inline VOID SetNormalChatZone( BaseZone *pZone ) { m_pNormalChatZone = pZone; }
VOID SendNormalChat( BYTE *pMsg, WORD nSize );
VOID SendNomalChatToAll( BYTE *pMsg, WORD wSize );
inline VOID SetMapCode(MAPCODE wMapCode) { m_MapCode = wMapCode; }
inline MAPCODE GetMapCode() { return m_MapCode; }
inline VOID SetFieldCode(DWORD dwFieldCode) { m_dwFieldCode = dwFieldCode; }
inline DWORD GetFieldCode() { return m_dwFieldCode; }
inline VOID SetSectorIndex(int dwSectorIndex) { m_nSectorIndex = dwSectorIndex; }
inline int GetSectorIndex() { return m_nSectorIndex; }
VOID SendWorldChatToAll(BYTE *pMsg, WORD wSize, BOOL bNow = TRUE);
// 친구 정보 관리
BOOL CheckFriendList();
VOID InitFriendListInit();
#ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING
FriendMap* GetFriendMap(FRIEND_TYPE type = FRIEND_NORMAL);
#else
inline BYTE GetFriendNum() { return (BYTE)m_mapFriend.size(); }
STRUCT_FRIEND_INFO* GetFirstFriend();
STRUCT_FRIEND_INFO* GetNextFriend();
BOOL AddFriendInfo( STRUCT_FRIEND_INFO* pFriend );
STRUCT_FRIEND_INFO* FindFriend( DWORD dwCharGuid );
STRUCT_FRIEND_INFO* FindFriend( TCHAR* ptszFriendName );
VOID RemoveFriend( DWORD dwGuid );
#endif
inline BOOL GetFriendChatBlock() { return m_bFriendChatBlock; }
inline VOID SetFriendChatBlock(BOOL bBlock) { m_bFriendChatBlock = bBlock; }
// 친구 관련
VOID AddOnlineFriend( User *pUser, BOOL bLoggedIn = TRUE );
VOID RemoveOnlineFriend( User *pUser );
User* FindOnlineFriend( DWORD CharGuid );
VOID AlarmFriendStatChange( int nFlag, User *pUser );
inline VOID SetFriendTransaction( BOOL bTrans ) { m_bFriendTrans = bTrans; }
inline BOOL IsFriendTransaction() { return m_bFriendTrans; }
//_NA_0_20100527_ADD_CHAR_RELATION_MEMO
RC::eFRIEND_RESULT CheckConditionAccessFriendInfo(CHARGUID friendguid);
// implemented by __KR_001355_20090608_GROUPINGSYSTEM_DATA = {
//유저 DB작업 트랜젝션
inline BOOL IsGroupTransaction() { return m_bGroupTrans; }
//트랜젝션 세팅
inline VOID SetGroupTransaction( BOOL bTrans ) { m_bGroupTrans = bTrans; }
BYTE GetGroupMemberCount();
//해당 케릭터 클레스 세팅
inline VOID SetCharClass( BYTE charClass ){ m_CharClass = charClass; }
//해당 케릭터 클레스 가져오기
inline BYTE GetCharClass( ){ return m_CharClass; }
//최근에 받은 보너스 하임세팅
inline VOID SetCurBonusMoney( MONEY curBonusMoney ){ m_curBonusMoney = curBonusMoney; }
//최근에 받은 보너스 하임 얻기
inline MONEY GetCurBonusMoney(){ return m_curBonusMoney; }
//최근에 받은 보너스 경험치 세팅
inline VOID SetCurBonusEXP( EXPTYPE curBonusEXP ){ m_curBonusEXP = curBonusEXP; }
//최근에 받은 보너스 경험치 얻기
inline EXPTYPE GetCurBonusEXP(){ return m_curBonusEXP; }
//맴버 추가 거부 토글 세팅
inline VOID SetAddBlock( BOOL bAddBlock ) { m_bAddBlock = bAddBlock; }
//맴버 추가 거부 토글 정보 가져오기
inline BOOL GetAddBlockInfo() { return m_bAddBlock; }
//축적 저장 경험치 세팅
inline VOID SetCurAccumEXP( EXPTYPE curAccumEXP ) { m_curAccumEXP = curAccumEXP; }
//축적 저장 경험치 가져오기 최대 축적 경험치는 500만이다.
inline EXPTYPE GetCurAccumEXP( ) { return ( m_curAccumEXP > MAX_GROUP_EXP)?
MAX_GROUP_EXP : m_curAccumEXP; }
inline VOID AddCurAccumEXP( EXPTYPE curAccumEXP ) { m_curAccumEXP += curAccumEXP; }
//그룹 리스트를 요청한적 있나?
BOOL CheckGroupList();
VOID InitGroupInfo();
//임시 맴버 정보 저장소에 해당하는 유저 정보 세팅
VOID SetStructMemberInfo( User* pUser, eGROUP_STAT eMemberStat );
//임시 멤버 정보 저장소 가져오기
inline STRUCT_GROUP_MEMBER_INFO* GetStructMemberInfo() { return &m_tempMemberInfo; }
#ifdef _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
inline VOID SetCharGender( BYTE gender ){ gender_ = gender; }
//해당 케릭터 클레스 가져오기
inline BYTE GetCharGender( ){ return gender_; }
#endif // _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
// }; end of '__KR_001355_20090608_GROUPINGSYSTEM_DATA'
VOID SendOnlineFriendAll( BYTE* pMsg, WORD wSize );
// 리벤지 정보 관리
inline BYTE GetRevengeNum() { return (BYTE)m_mapRevenge.size(); }
STRUCT_REVENGE_INFO* GetFirstRevenge();
STRUCT_REVENGE_INFO* GetNextRevenge();
BOOL AddRevengeInfo( STRUCT_REVENGE_INFO* pRevenge );
STRUCT_REVENGE_INFO* FindRevenge( DWORD dwCharGuid );
STRUCT_REVENGE_INFO* FindRevenge( TCHAR* ptszRevengeName );
VOID RemoveRevenge( DWORD dwGuid );
// 리벤지 리스트 관련
inline VOID SetRevengePoint( BYTE byPoint ) { m_byRevengePoint = byPoint; }
inline BYTE GetRevengePoint() { return m_byRevengePoint; }
inline VOID IncRevengePoint() { if( m_byRevengePoint == UCHAR_MAX ) m_byRevengePoint++; }
inline BOOL DecRevengePoint() { if( m_byRevengePoint == 0 ) return FALSE; m_byRevengePoint--; return TRUE; }
VOID AddOnlineRevenge( User *pUser, BOOL bLoggedIn = TRUE );
VOID RemoveOnlineRevenge( User *pUser );
User* FindOnlineRevenge( DWORD CharGuid );
VOID AlarmRevengeStatChange( int nFlag, User *pUser );
// inline VOID SetRevengeTransaction( BOOL bTrans ) { m_bRevengeTrans = bTrans; }
// inline BOOL IsRevengeTransaction() { return m_bRevengeTrans; }
VOID SendOnlineRevengeAll( BYTE* pMsg, WORD wSize );
inline VOID SetOnlineLevel( LEVELTYPE &CharLevel )
{
m_OnlineLevel = CharLevel;
}
inline VOID CheckOnlineLevel( LEVELTYPE &CharLevel )
{
if( m_OnlineLevel != 0 && CharLevel != m_OnlineLevel )
{
CharLevel = m_OnlineLevel;
}
}
// 차단 정보 관리
inline BYTE GetBlockNum() { return (BYTE)m_mapBlock.size(); }
STRUCT_BLOCK_INFO* GetFirstBlock();
STRUCT_BLOCK_INFO* GetNextBlock();
BOOL AddBlockInfo( STRUCT_BLOCK_INFO* pBlock );
STRUCT_BLOCK_INFO* FindBlock( DWORD dwGuid );
STRUCT_BLOCK_INFO* FindBlock( TCHAR* ptszBlockName );
VOID RemoveBlock( DWORD dwGuid );
VOID RemoveBlock( TCHAR* ptszBlockedName );
// 길드 정보 관리
// inline BOOL CheckGuildList() { return m_bGuildList; }
BOOL CheckGuildList();
inline VOID SetGuildList( BOOL bGuildList = TRUE ) { m_bGuildList = bGuildList; }
inline VOID SetGuildGuid( GUILDGUID GuildGuid ) { m_GuildGuid = GuildGuid; }
inline GUILDGUID GetGuildGuid() { return m_GuildGuid; }
// GM정보 관리
inline VOID SetGMGrade(BYTE byGMGrade) { m_byGMGrade = byGMGrade; }
inline BYTE GetGMGrade() { return m_byGMGrade; }
//{__CN_000001_20090513_ADD_FRIEND_CHECK_GM
inline BOOL IsGM() const { return (m_byGMGrade > eGM_GRADE_BASE) && (m_byGMGrade < eGM_GRADE_MAX); }
INT CopyBlockInfo( STRUCT_BLOCK_INFO* pDstBlockInfo, const int size );
INT CopyFriendInfo( STRUCT_FRIEND_INFO* pDstFriendInfo, const int size );
INT CopyRevengeInfo( STRUCT_REVENGE_INFO* pDstRevengeInfo, const int size );
// 삭제 _NA_0_20100527_ADD_CHAR_RELATION_MEMO
INT CopyRevengeInfo( STRUCT_REVENGE_PACKET_INFO* pDstRevengeInfo, const int size );
//}
BOOL CheckChatTime();
// 파티 관련
inline VOID JoinParty( CommChatZone *pParty ) { m_pParty = pParty; }
inline VOID RemoveParty() { m_pParty = NULL; }
inline CommChatZone* GetParty() { return m_pParty; }
VOID SendParty( BYTE* pMsg, WORD wSize );
// 음성채팅
inline DWORD GetVoiceChatRequestGUID() { return m_dwRequestGUID; }
inline VOID RequestVoiceChat(DWORD dwGUID) { m_dwRequestGUID = dwGUID; }
inline VOID ClearVoiceChatRequest() { m_dwRequestGUID = 0; }
inline BOOL IsVoiceChatOn() { return m_bVoiceOn; }
inline VOID SetVoiceChat( BOOL bOn ) { m_bVoiceOn = bOn; }
// PC방 정보
inline DWORD GetPCRoomID() { return m_dwPCRoomID; }
VOID SetPCRoomID( DWORD dwPCRoomID ) { m_dwPCRoomID = dwPCRoomID; }
//!~ _NA_006413_20130201_PREMIUMSERVICE_ITEM
bool CanApplyPCBangBenefit();
void SetPremiumService(DWORD premiumservice);
DWORD GetPremiumService();
//~! _NA_006413_20130201_PREMIUMSERVICE_ITEM
// 채팅금지 정보
inline BOOL IsChatBlocked() { return m_bChatBlock; }
VOID SetChatBlock( DWORD dwTime );
VOID FreeChatBlock();
inline DWORD GetBlockTime() { return m_dwBlockTime; }
//__NA_000313_20070223_REALTIME_CHAT_BLOCK
BOOL UpdateBlockTime();
// 채널채팅 정보
inline CommChatZone* GetChannelChatRoom() { return m_pChannelChatRoom; }
inline VOID JoinChannelChatRoom( CommChatZone *pZone ) { m_pChannelChatRoom = pZone; }
inline VOID OutChannelChatRoom() { m_pChannelChatRoom = NULL; }
BOOL SendChannelChat( BYTE* pMsg, WORD wSize );
BOOL CheckMemoList();
inline VOID SetMemoTransaction( BOOL bTrans ) { m_bMemoTrans = bTrans; }
inline BOOL IsMemoTransaction() { return m_bMemoTrans; }
ItemOwnFlag& GetItemOwnFlag(){ return m_ItemOwnFlag; }
VOID SendChatBlock();
VOID SendChatBlock(RC::eCHAT_RESULT result);
inline VOID SetCharLevel(LEVELTYPE Level){ m_CharLevel = Level;}
inline LEVELTYPE GetCharLevel(){ return m_CharLevel; }
//__NA_000313_20070223_REALTIME_CHAT_BLOCK
VOID SendUseDecreeItem();
inline VOID SetTmpDecreeMsg(TCHAR* ptszMsg){ _tcsncpy(m_tszTmpDecreeMsg, ptszMsg, sizeof(TCHAR) * MAX_SHOUT_LEN); }
inline TCHAR* GetTmpDecreeMsg(){ return m_tszTmpDecreeMsg; }
BOOL SetInterceptionOption(eINTERCEPTION_TYPE eCode, BOOL bFlag);
protected:
virtual VOID OnAccept( DWORD dwNetworkIndex );
virtual VOID OnDisconnect();
virtual VOID OnRecv( BYTE *pMsg, WORD wSize );
// <Cryptography>
// Cryptography & Sequence Number
public:
BOOL GetCryptography() { return m_bUseCryptography; }
BOOL SetCryptography( BOOL bInited ) { return m_sCrypt.m_CryptManager.StartLogic( m_bUseCryptography = bInited ); }
VOID NextRoundSNKey4Send() { m_sCryptBack.NextRoundSNKey4Send(); };
// Cryptography
BOOL SendPacket( BYTE *pMsg, WORD wSize );
BYTE InitCrypt( BYTE byProtoMajorVer, BYTE byProtoMinorVer )
{
m_sCryptBack.InitCryptInfo( GetGUID(), byProtoMajorVer, byProtoMinorVer );
return m_sCryptBack.GetSendSNKey();
};
BYTE GetCryptAlgorithmInfo( BYTE *pCryptInfo )
{
return m_sCryptBack.GetCryptAlgorithmInfo( m_sCryptBack.GetSendPairSNKey(), pCryptInfo, GetGUID() );
}
inline VOID SetCrypt() { m_sCrypt = m_sCryptBack; SetCryptography(TRUE); m_bCrypting = FALSE; }
inline BOOL IsCrypting() { return m_bCrypting; }
inline DWORD ISCryptTimeOut( DWORD dwNowTime ) { __UNUSED(dwNowTime); return FALSE; } //return dwNowTime > m_dwCryptTime; }
inline VOID SetCryptTime( DWORD dwTime ) { m_bCrypting = TRUE; m_dwCryptTime = dwTime + 100000; }
inline VOID EndCrypt() { m_bCrypting = FALSE; }
inline VOID CopyCrypt( const STRUCT_CRYPT &sCrypt ) { m_sCrypt.m_CryptManager.Release(); m_sCryptBack = sCrypt; }
VOID SetChatTimer( DWORD dwTimer ){ m_ChatTimer.SetTimer( dwTimer ); }
BOOL IsExpiredChatTimer(){ return m_ChatTimer.IsExpired(); }
char* GetLastChatMsg(){ return m_szLastChatMsg; }
VOID SetLastChatMsg( const char* szMsg );
protected:
BOOL Encrypt( BYTE* IN OUT pEncryptMsg, const int size, BYTE& OUT crc )
{ return m_sCrypt.m_CryptManager.Encrypt( pEncryptMsg, size, crc ); }
BOOL Decrypt( BYTE* IN OUT pEncryptMsg, const int size, BYTE IN crc )
{ return m_sCrypt.m_CryptManager.Decrypt( pEncryptMsg, size, crc ); }
protected:
STRUCT_CRYPT m_sCrypt; // ACK 떨어지면 세팅
STRUCT_CRYPT m_sCryptBack; // CMD 보낼 때 세팅
BOOL m_bUseCryptography; // FALSE로 설정할 것
BOOL m_bCrypting; // 암호화 키 변경 중인가?
DWORD m_dwCryptTime; // 암호화 결정한 시각(KEY 보낸 시각)
private:
BOOL m_bLogoutProcessed;
eUSER_TYPE m_userType;
DWORD m_dwNetworkIndex;
DWORD m_dwGUID;
DWORD m_CharGuid;
std::string m_strCharName;
DWORD m_dwTimeoutTick;
TCHAR m_ptszAccountID[ID_MAX_LEN+1]; // 계정 ID
char m_szAuthIP[MAX_IP_STRING_LEN + 1];
DWORD m_dwChannelID;
DWORD m_dwZoneKey;
eZONETYPE m_status;
DWORD m_dwAuthID;
//귓말 켬/끔 상태
BOOL m_bWhisper; // TRUE면 귓말 켬, FALSE면 귓말 끔
MAPCODE m_MapCode;
DWORD m_dwFieldCode; // 현재 속해 있는 필드 코드
DWORD m_nSectorIndex; // 현재 속해 있는 섹터 인덱스
BaseZone *m_pNormalChatZone;
#ifdef _NA_0_20091104_FIRENDMAP_REFACTORYING
FriendMap m_mapFriend;
// used by _KR_0_20091021_FIRENDINVITATION_EXTEND = {
FriendMap m_mapInvitateFriend;
FriendMap m_mapBeInvitatedFriend;
// }
#else
// 친구 정보 관리
FRIEND_INFO_MAP m_mapFriend; // 친구 관리용 맵
FRIEND_INFO_MAP_ITER m_iterNowFriend; // GetFirst...(), GetNext...() 에서 사용.
#endif
BOOL m_bFriendChatBlock; // 친구 채팅 차단 여부(0: 허용 1: 거부)
BOOL m_bFriendTrans; // 친구 관련 DB 작업중인가?(0: 아니오 1: 예)
LEVELTYPE m_OnlineLevel; // 접속 중 레벨업 했을 때 친구 정보에 갱신 안 되는 문제 해결용(레벨업 없으면 0)
#ifndef _WHATTHEHELL_CHANGE_FRIENDCHECK_20060802
BOOL m_bFriendList; // 친구 리스트 받았었나?(TRUE: 받았음, FALSE: 안 받았음)
#else
DWORD m_dwLastFriendTick; // 마지막으로 친구 리스트 요청한 시각 - 확인 필수
#endif
FRIEND_ONLINE_MAP m_mapOnlineFriend; // 온라인 친구 관리용 맵
// 차단 정보 관리
BLOCK_INFO_MAP m_mapBlock; // 차단 관리용 맵
BLOCK_INFO_MAP_ITER m_iterNowBlock; // GetFirst...(), GetNext...() 에서 사용.
//리벤지 정보 관리
REVENGE_INFO_MAP m_mapRevenge; // 빚 받아야 할 유저들 관리용 맵
REVENGE_INFO_MAP_ITER m_iterNowRevenge; // GetFirst...(), GetNext...() 에서 사용.
BYTE m_byRevengePoint; // 리벤지 포인트
FRIEND_ONLINE_MAP m_mapOnlineRevenge; // 온라인인 빚쟁이들 관리용 맵
// 길드 관련
BOOL m_bGuildList; // 길드 리스트 받았었나?(TRUE:받았음, FALSE: 안 받았음)
GUILDGUID m_GuildGuid; // 소속 길드 guid
DWORD m_dwLastGuildTick; // 마지막으로 길드 리스트 요청한 시각
// 어뷰즈 체크
BYTE m_byChatCount; // 일정 시간 안에 채팅을 몇 번 날렸냐?
DWORD m_dwLastChatTime; // 마지막으로 채팅 날린 시각
// GM Check
BYTE m_byGMGrade; // GM맞냐?
// 파티 관련
CommChatZone* m_pParty;
// 음성채팅 정보
DWORD m_dwRequestGUID; // 채팅을 요청한 상대의 GUID
BOOL m_bVoiceOn; // 음성 채팅 허용 여부(TRUE: 허용 FALSE: 금지)
// PC방 사용자 정보
DWORD m_dwPCRoomID; // 0이면 일반 사용자. 1 이상이면 PC방 ID
DWORD m_dwPremiumService; // _NA_006413_20130201_PREMIUMSERVICE_ITEM
// 채팅금지 여부
BOOL m_bChatBlock; // 채팅금지 여부(TRUE: 금지 FALSE: 허용)
DWORD m_dwBlockTime; // 채팅금지 남은 시간(ms 단위 - DB 저장할 때나 요청 받을 때는 분단위이므로 주의)
DWORD m_dwBlockLastTime; // 시간 차감의 기준 시각
//__NA_000313_20070223_REALTIME_CHAT_BLOCK
DWORD m_dwLastShoutTime; // 마지막 외친 시각
// 채널 채팅 정보
CommChatZone* m_pChannelChatRoom; // 현재 들어가 있는 채널 채팅방(NULL이면 없음)
DWORD m_dwLastMemoTick; // 쪽지 목록 마지막으로 요청한 시각
BOOL m_bMemoTrans; // 메모 트랜잭션중
ItemOwnFlag m_ItemOwnFlag;
LEVELTYPE m_CharLevel;
util::Timer m_ChatTimer;
char m_szLastChatMsg[MAX_CHATMSG_SIZE+1];
TCHAR m_tszTmpDecreeMsg[MAX_SHOUT_LEN + 1];
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
TCHAR battleground_false_name[MAX_CHARNAME_LENGTH+1];
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
//그룹 시스템 정보 __KR_001355_20090608_GROUPINGSYSTEM_DATA = {
private :
eGROUP_STAT m_eHighMember; //상위 맴버의 상태
eGROUP_STAT m_eLowMember; //하위 맴버의 상태
GROUP_MEMBER_MAP m_GroupMemberMap; //그룹원 Map
GROUP_MEMBER_MAP_ITER m_curGroupMemberiter; //그룹 맴버를 가리키는 iter
STRUCT_GROUP_MEMBER_INFO m_tempMemberInfo; //맴버 정보를 임시로 저장하는 변수
BYTE m_CharClass; //해당 케릭터 클레스(직업)
BOOL m_bGroupTrans; //DB작업 트렌 젝션 용
BOOL m_bAddBlock; //현재 그룹 맴버 추가 토글이 켜있는가?
MONEY m_curBonusMoney; //가장 최근에 받은 보너스 Money
EXPTYPE m_curBonusEXP; //가장 최근에 받은 보너스 EXP
EXPTYPE m_curAccumEXP; //최근에 받은 보너스 AccumEXP
#ifdef _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
BYTE gender_; //해당 캐릭터의 성별
#endif // _NA_006642_20120416_COMMUNITY_INFO_BUG_MODIFY
// }; end of '__KR_001355_20090608_GROUPINGSYSTEM_DATA'
};