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

168 lines
5.3 KiB
C++

#pragma once
#include <hash_map>
// 채팅방 키 관리용
#include <ObjKeyGenerator.h>
class ChatZone;
class VillageZone;
class User;
class PartyManager;
typedef STLX_HASH_MAP<DWORD, ChatZone*> ZONE_MAP;
typedef ZONE_MAP::iterator ZONE_MAP_ITER;
typedef std::pair<DWORD, ChatZone*> ZONE_MAP_PAIR;
typedef STLX_HASH_MAP<DWORD, VillageZone*> VILLAGE_MAP;
typedef VILLAGE_MAP::iterator VILLAGE_MAP_ITER;
typedef std::pair< DWORD, VillageZone * > VILLAGE_MAP_PAIR;
typedef STLX_HASH_MAP<DWORD, User*> USER_MAP;
typedef USER_MAP::iterator USER_MAP_ITER;
typedef std::pair<DWORD, User*> USER_MAP_PAIR;
class Channel
{
public:
Channel(void);
~Channel(void);
VOID Init();
VOID Release();
VOID Update();
BOOL LoadMap();
BOOL AddShoutLinkedZone( DWORD dwMapCode, ChatZone *pLinkZone );
BOOL AddBattleShoutLinkedZone( DWORD dwMapCode, ChatZone *pLinkZone );
VOID RemoveBattleShoutLinkedZone( ChatZone *pLinkZone );
ChatZone* AddChatZone( eZONETYPE eZoneType, DWORD dwZoneKey, DWORD dwMapCode, ChaosZoneType chaoszone_type );
VOID AddVillage( DWORD dwZoneKey, ChatZone *pVillage );
VOID AddField( DWORD dwZoneKey, ChatZone *pField );
VOID AddDominationField( DWORD dwZoneKey, ChatZone *pField );
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
VOID AddSpaField(DWORD zone_key, ChatZone* field);
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
ChatZone* AddFriendChat( DWORD dwZoneKey );
VOID RemoveChatZone( DWORD dwZoneKey );
VOID RemoveFriendChat( DWORD dwZoneKey );
ChatZone* FindZone( DWORD dwZoneKey );
VillageZone* FindVillage( DWORD dwMapCode );
ChatZone* FindFriendChat( DWORD dwZoneKey );
VOID AddUser( User *pUser, eZONETYPE userStatus, DWORD dwZoneKey );
VOID RemoveUser( User *pUser, BOOL bIterErase = TRUE );
BOOL UserEnterZone( User *pUser, eZONETYPE eZoneType, DWORD dwZoneKey = 0, DWORD dwMapCode = 0, ChaosZoneType chaoszone_type = kChaosZoneTypeNone );
VOID SendToAll( BYTE *pMsg, WORD wSize );
VOID SendToVillages( BYTE *pMsg, WORD wSize );
VOID SendToBattleZones( BYTE *pMsg, WORD wSize );
inline VOID SetChannelID( DWORD dwChannelID ) { m_dwChannelID = dwChannelID; }
inline DWORD GetChannelID() { return m_dwChannelID; }
VOID DisplayInfo();
VOID UserLeavePrevZone( User *pUser );
inline VOID ClearZoneUserNum()
{
for( USHORT i = eZONETYPE_LOBBY; i < eZONETYPE_MAX; i++ )
{
m_dwZoneUserNum[i] = 0;
m_dwZonePCRoomUserNum[i] = 0;
}
}
inline VOID ClearZoneNum()
{
for( USHORT i = eZONETYPE_LOBBY; i < eZONETYPE_MAX; i++ )
{
m_dwZoneNum[i] = 0;
}
}
/*
inline VOID IncZoneUserNum( eZONETYPE eZoneType, DWORD dwPCRoomID )
{
if( dwPCRoomID )
{
m_dwZonePCRoomUserNum[eZoneType]++;
}
else
{
m_dwZoneUserNum[eZoneType]++;
}
}
inline VOID DecZoneUserNum( eZONETYPE eZoneType, DWORD dwPCRoomID )
{
if( dwPCRoomID )
{
if( m_dwZonePCRoomUserNum[eZoneType] > 0 )
{
m_dwZonePCRoomUserNum[eZoneType]--;
}
}
else
{
if( m_dwZoneUserNum[eZoneType] > 0 )
{
m_dwZoneUserNum[eZoneType]--;
}
}
}
*/
inline VOID IncZoneNum( eZONETYPE eZoneType ) { m_dwZoneNum[eZoneType]++; }
inline VOID DecZoneNum( eZONETYPE eZoneType ) { if( m_dwZoneNum[eZoneType] > 0 ) m_dwZoneNum[eZoneType]--; }
inline DWORD GetTotalUserNum() { return (DWORD)m_mapUsers.size(); }
inline DWORD GetZoneUserNum( eZONETYPE eZoneType ) { return m_dwZoneUserNum[eZoneType]; }
inline DWORD GetZonePCRoomUserNum( eZONETYPE eZoneType ) { return m_dwZonePCRoomUserNum[eZoneType]; }
inline DWORD GetZoneCount( eZONETYPE eZoneType ) { return m_dwZoneNum[eZoneType]; }
inline KEYTYPE AllocKey() { return m_ChatRoomKeyGenerator.GetKey(); }
inline VOID FreeKey( KEYTYPE Key ) { m_ChatRoomKeyGenerator.RestoreKey(Key); }
VOID CreateParty( WORD wPartyKey );
BOOL JoinParty( WORD wPartyKey, User* pJoinUser );
BOOL WithdrawParty( User* pWithdrawUser );
VOID DestroyParty( WORD wPartyKey );
VOID RestoreParty( WORD wPartyKey, User *pUser );
#ifdef _NA_004694_20120412_1202_PARTY_ROOM_KEY
VOID SetRoomKey(const WORD party_key, const WORD room_kek);
#endif // _NA_004694_20120412_1202_PARTY_ROOM_KEY
// 유저 숫자 통계 관련...아따 귀찮다...-_-;
VOID RefreshUserNum();
DWORD GetNumerOfNormalUsers() { return m_dwNormalUserNum; }
VOID IncNumberOfNormalUsers() { m_dwNormalUserNum++; }
VOID DecNumberOfNormalUsers() { if( m_dwNormalUserNum > 0 ) m_dwNormalUserNum--; }
DWORD GetNumerOfPCRoomUsers() { return m_dwPCRoomUserNum; }
VOID IncNumberOfPCRoomUsers() { m_dwPCRoomUserNum++; }
VOID DecNumberOfPCRoomUsers() { if( m_dwPCRoomUserNum > 0 ) m_dwPCRoomUserNum--; }
private:
//
ZONE_MAP m_mapZones;
util::CObjKeyGenerator<KEYTYPE> m_ChatRoomKeyGenerator; // 채팅방 키 제조기
ZONE_MAP m_mapFriendChat; // 친구 채팅용
USER_MAP m_mapUsers;
DWORD m_dwChannelID;
DWORD m_dwZonePCRoomUserNum[eZONETYPE_MAX]; // 각 지역의 PC방 유저 넘버
DWORD m_dwZoneUserNum[eZONETYPE_MAX];
DWORD m_dwZoneNum[eZONETYPE_MAX];
DWORD m_dwNormalUserNum; // 접속중인 전체 일반 유저 숫자
DWORD m_dwPCRoomUserNum; // 접속중인 전체 PC방 유저 숫자
PartyManager *m_pPartyManager;
VILLAGE_MAP m_mapVillages; // 마을/필드 지역 임시 저장용 맵
};