Files
Sun1602/Server/GameServer/GameInstanceDungeon.cpp
2022-10-26 12:25:11 +08:00

283 lines
8.2 KiB
C++

#include "stdafx.h"
#include "GameInstanceDungeon.h"
#include "Map.h"
#include "GameMissionRoom.h"
#include "Trigger.h"
#include "TriggerManagerEx.h"
#include "Player.h"
#include "Monster.h"
#include "ChangeMonsterAbility.h"
#include "StatusManager.h"
#include <World/GameWarControlManager.h>
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
#include "InstanceDungeonBattleResult.h"
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
#include "GameBattleResult.h"
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
#include "World/ChaosZoneSystem/GoldRush.h"
#include "World/ChaosZoneSystem/GoldRushBattleResult.h"
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
__IMPL_CUSTOMPOOL_PTR(GameInstanceDungeon)
GameInstanceDungeon::GameInstanceDungeon(VOID)
: chaos_zone_type_(kChaosZoneTypeNone) //_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
,chaos_zone_manager_(NULL)
{
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
m_pBattleResult = new InstanceDungeonBattleResult;
}
GameInstanceDungeon::~GameInstanceDungeon(VOID)
{
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
SAFE_DELETE(m_pBattleResult);
}
VOID GameInstanceDungeon::OnCreate()
{
BOOST_STATIC_ASSERT( INDUN_KIND_MAX == 7 ); // 추가 타입 존재시 하단 내용 추가할 것
ChangeHandler( eZONETYPE_INSTANCE, m_KindOfIndun );
// SSQControlManager에서 해당 맵코드와 키를 매핑시키기 위함
switch( m_KindOfIndun )
{
case INDUN_KIND_TOP_OF_TRIAL:
case INDUN_KIND_100LEVEL_QUEST:
case INDUN_KIND_EXT_03:
case INDUN_KIND_EXT_04:
case INDUN_KIND_MAYA_SCROLL:
break;
case INDUN_KIND_SS_QUEST:
GameWarControlManager::OnMsg( GameSSQCtrlCmd::Created(), this );
break;
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
case INDUN_KIND_CHAOS_ZONE:
chaos_zone_manager_ = new ChaosZoneManager(this);
chaos_zone_manager_->Init(chaos_zone_type_);
break;
}
GameRoom::OnCreate();
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
m_pBattleResult->Init(false);
}
VOID GameInstanceDungeon::OnDestroy()
{
//_NA_0_20091118_GAMEROOM_BATTLE_RESULT
#ifdef _NA_007750_20141113_WZDAT_MODIFY_LOG
TCHAR tszAddInfo[MAX_ADDINFO_SIZE + 1] = { 0, };
_snprintf(tszAddInfo, MAX_ADDINFO_SIZE, "MapCode:%d,TotalHeim:%I64u", GetMapCode(),
(m_pBattleResult != NULL) ? m_pBattleResult->GetTotalDropHeim() : 0);
GAMELOG->LogWzDat(ACT_TOTAL_DROP_HEIM_FROM_MONSTER, tszAddInfo);
#endif // _NA_007750_20141113_WZDAT_MODIFY_LOG
m_pBattleResult->Release();
BOOST_STATIC_ASSERT( INDUN_KIND_MAX == 7 ); // 추가 타입 존재시 하단 내용 추가할 것
switch( m_KindOfIndun )
{
case INDUN_KIND_TOP_OF_TRIAL:
case INDUN_KIND_100LEVEL_QUEST:
case INDUN_KIND_EXT_03:
case INDUN_KIND_EXT_04:
case INDUN_KIND_MAYA_SCROLL:
break;
case INDUN_KIND_SS_QUEST:
GameWarControlManager::OnMsg( GameSSQCtrlCmd::Destroy(), this );
break;
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
case INDUN_KIND_CHAOS_ZONE:
SAFE_RELEASENDELETE(chaos_zone_manager_);
chaos_zone_type_ = kChaosZoneTypeNone;
break;
}
GameRoom::OnDestroy();
}
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
void GameInstanceDungeon::Update(DWORD dwDeltaTick)
{
GameRoom::Update(dwDeltaTick);
switch (m_KindOfIndun)
{
case INDUN_KIND_CHAOS_ZONE:
if (chaos_zone_manager_)
{
chaos_zone_manager_->Update();
}
break;
}
}
VOID GameInstanceDungeon::Ready( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos )
{
pPlayer->SetGameZone( ePRS_BEFORE_ENTER_INSTNACE, this, FieldCode, AreaID, pwvStartPos );
}
VOID GameInstanceDungeon::SetZone( Object *pObject, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos )
{
pObject->SetGameZone( ePRS_AT_INSTANCE, this, FieldCode, AreaID, pwvStartPos );
}
BOOL GameInstanceDungeon::MoveField( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos )
{
SetZone( pPlayer, FieldCode, AreaID, pwvStartPos );
if( !GameRoom::MoveField( pPlayer, FieldCode, AreaID, pwvStartPos ) )
{
pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL );
return FALSE;
}
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
if (chaos_zone_type_ != kChaosZoneTypeNone)
{
if (chaos_zone_manager_ &&
chaos_zone_manager_->EnterPlayer(pPlayer) == false)
{
pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL );
return false;
}
}
return TRUE;
}
BOOL GameInstanceDungeon::Join( Player* pPlayer, MAPCODE FieldCode, WzID AreaID, WzVector* pwvStartPos )
{
if( !( pPlayer->GetGameZoneState() & ePRS_BEFORE_ENTER_INSTNACE ) )
{
SUNLOG( eCRITICAL_LOG, "[SusunLove] GameInstanceDungeon::Join eRoomState[%d] ZoneType[%d]", pPlayer->GetGameZoneState(), GetZoneType() );
return FALSE;
}
SetZone( pPlayer, FieldCode, AreaID, pwvStartPos );
#ifdef _NA_008679_20160202_REWORK_BATTLEGROUND
// RenderInfo에서 격전지의 가명을 만들기 위해
// Team정보를 이곳에서 세팅한다
// 문제가 많은 작업이지만, RenderInfo이전에 가명을 세팅하려면 유일한 위치
if (chaos_zone_type_ == kBattleGround)
{
ChaosZone* zone = chaos_zone_manager_->GetCurrentZone();
if (zone != NULL)
{
BattleGround* battle_ground = static_cast<BattleGround*>(zone);
ChaosZoneTeam team_key = battle_ground->GetPlayerTeamKey(pPlayer);
pPlayer->SetTeamKey(team_key);
pPlayer->GetBattleGroundPlayerInfo().SetTeamKey(team_key);
battle_ground->SetTeamFalseOption(pPlayer);
}
}
#endif //_NA_008679_20160202_REWORK_BATTLEGROUND
if( !GameRoom::Join( pPlayer, FieldCode, AreaID, pwvStartPos ) )
{
pPlayer->SetGameZone( ePRS_NOT_AT_ZONE, NULL, 0, NULL );
// 미션의 수행정보를 보내준다!!
return FALSE;
}
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
if (chaos_zone_type_ != kChaosZoneTypeNone)
{
if (chaos_zone_manager_ &&
chaos_zone_manager_->EnterPlayer(pPlayer) == false)
{
GameRoom::Leave(pPlayer);
pPlayer->SetGameZone(ePRS_NOT_AT_ZONE, NULL, 0, NULL);
return false;
}
}
return TRUE;
}
VOID GameInstanceDungeon::LeaveForWarp( Player* pPlayer )
{
GameRoom::LeaveForWarp( pPlayer );
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
if (chaos_zone_type_ != kChaosZoneTypeNone)
{
if (chaos_zone_manager_)
{
chaos_zone_manager_->LeavePlayer(pPlayer);
}
}
}
VOID GameInstanceDungeon::Leave( Player* pPlayer )
{
GameRoom::Leave( pPlayer );
//_NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
if (chaos_zone_type_ != kChaosZoneTypeNone)
{
if (chaos_zone_manager_)
{
chaos_zone_manager_->LeavePlayer(pPlayer);
}
}
}
VOID GameInstanceDungeon::OnKillMonster( Monster* pMonster )
{
#ifdef _NA_008012_20150130_RANKING_SYSTEM
const BOOLEAN bNeedKillEvent
= (Policyment.FIELD & Policyment.ENABLE_RANKING)
&& !(Policyment.FIELD & Policyment.ENABLE_SSQ_CONTROL)
;
if( bNeedKillEvent )
m_pRankingSystemCtl->KillMonster( (eNPC_GRADE)pMonster->GetBaseInfo()->m_byGrade, this );
#endif // _NA_008012_20150130_RANKING_SYSTEM
}
GameBattleResult* GameInstanceDungeon::GetGameBattleResult() const
{
if (chaos_zone_manager_ && chaos_zone_type_ == kBattleGround)
{
BattleGround* const battle_ground = \
static_cast<BattleGround*>(chaos_zone_manager_->GetCurrentZone());
if (battle_ground)
return static_cast<GameBattleResult*>(battle_ground->GetBattleGroundBattleResult());
}
#ifdef _NA_007065_20140217_CHAOSZONE_GOLDRUSH
else if (chaos_zone_manager_ && chaos_zone_type_ == eCHAOSZONE_TYPE_GOLDRUSH)
{
GoldRush* const goldrush = \
static_cast<GoldRush*>(chaos_zone_manager_->GetCurrentZone());
if (goldrush)
return static_cast<GameBattleResult*>(goldrush->GetGoldRushBattleResult());
}
#endif //_NA_007065_20140217_CHAOSZONE_GOLDRUSH
else
return m_pBattleResult;
return NULL;
}
#ifdef _NA_008334_20150608_SONNENSCHEIN
RC::eSTATUS_RESULT GameInstanceDungeon::ResurrectionAtSafezone( Player* pPlayer )
{
if (m_KindOfIndun != INDUN_KIND_CHAOS_ZONE || chaos_zone_manager_ == NULL) {
return RC::RC_STATUS_RESURRECTION_FAIL;
}
return chaos_zone_manager_->ResurrectionAtSafezone(pPlayer);
}
#endif //_NA_008334_20150608_SONNENSCHEIN