Files
2026-06-01 12:46:52 +02:00

195 lines
8.0 KiB
C++

#pragma once
#include <ctime>
#include <mmo/ArType.h>
#include <mmo/ArMove.h>
// 대련 타입
enum _COMPETE_TYPE
{
COMPETE_TYPE_VS_PLAYER = 0,
COMPETE_TYPE_VS_PARTY = 1,
COMPETE_TYPE_VS_GUILD = 2,
COMPETE_TYPE_VS_ALLIANCE = 3
};
// 대련 요청에 따른 응답 타입(클라이언트의 응답 메시지 및 CompeteManager에 응답 처리 시 사용됨)
enum _COMPETE_ANSWER_TYPE
{
COMPETE_ANSWER_TYPE_ACCEPT = 0, // 수락
COMPETE_ANSWER_TYPE_REJECT_BY_USER = 1, // 거절
COMPETE_ANSWER_TYPE_REJECT_BY_OPTION = 2, // 자동 거절(옵션)
COMPETE_ANSWER_TYPE_REJECT_BY_TIMEOUT = 3 // 시간 초과에 따른 취소(신청받은 플레이어에게 보내질 경우 신청 수락/확인 창이 닫히는 것으로 처리)
// 일정 횟수 이상 연속 거절당함으로 인한 신청 불가 처리는 신청하는 플레이어의 클라이언트에서 처리 함(서버에 요청이 올 일이 없으므로 불필요)
};
// 대련 종료 타입
enum _COMPETE_END_TYPE
{
COMPETE_END_BY_DEATH = 0, // 사망으로 인한 종료
COMPETE_END_BY_LOGOUT = 1, // 로그아웃으로 인한 종료
COMPETE_END_BY_RINGOUT = 2, // 장외로 인한 종료
COMPETE_END_BY_TIMEOUT = 3, // 시간 초과로 인한 종료
COMPETE_END_BY_INTERRUPT = 4, // 몬스터 또는 PK 플레이어의 방해로 인한 종료
COMPETE_END_BY_ENTERING_SAFETY_ZONE = 5, // 대련 불가 지역 진입으로 인한 종료
};
// 대련 상태
enum _COMPETE_STATE
{
COMPETE_STATE_REQUESTING = 0, // 대련 신청 중(신청 시점부터 응답받기 전까지)
COMPETE_STATE_COUNTDOWN = 1, // 대련 시작 전 카운트다운
COMPETE_STATE_COMPETING = 2 // 대련 중
};
static const time_t NOT_SCHEDULED_TIME = -1;
void assembleCompeteEndMessage( struct TS_SC_COMPETE_END * pMsg, const unsigned char nCompeteType, const unsigned char nEndType, const char * szWinner, const char * szLoser );
// 진행 중인 대련 정보(상속용)
struct CompeteInfoBase
{
CompeteInfoBase( const _COMPETE_STATE & _eState, const time_t & _tNextStateChange )
: nID( static_cast< unsigned int >( InterlockedIncrement( &nMaxUsedCompeteID ) ) )
, eState( _eState )
, tNextStateChange( _tNextStateChange )
{}
virtual const _COMPETE_TYPE GetCompeteType() const = 0;
virtual void OnAnswerRequest( const _COMPETE_ANSWER_TYPE & eAnswer ) = 0;
virtual void OnAnswerTimeout() = 0;
virtual void OnEndCountdown() = 0;
virtual void OnRetire( const void * pRetire, const _COMPETE_END_TYPE & eEndTyper ) = 0;
virtual void OnCompeteTimeout() = 0;
virtual const unsigned short Validate( const bool bNotifyEndOnError, const bool bIncludeRequestee = true, const bool bIncludeRequester = true, _COMPETE_END_TYPE * pError = NULL, bool * pbRequesterWin = NULL ) = 0;
virtual const void * GetRequestee() const = 0;
virtual const void * GetRequester() const = 0;
virtual const char * GetCompetitorName( const bool bRequester ) const = 0;
unsigned int nID;
_COMPETE_STATE eState;
time_t tNextStateChange;
private:
static volatile LONG nMaxUsedCompeteID;
};
// 개인전 대련 정보
struct PlayerCompeteInfo : public CompeteInfoBase
{
PlayerCompeteInfo( const AR_HANDLE & _hRequestee, const AR_HANDLE & _hRequester, const _COMPETE_STATE & _eState, const time_t & _tNextStateChange )
: CompeteInfoBase( _eState, _tNextStateChange )
, hRequestee( _hRequestee )
, hRequester( _hRequester )
{}
virtual const _COMPETE_TYPE GetCompeteType() const { return COMPETE_TYPE_VS_PLAYER; }
virtual void OnAnswerRequest( const _COMPETE_ANSWER_TYPE & eAnswer );
virtual void OnAnswerTimeout();
virtual void OnEndCountdown();
virtual void OnRetire( const void * pRetirer, const _COMPETE_END_TYPE & eEndType );
virtual void OnCompeteTimeout();
virtual const unsigned short Validate( const bool bNotifyEndOnError, const bool bIncludeRequestee = true, const bool bIncludeRequester = true, _COMPETE_END_TYPE * peError = NULL, bool * pbRequesterWin = NULL );
virtual const void * GetRequestee() const { return &hRequestee; }
virtual const void * GetRequester() const { return &hRequester; }
virtual const char * GetCompetitorName( const bool bRequester ) const;
inline const struct StructPlayer * GetRequesteeAsPlayer() const;
inline struct StructPlayer * GetRequesteeAsPlayer();
inline const struct StructPlayer * GetRequesterAsPlayer() const;
inline struct StructPlayer * GetRequesterAsPlayer();
AR_HANDLE hRequestee;
AR_HANDLE hRequester;
ArPosition posCompeteCenter;
};
// 파티전 대련 정보
struct PartyCompeteInfo : public CompeteInfoBase
{
PartyCompeteInfo( const int & _nRequestee, const int & _nRequester, const _COMPETE_STATE & _eState, const time_t & _tNextStateChange )
: CompeteInfoBase( _eState, _tNextStateChange )
, nRequestee( _nRequestee )
, nRequester( _nRequester )
{}
virtual const _COMPETE_TYPE GetCompeteType() const { return COMPETE_TYPE_VS_PARTY; }
virtual void OnAnswerRequest( const _COMPETE_ANSWER_TYPE & eAnswer );
virtual void OnAnswerTimeout();
virtual void OnEndCountdown();
virtual void OnRetire( const void * pRetirer, const _COMPETE_END_TYPE & eEndType );
virtual void OnCompeteTimeout();
virtual const unsigned short Validate( const bool bNotifyEndOnError, const bool bIncludeRequestee = true, const bool bIncludeRequester = true, _COMPETE_END_TYPE * pError = NULL, bool * pbRequesterWin = NULL );
virtual const void * GetRequestee() const { return &nRequestee; }
virtual const void * GetRequester() const { return &nRequester; }
virtual const char * GetCompetitorName( const bool bRequester ) const;
int nRequestee;
int nRequester;
};
// 길드전 대련 정보
struct GuildCompeteInfo : public CompeteInfoBase
{
GuildCompeteInfo( const int & _nRequestee, const int & _nRequester, const _COMPETE_STATE & _eState, const time_t & _tNextStateChange )
: CompeteInfoBase( _eState, _tNextStateChange )
, nRequestee( _nRequestee )
, nRequester( _nRequester )
{}
virtual const _COMPETE_TYPE GetCompeteType() const { return COMPETE_TYPE_VS_GUILD; }
virtual void OnAnswerRequest( const _COMPETE_ANSWER_TYPE & eAnswer );
virtual void OnAnswerTimeout();
virtual void OnEndCountdown();
virtual void OnRetire( const void * pRetirer, const _COMPETE_END_TYPE & eEndType );
virtual void OnCompeteTimeout();
virtual const unsigned short Validate( const bool bNotifyEndOnError, const bool bIncludeRequestee = true, const bool bIncludeRequester = true, _COMPETE_END_TYPE * pError = NULL, bool * pbRequesterWin = NULL );
virtual const void * GetRequestee() const { return &nRequestee; }
virtual const void * GetRequester() const { return &nRequester; }
virtual const char * GetCompetitorName( const bool bRequester ) const;
int nRequestee;
int nRequester;
};
// 연합전 대련 정보
struct AllianceCompeteInfo : public CompeteInfoBase
{
AllianceCompeteInfo( const int & _nRequestee, const int & _nRequester, const _COMPETE_STATE & _eState, const time_t & _tNextStateChange )
: CompeteInfoBase( _eState, _tNextStateChange )
, nRequestee( _nRequestee )
, nRequester( _nRequester )
{}
virtual const _COMPETE_TYPE GetCompeteType() const { return COMPETE_TYPE_VS_ALLIANCE; }
virtual void OnAnswerRequest( const _COMPETE_ANSWER_TYPE & eAnswer );
virtual void OnAnswerTimeout();
virtual void OnEndCountdown();
virtual void OnRetire( const void * pRetirer, const _COMPETE_END_TYPE & eEndType );
virtual void OnCompeteTimeout();
virtual const unsigned short Validate( const bool bNotifyEndOnError, const bool bIncludeRequestee = true, const bool bIncludeRequester = true, _COMPETE_END_TYPE * pError = NULL, bool * pbRequesterWin = NULL );
virtual const void * GetRequestee() const { return &nRequestee; }
virtual const void * GetRequester() const { return &nRequester; }
virtual const char * GetCompetitorName( const bool bRequester ) const;
int nRequestee;
int nRequester;
};