304 lines
7.5 KiB
C++
304 lines
7.5 KiB
C++
|
|
#include "Stdafx.h"
|
|
#include "DNPvPGameRoom.h"
|
|
#include "PvPOccupationPoint.h"
|
|
#include "PvPOccupationSystem.h"
|
|
#include "PvPGameMode.h"
|
|
#include "DNUserSession.h"
|
|
#include "DNMissionSystem.h"
|
|
#include "DnPlayerActor.h"
|
|
|
|
CPvPOccupationPoint::CPvPOccupationPoint(CDNGameRoom * pGameRoom, CPvPOccupactionSystem * pSystem, SOBB * pOBB, TPositionAreaInfo * pAreaInfo)
|
|
{
|
|
m_pGameRoom = pGameRoom;
|
|
m_OBB = *pOBB;
|
|
m_OccupationInfo = *pAreaInfo;
|
|
m_pOccupationSystem = pSystem;
|
|
|
|
m_nOccupantState = PvPCommon::OccupationState::None;
|
|
m_nOccupantTeamID = 0;
|
|
m_nOccupantUniqueID = 0;
|
|
|
|
m_nTryUniqueID = 0; //½ÃµµÁßÀÎ ³à¼®
|
|
m_nTryTeamID = 0;
|
|
m_wstrTryName.clear();
|
|
|
|
m_nWaitUniqueID = 0;
|
|
m_nWaitTeamID = 0;
|
|
m_wstrMoveWaitName.clear();
|
|
|
|
m_nTryOccupationTime = 0;
|
|
m_nLastOccupationCheckTime = 0;
|
|
m_nMoveWaitOccupationTime = 0;
|
|
m_bClimaxMode = false;
|
|
}
|
|
|
|
CPvPOccupationPoint::~CPvPOccupationPoint()
|
|
{
|
|
}
|
|
|
|
void CPvPOccupationPoint::Process(LOCAL_TIME LocalTime, float fDelta)
|
|
{
|
|
_CheckPoint(LocalTime);
|
|
}
|
|
|
|
void CPvPOccupationPoint::OnDamage(DnActorHandle hActor, DnActorHandle hHitter, const INT64 iDamage)
|
|
{
|
|
if (!hActor || !hHitter) return;
|
|
if (!(m_nOccupantState&PvPCommon::OccupationState::Try))
|
|
return;
|
|
|
|
if (hActor->GetTeam() != hHitter->GetTeam())
|
|
{
|
|
CancelAcquirePoint(hActor);
|
|
}
|
|
}
|
|
|
|
bool CPvPOccupationPoint::CheckInside(EtVector3 &Position)
|
|
{
|
|
return m_OBB.IsInside(Position);
|
|
}
|
|
|
|
void CPvPOccupationPoint::GetPointState(PvPCommon::OccupationStateInfo &Info)
|
|
{
|
|
Info.nAreaID = GetID();
|
|
Info.nOccupationState = m_nOccupantState;
|
|
|
|
Info.nOwnedUniqueID = m_nOccupantUniqueID;
|
|
Info.nOwnedTemID = m_nOccupantTeamID;
|
|
|
|
Info.nTryUniqueID = m_nTryUniqueID;
|
|
Info.nTryTeamID = m_nTryTeamID;
|
|
|
|
Info.nMoveWaitUniqueID = m_nWaitUniqueID;
|
|
Info.nMoveWaitTeamID = m_nWaitTeamID;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::TryAcquirePoint(DnActorHandle hActor, LOCAL_TIME LocalTime)
|
|
{
|
|
if (!hActor) return false;
|
|
if (m_nOccupantState&PvPCommon::OccupationState::CantTryMask)
|
|
{
|
|
_DANGER_POINT();
|
|
return false;
|
|
}
|
|
|
|
m_nTryUniqueID = hActor->GetUniqueID();
|
|
m_wstrTryName = hActor->GetName();
|
|
m_nTryTeamID = hActor->GetTeam();
|
|
m_nTryOccupationTime = LocalTime;
|
|
|
|
if (m_nOccupantState&PvPCommon::OccupationState::MoveWait)
|
|
{
|
|
if (m_nWaitTeamID == m_nTryTeamID)
|
|
{
|
|
m_nOccupantState &= ~PvPCommon::OccupationState::MoveWait;
|
|
m_nMoveWaitOccupationTime = 0;
|
|
m_nWaitTeamID = 0;
|
|
}
|
|
}
|
|
|
|
m_nOccupantState |= PvPCommon::OccupationState::Try;
|
|
|
|
_SendOccupationPointState();
|
|
return true;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::CancelAcquirePoint(DnActorHandle hActor)
|
|
{
|
|
if (!hActor) return false;
|
|
if (!(m_nOccupantState&PvPCommon::OccupationState::Try))
|
|
return false;
|
|
|
|
if (m_nTryUniqueID == hActor->GetUniqueID())
|
|
{
|
|
_ClearTry();
|
|
_SendOccupationPointState();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::ChangeClimaxMode()
|
|
{
|
|
m_bClimaxMode = true;
|
|
return m_bClimaxMode;
|
|
}
|
|
|
|
void CPvPOccupationPoint::_CheckPoint(LOCAL_TIME LocalTime)
|
|
{
|
|
if (m_nOccupantState&PvPCommon::OccupationState::Own)
|
|
{
|
|
//CheckOwn
|
|
if (_IsAcquireResourceTerm(LocalTime))
|
|
{
|
|
if (m_pOccupationSystem)
|
|
{
|
|
m_pOccupationSystem->GainResource(m_nOccupantTeamID, (m_bClimaxMode ? m_OccupationInfo.nClimaxGainVal : m_OccupationInfo.nGainResource));
|
|
}
|
|
else
|
|
_DANGER_POINT();
|
|
}
|
|
}
|
|
|
|
if (m_nOccupantState&PvPCommon::OccupationState::Try)
|
|
{
|
|
//CheckTry
|
|
if (_IsFinishedTryTerm(LocalTime))
|
|
{
|
|
if (m_nOccupantTeamID == m_nTryTeamID)
|
|
{
|
|
m_nOccupantUniqueID = m_nTryUniqueID;
|
|
_OnOccupyArea();
|
|
m_nOccupantTeamID = m_nTryTeamID;
|
|
|
|
_ClearTry();
|
|
_ClearMoveWait();
|
|
|
|
m_nOccupantState |= PvPCommon::OccupationState::Own;
|
|
}
|
|
else
|
|
{
|
|
m_nWaitTeamID = m_nTryTeamID;
|
|
m_nWaitUniqueID = m_nTryUniqueID;
|
|
m_wstrMoveWaitName = m_wstrTryName;
|
|
m_nMoveWaitOccupationTime = LocalTime;
|
|
|
|
_ClearTry();
|
|
|
|
m_nOccupantState &= ~PvPCommon::OccupationState::Own; //´ë±âÁß»óÅ·Πµé¾î°¡¸é ȹµæ»óŰ¡ Ç®¸²
|
|
m_nOccupantState |= PvPCommon::OccupationState::MoveWait;
|
|
}
|
|
|
|
//»óꝰæÀ» ·ë¿¡ ¾Ë¸°´Ù.
|
|
_SendOccupationPointState();
|
|
}
|
|
}
|
|
|
|
if (m_nOccupantState&PvPCommon::OccupationState::MoveWait)
|
|
{
|
|
//CheckMoveWait
|
|
if (_IsFinishedMoveWaitTerm(LocalTime))
|
|
{
|
|
if (m_pOccupationSystem)
|
|
m_pOccupationSystem->OnAcquirePoint(m_wstrMoveWaitName.c_str(), m_nWaitTeamID, m_nOccupantTeamID, GetID(), LocalTime);
|
|
|
|
m_nOccupantUniqueID = m_nWaitUniqueID;
|
|
_OnOccupyArea();
|
|
m_nOccupantTeamID = m_nWaitTeamID;
|
|
|
|
_ClearTry();
|
|
_ClearMoveWait();
|
|
|
|
m_nOccupantState |= PvPCommon::OccupationState::Own;
|
|
|
|
//»óꝰæÀ» ·ë¿¡ ¾Ë¸°´Ù.
|
|
_SendOccupationPointState();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CPvPOccupationPoint::_ClearTry()
|
|
{
|
|
m_nTryUniqueID = 0;
|
|
m_nTryTeamID = 0;
|
|
m_wstrTryName.clear();
|
|
m_nTryOccupationTime = 0;
|
|
|
|
m_nOccupantState &= ~PvPCommon::OccupationState::Try;
|
|
}
|
|
|
|
void CPvPOccupationPoint::_ClearMoveWait()
|
|
{
|
|
m_nWaitUniqueID = 0;
|
|
m_nWaitTeamID = 0;
|
|
m_wstrMoveWaitName.clear();
|
|
m_nMoveWaitOccupationTime = 0;
|
|
|
|
m_nOccupantState &= ~PvPCommon::OccupationState::MoveWait;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::_IsAcquireResourceTerm(LOCAL_TIME LocalTime)
|
|
{
|
|
if (m_nLastOccupationCheckTime <= 0)
|
|
m_nLastOccupationCheckTime = LocalTime;
|
|
else if (m_nLastOccupationCheckTime + (m_bClimaxMode ? m_OccupationInfo.nClimaxGainTermTick : m_OccupationInfo.nGainResourceTermTick) < LocalTime)
|
|
{
|
|
m_nLastOccupationCheckTime = LocalTime;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::_IsFinishedTryTerm(LOCAL_TIME LocalTime)
|
|
{
|
|
if (m_nTryOccupationTime == 0)
|
|
_DANGER_POINT();
|
|
return (m_nTryOccupationTime > 0 && m_nTryOccupationTime + (m_bClimaxMode ? m_OccupationInfo.nClimaxTryTick : m_OccupationInfo.nRequireTryTick) < LocalTime) ? true : false;
|
|
}
|
|
|
|
bool CPvPOccupationPoint::_IsFinishedMoveWaitTerm(LOCAL_TIME LocalTime)
|
|
{
|
|
if (m_nMoveWaitOccupationTime == 0)
|
|
_DANGER_POINT();
|
|
return (m_nMoveWaitOccupationTime > 0 && m_nMoveWaitOccupationTime + (m_bClimaxMode ? m_OccupationInfo.nClimaxCompleteOccupationTick : m_OccupationInfo.nCompleteOccupationTick) < LocalTime) ? true : false;
|
|
}
|
|
|
|
void CPvPOccupationPoint::_SendOccupationPointState()
|
|
{
|
|
if (m_pOccupationSystem)
|
|
{
|
|
PvPCommon::OccupationStateInfo Info;
|
|
memset(&Info, 0, sizeof(PvPCommon::OccupationStateInfo));
|
|
|
|
Info.nAreaID = GetID();
|
|
Info.nOccupationState = m_nOccupantState;
|
|
|
|
Info.nOwnedUniqueID = m_nOccupantUniqueID;
|
|
Info.nOwnedTemID = m_nOccupantTeamID;
|
|
|
|
Info.nTryUniqueID = m_nTryUniqueID;
|
|
Info.nTryTeamID = m_nTryTeamID;
|
|
|
|
Info.nMoveWaitUniqueID = m_nWaitUniqueID;
|
|
Info.nMoveWaitTeamID = m_nWaitTeamID;
|
|
|
|
#ifdef _WORK
|
|
if (Info.nOccupationState&PvPCommon::OccupationState::Try && (m_nTryOccupationTime == 0 || m_nTryUniqueID == 0))
|
|
_DANGER_POINT();
|
|
if (Info.nOccupationState&PvPCommon::OccupationState::MoveWait && (m_nWaitUniqueID == 0 || m_nMoveWaitOccupationTime == 0))
|
|
_DANGER_POINT();
|
|
#endif
|
|
|
|
m_pOccupationSystem->SendOccupationPointState(1, &Info);
|
|
}
|
|
}
|
|
|
|
void CPvPOccupationPoint::_OnOccupyArea()
|
|
{
|
|
CDNUserSession* pGameSession = m_pGameRoom->GetUserSession(m_nOccupantUniqueID);
|
|
if( !pGameSession )
|
|
return;
|
|
|
|
CPvPGameMode * pGameMode = m_pGameRoom->GetPvPGameMode();
|
|
if( !pGameMode )
|
|
return;
|
|
|
|
switch( pGameMode->GetPvPGameModeTable()->uiGameMode )
|
|
{
|
|
case PvPCommon::GameMode::PvP_Occupation:
|
|
{
|
|
if (m_nOccupantTeamID == 0) // Á¡·É
|
|
{
|
|
pGameSession->IncCommonVariableData(CommonVariable::Type::PvPOccupation_OccupyArea);
|
|
pGameSession->GetEventSystem()->OnEvent(EventSystem::OnOccupyArea);
|
|
}
|
|
else // ÀïÅ»
|
|
{
|
|
pGameSession->IncCommonVariableData(CommonVariable::Type::PvPOccupation_StealArea);
|
|
pGameSession->GetEventSystem()->OnEvent(EventSystem::OnStealArea);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|