#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; } }