Files
Leviathan/Server/GameServer/Game/DaemonProc/BattleArena.h
T
2026-06-01 12:46:52 +02:00

57 lines
2.5 KiB
C++

#pragma once
#include "BattleArenaInstance.h"
class BattleArena
{
public:
BattleArena( const BattleArenaBaseServer* pArenaBase, ThreadSafeIntMap* pPartyToArenaMap );
virtual ~BattleArena();
ArcadiaLock LockWholeArena( unsigned short nLayer = -1 ) const;
// { csArena를 걸고 호출해야 하는 함수들
unsigned char _allocNewInstanceNo();
void _freeInstanceNo( unsigned char nInstanceNo );
bool _isOccupiedInstanceNo( unsigned char nInstanceNo ) const;
bool _isFull() const;
virtual unsigned short _joinWaitQueue( StructPlayer* pPlayer, _BATTLE_GRADE eGrade ) = 0;
virtual unsigned short _leaveWaitQueue( StructPlayer* pPlayer, _ARENA_LEAVE_TYPE eLeaveType ) = 0;
virtual unsigned short _leaveWaitQueue( PlayerUID nPlayerUID, _ARENA_LEAVE_TYPE eLeaveType ) = 0;
virtual unsigned char _tryStartNewBattle() = 0;
virtual unsigned short _createNewBattle( _BATTLE_GRADE eGrade, unsigned char nNewInstanceNo ) = 0;
BattleArenaInstance* _getBattleInstance( unsigned char nInstanceNo );
const BattleArenaInstance* _getBattleInstance( unsigned char nInstanceNo ) const;
// } csArena를 걸고 호출해야 하는 함수들
public:
const BattleArenaBaseServer* m_pArenaBase;
ThreadSafeIntMap* m_pPartyToArenaMap;
ThreadSafeIntMap m_partyToInstanceMap;
// BattleArena의 멤버를 보호하기 위한 락(지역 락 -> csArena -> csBattle -> PartyManager::m_IntfLock)
mutable XCriticalSection m_csArena;
// { 런타임에 수시로 변경되는 것들 - 접근 시 csArena를 걸어야 함
// ( 배열 인덱스 )에 해당하는 방 번호의 사용 여부(0번 방 번호는 사용하지 않으므로 0번 인덱스도 사용 안 함)
bool m_aInstanceNoUseFlag[ MAX_BATTLE_ARENA_INSTANCE_NO_PER_ARENA + 1 ];
// aInstanceNoUseFlag 안에서 가장 작은(인덱스가 1에 가까운) 비어있는 슬롯 인덱스(새 방 번호를 발급할 때는 nLeastFreeInstanceSlot을 바로 지급함)
unsigned char m_nLeastFreeInstanceSlot;
// 활성화 상태의 방 목록을 빠르게 순회할 수 있도록 별도로 InstanceNo 보관
std::vector< unsigned char > m_vActiveLayerList;
// 인스턴스 리스트(방 번호 - 1 번 배열 요소에 인스턴스 포인터가 있음)
// * 한 번 할당된 BattleArenaInstance는 경기 종료 시에도 삭제하지 않고 재활용함
BattleArenaInstance* m_apBattleList[ MAX_BATTLE_ARENA_INSTANCE_NO_PER_ARENA + 1 ];
// } 런타임에 수시로 변경되는 것들 - 접근 시 csArena를 걸어야 함
};