⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lootingmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// LootingManager.cpp: implementation of the CLootingManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "LootingManager.h"
#include "LootingRoom.h"
#include "Player.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLootingManager::CLootingManager()
{
	m_htLootingRoom.Initialize( 100 );
	m_htDeleteRoom.Initialize( 10 );
	m_mpLootingRoom = new CMemoryPoolTempl<CLootingRoom>;
	m_mpLootingRoom->Init( 100, 10, "CLootingRoom" );
}

CLootingManager::~CLootingManager()
{
	m_htLootingRoom.SetPositionHead();
	CLootingRoom* pRoom = NULL;
	while( pRoom = m_htLootingRoom.GetData() )
	{
		//pRoom release	//¿©±â °É¸®¸é ¹ö±×´Ù!!!!!!!!
		m_mpLootingRoom->Free( pRoom );
	}
	m_htLootingRoom.RemoveAll();
	m_htDeleteRoom.RemoveAll();
	SAFE_DELETE( m_mpLootingRoom );	
}

//ô»ì±ÇÀÌ ¼Ò¸êµÇ±â Àü¿¡ È£ÃâÇÏÀÚ!
BOOL CLootingManager::IsLootingSituation( CPlayer* pDiePlayer, CObject* pAttacker )
{
	if( pAttacker->GetObjectKind() != eObjectKind_Player )
		return FALSE;

	CPlayer* pAttackPlayer = (CPlayer*)pAttacker;

	if( pAttackPlayer->GetState() == eObjectState_Die )	//Á×¾úÀ¸¸é ·çÆÃÇÒ ¼ö ¾ø´Ù.
		return FALSE;

	if( pAttackPlayer->IsPKMode() )		//PK¸ðµåÀ̰ųª
		return TRUE;
	
	if( pDiePlayer->IsPKMode() )		//Á×Àº »ç¶÷ÀÌ PK Mode
		return TRUE;

	if( pAttackPlayer->IsWantedOwner( pDiePlayer->GetWantedIdx() ) )	//ô»ì±ÇÀ» °¡Á³À¸¸é
		return TRUE;

	return FALSE;
}

void CLootingManager::CreateLootingRoom( CPlayer* pDiePlayer, CPlayer* pAttackPlayer )
{
//ÀÌ¹Ì ÀÖ´Ù¸é ¾ø¾Ö°í ´Ù½Ã ¸¸µéÀÚ!
	CloseLootingRoom( pDiePlayer->GetID(), FALSE );
//
	CLootingRoom* pRoom = m_mpLootingRoom->Alloc();
	//±³È¯Ãë¼Ò¿Í ³ëÁ¡Ãë¼ÒµîÀ» ¸ÕÀú ½ÃŲÈÄ¿¡!	//PKLOOT
	pRoom->MakeLootingRoom( pDiePlayer, pAttackPlayer );
	m_htLootingRoom.Add( pRoom, pDiePlayer->GetID() );

//------------------------------------
// ¸Þ¼¼Áö´Â ³ªÁß¿¡ º¸³»ÁÙ ¼öµµ ÀÖ´Ù.	//PKLOOT
	//msg to Attacker
	MSG_DWORD msg;
	msg.Category	= MP_PK;
	msg.Protocol	= MP_PK_LOOTING_START;
	msg.dwData		= pDiePlayer->GetID();
	pAttackPlayer->SendMsg( &msg, sizeof(msg) );
	//·çÆÃÁß¿¡ ÇÒ ¼ö ¾ø´Â°ÍÀÌ ¹«¾ùÀϱî?			//PKLOOT

	//msg to DiePlayer
	msg.Protocol	= MP_PK_LOOTING_BEINGLOOTED;
	msg.dwData		= pAttackPlayer->GetID();
	pDiePlayer->SendMsg( &msg, sizeof(msg) );
	//·çÆÃ´çÇÏ´Â Áß¿¡ ÇÒ¼ö ¾ø´Â °ÍÀÌ ¹«¾ùÀϱî?	//PKLOOT

	pRoom->SetLootingStart();
//---------------------------------------
}


CLootingRoom* CLootingManager::GetLootingRoom( DWORD dwDiePlayer )
{
	return m_htLootingRoom.GetData( dwDiePlayer );
}


void CLootingManager::Loot( DWORD dwDiePlayer, int nArrayNum )
{
	CLootingRoom* pRoom = m_htLootingRoom.GetData( dwDiePlayer );

	if( pRoom->Loot( nArrayNum ) == FALSE )	//error
	{
		CloseLootingRoom( dwDiePlayer, TRUE );	//Ç÷¹À̾ µÑÁß¿¡ ÇѸíÀÌ ¾ø´Â°æ¿ì´Ù.
		return;
	}

//	if( pRoom->GetChance() <= 0 || pRoom->GetLootCount() <= 0 )
//	{
//		CloseLootingRoom( dwDiePlayer );
//	}
}


int CLootingManager::GetLootingChance( DWORD dwBadFame )
{
	if( dwBadFame < 100000 )
		return 3;
	else if( dwBadFame < 500000 )
		return 4;
	else if( dwBadFame < 1000000 )
		return 5;
	else if( dwBadFame < 5000000 )
		return 6;
	else if( dwBadFame < 10000000 )
		return 7;
	else if( dwBadFame < 50000000 )
		return 8;
	else if( dwBadFame < 100000000 )
		return 9;
	else
		return 10;
}

int CLootingManager::GetLootingItemNum( DWORD dwBadFame )
{
	if( dwBadFame < 100000000 )
		return 1;
	else if( dwBadFame < 400000000 )
		return 2;
	else if( dwBadFame < 700000000 )
		return 3;
	else if( dwBadFame < 1000000000 )
		return 4;
	else
		return 5;
}


int CLootingManager::GetWearItemLootingRatio( DWORD dwBadFame )
{
	if( dwBadFame < 50 )
		return 1;
	else if( dwBadFame < 4000 )
		return 10;
	else if( dwBadFame < 20000 )
		return 20;
	else if( dwBadFame < 80000 )
		return 30;
	else if( dwBadFame < 400000 )
		return 40;
	else if( dwBadFame < 1600000 )
		return 50;
	else if( dwBadFame < 8000000 )
		return 60;
	else if( dwBadFame < 32000000 )
		return 70;
	else if( dwBadFame < 100000000 )
		return 85;
	else if( dwBadFame < 500000000 )
		return 100;
	else
		return 100;
}

void CLootingManager::CloseLootingRoom( DWORD dwDiePlayer, BOOL bMsgToClient )
{
	CLootingRoom* pRoom = m_htLootingRoom.GetData( dwDiePlayer );
	if( pRoom )
	{
		pRoom->EndLootingRoomMsg( bMsgToClient );	//end Msg¸¦ º¸³½´Ù.
		m_htLootingRoom.Remove( dwDiePlayer );
		m_mpLootingRoom->Free( pRoom );
	}
}

BOOL CLootingManager::IsLootedPlayer( DWORD dwPlayerIdx )
{
	CLootingRoom* pRoom = m_htLootingRoom.GetData( dwPlayerIdx );
	if( pRoom )
		return TRUE;
	return FALSE;
}

void CLootingManager::DiePlayerExitPanelty( CPlayer* pPlayer )
{
	CLootingRoom* pRoom = m_htLootingRoom.GetData( pPlayer->GetID() );
	if( !pRoom )
		return;

	pRoom->DiePlayerExitPanelty();
}

void CLootingManager::ProcessTimeOutCheck()
{
	m_htLootingRoom.SetPositionHead();
	CLootingRoom* pRoom = NULL;
	while( pRoom = m_htLootingRoom.GetData() )
	{
		if( pRoom->IsTimeOut() )
		{
			m_htDeleteRoom.Add( pRoom, pRoom->GetDiePlayerID() );
		}
	}

	m_htDeleteRoom.SetPositionHead();
	while( pRoom = m_htDeleteRoom.GetData() )
	{
		CloseLootingRoom( pRoom->GetDiePlayerID(), TRUE );
	}
	m_htDeleteRoom.RemoveAll();
}

void CLootingManager::LootingCancel( CPlayer* pPlayer )
{
	DWORD	dwAttackerID = pPlayer->GetID();

	m_htLootingRoom.SetPositionHead();
	CLootingRoom* pRoom = NULL;
	while( pRoom = m_htLootingRoom.GetData() )
	{
		if( pRoom->GetAttackerID() == dwAttackerID )
		{
			m_htDeleteRoom.Add( pRoom, dwAttackerID );
		}
	}

	m_htDeleteRoom.SetPositionHead();
	while( pRoom = m_htDeleteRoom.GetData() )
	{
		CloseLootingRoom( pRoom->GetDiePlayerID(), TRUE );
	}
	m_htDeleteRoom.RemoveAll();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -