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

📄 pkmanager.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PKManager.cpp: implementation of the CPKManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PKManager.h"
#include "ObjectManager.h"
#include "GameIn.h"
#include "CharStateDialog.h"
#include "ChatManager.h"
#include "./Interface/cWindowManager.h"
#include "WindowIdEnum.h"
#include "cMsgBox.h"
#include "VimuManager.h"
#include "PKLootingDialog.h"
#include "ItemManager.h"
#include "InventoryExDialog.h"
#include "QuickManager.h"
#include "GameEventManager.h"
#include "MugongManager.h"
#include "ObjectStateManager.h"
#include "SkillManager_Client.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

GLOBALTON(CPKManager)

CPKManager::CPKManager()
{
	m_dwPKContinueTime	= PKMODETIME;
	m_htLootingDlg.Initialize( 3 );
}

CPKManager::~CPKManager()
{
}

void CPKManager::Init()
{
	m_IndexGenerator.Init(1000, IG_PKLOOTINGDLG_START);	
	m_bSyncing			= FALSE;
	m_bLooted			= FALSE;
	m_bLooting			= FALSE;
	m_bPKAllow			= FALSE;
}

void CPKManager::Release()
{
	m_htLootingDlg.RemoveAll();	//window newÇÑ°Ç windowmanager°¡ Áö¿öÁØ´Ù
	m_IndexGenerator.Release();
}

BOOL CPKManager::HEROPKModeOn()
{
	if( !IsPKAllow() )
	{
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 145 ) );
		return FALSE;
	}
	if( m_bSyncing )			return FALSE;
	if( !HERO )					return FALSE;
	if( HERO->IsPKMode() )		return FALSE;	//ÀÌ¹Ì on»óÅÂÀÌ´Ù.
	if( WINDOWMGR->GetWindowForID( MBI_PKMODE ) ) return FALSE;		//ÀÌ¹Ì Ã¢À» ¶ç¿ü´Ù.

	cMsgBox* pMsgBox = WINDOWMGR->MsgBox( MBI_PKMODE, MBT_YESNO, CHATMGR->GetChatMsg( 149 ) );		
	if( !pMsgBox ) return FALSE;

	GAMEEVENTMGR->AddEvent( eGameEvent_PKInterface );

	return TRUE;
}

void CPKManager::SendMsgPKOn()
{
/*	
	if( HERO->GetState() != eObjectState_None && HERO->GetState() != eObjectState_Move )
	{
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 557 ) );
		return;			//º¸Åë»óÅ¿¡¼­¸¸ °¡´É
	}
*/

	if( HERO->GetState() == eObjectState_Die )
	{
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 557 ) );
		return;			//Á×Àº»óŸ¸ ¾Æ´Ï¸é
	}

	if( VIMUMGR->IsVimuing() )	//ºñ¹«Áß¿£ ¾ÈµÈ´Ù.
	{
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 550 ) );
		return;
	}

	MSGBASE msg;
	msg.Category	= MP_PK;
	msg.Protocol	= MP_PK_PKON_SYN;
	msg.dwObjectID	= HERO->GetID();
	NETWORK->Send( &msg, sizeof(msg) );

	m_bSyncing		= TRUE;
}

BOOL CPKManager::HEROPKModeOff()
{
	if( m_bSyncing )		return FALSE;
	if( !HERO )				return FALSE;
	if( !HERO->IsPKMode() )	return FALSE;	//ÀÌ¹Ì off»óÅÂÀÌ´Ù.

	if( gCurTime - m_dwPKModeStartTime >= m_dwPKContinueTime )
	{
		MSGBASE msg;
		msg.Category	= MP_PK;
		msg.Protocol	= MP_PK_PKOFF_SYN;
		msg.dwObjectID	= HERO->GetID();
		NETWORK->Send( &msg, sizeof(msg) );

		m_bSyncing		= TRUE;
		
		return TRUE;
	}
	else
	{
		int nRemain = (int)( m_dwPKContinueTime - (gCurTime - m_dwPKModeStartTime) ) / 1000;
		if( nRemain < 0 ) nRemain = 0;				
//		else if( nRemain > 60 ) nRemain = 60;//³ªÁß¿¡ »óÅ¿¡µû¶ó Ãʰ¡ ´Ã¾î³ª¾ßÇÑ´Ù.
		CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(146), nRemain + 1); // ¿Ã¸²+1
	}

	return FALSE;
}

void CPKManager::SetPlayerPKMode( CPlayer* pPlayer, BOOL bPKMode )
{
	pPlayer->SetPKMode( bPKMode );
}

BOOL CPKManager::ToggleHeroPKMode()
{
	if( HERO )
	if( HERO->IsPKMode() )
	{
		return HEROPKModeOff();
	}
	else
	{
		return HEROPKModeOn();
	}

	return FALSE;

}

void CPKManager::NetworkMsgParse( BYTE Protocol, void* pMsg )
{
	switch(Protocol)
	{
	case MP_PK_PKON_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CPlayer* pPlayer = (CPlayer*)OBJECTMGR->GetObject( pmsg->dwData );
			if( !pPlayer ) break;

			if( HERO )
			if( pmsg->dwData == HEROID )
			{
				m_bSyncing			= FALSE;
				m_dwPKModeStartTime	= gCurTime;
				m_dwPKContinueTime	= HERO->GetBadFame()/200 + PKMODETIME; //°è»ê½ÄÀ» ³ÖÀÚ.
				if( m_dwPKContinueTime > 3600000 )
					m_dwPKContinueTime = 3600000;

				HERO->DisableAutoAttack();	//ÀÚµ¿ °ø°Ý Ãë¼Ò
				HERO->SetNextAction(NULL);	//½ºÅ³ Ãë¼Ò
				if( HERO->GetState() == eObjectState_Immortal )
					OBJECTSTATEMGR->EndObjectState( HERO, eObjectState_Immortal );

				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(147) );
			}
			
			pPlayer->SetPKMode( TRUE );

			//ij¸¯ÅÍ ¿À¹öÀÎÆ÷ ¹Ù²Ù±â
			OBJECTMGR->ApplyOverInfoOption( pPlayer );
			OBJECTEFFECTDESC desc(FindEffectNum("maintain_PK_S.beff"));
			pPlayer->AddObjectEffect( PK_EFFECT_ID, &desc, 1 );
		}
		break;

	case MP_PK_PKON_NACK:
		{
			MSG_BYTE* pmsg = (MSG_BYTE*)pMsg;
			m_bSyncing		= FALSE;

			switch( pmsg->bData )
			{
			case ePKCODE_VIMUING:
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 550 ) );
				break;
			case ePKCODE_STATECONFLICT:
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 557 ) );
				break;
			case ePKCODE_NOTALLAW:
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 145 ) );
				break;
			}
		}
		break;

	case MP_PK_PKOFF_ACK:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CPlayer* pPlayer = (CPlayer*)OBJECTMGR->GetObject( pmsg->dwData );
			if( !pPlayer ) break;

			pPlayer->SetPKMode( FALSE );
			
			if( HERO )
			if( pmsg->dwData == HERO->GetID() )
			{
				m_bSyncing		= FALSE;
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(148) );
			}
			else
			{
				//ÇöÀç °ø°ÝŸ°ÙÀÌ pk¸¦ Ų À¯Àú¶ó¸é Ÿ°ÙÀ» ¾ø¾ÖÀÚ.
				HERO->ClearTarget( pPlayer );				
			}

			//ij¸¯ÅÍ ¿À¹öÀÎÆ÷ ¹Ù²Ù±â
			OBJECTMGR->ApplyOverInfoOption( pPlayer );
			pPlayer->RemoveObjectEffect( PK_EFFECT_ID );


		}
		break;

	case MP_PK_DISAPPEAR:	//PK_OFF¶û ¸Þ¼¼Áö¸¸ ´Ù¸£´Ù...--;
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;

			CPlayer* pPlayer = (CPlayer*)OBJECTMGR->GetObject( pmsg->dwData );
			if( !pPlayer ) break;

			pPlayer->SetPKMode( FALSE );
			
			if( HERO )
			if( pmsg->dwData == HERO->GetID() )
			{
				//m_bSyncing		= FALSE;
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg(628) );
			}
			else
			{
				//ÇöÀç °ø°ÝŸ°ÙÀÌ pk¸¦ Ų À¯Àú¶ó¸é Ÿ°ÙÀ» ¾ø¾ÖÀÚ.
				HERO->ClearTarget( pPlayer );
			}

			//ij¸¯ÅÍ ¿À¹öÀÎÆ÷ ¹Ù²Ù±â
			OBJECTMGR->ApplyOverInfoOption( pPlayer );
			pPlayer->RemoveObjectEffect( PK_EFFECT_ID );
		}
		break;

	case MP_PK_PKOFF_NACK:
		{
			//½Ã°£À̾ȵǾú´Ù.
			m_bSyncing		= FALSE;
		}
		break;

	case MP_PK_LOOTING_START:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;
			CreateLootingDlg( pmsg->dwData );
			SetPKLooting( TRUE );

			GAMEEVENTMGR->AddEvent( eGameEvent_KillPK );

		}
		break;

	case MP_PK_LOOTING_BEINGLOOTED:
		{
			MSG_DWORD* pmsg = (MSG_DWORD*)pMsg;
			CPlayer* pAttacker = (CPlayer*)OBJECTMGR->GetObject( pmsg->dwData );
			if( pAttacker )
				CHATMGR->AddMsg( CTC_SYSMSG, CHATMGR->GetChatMsg( 562 ), pAttacker->GetObjectName() );

			SetPKLooted( TRUE );

			GAMEEVENTMGR->AddEvent( eGameEvent_DieFromPK );
			//ºÎȰÀÌ ¾ÈµÇµµ·Ï ÇÏÀÚ. ¼­¹ö¿¡¼­ º¸³»ÁÖ´Â ¹æ½ÄÀ¸·Î ¹Ù²Ù´Â°Í °ËÅä
			//Á¾·áµµ ¾ÈµÇµµ·Ï ÇÏÀÚ.
			//¾ÆÀÌÅÛ Á¶ÀÛÀÌ ¾ÈµÇµµ·ÏÇÏÀÚ
			//±âÁ¸¿¡ ¾ÆÀÌÅÛÀ» Á¶ÀÛÇϰí ÀÖ¾ú´Ù¸é ¸ðµÎ ÃÖ¼Ò½ÃŲ´Ù.(¹ö¸®±â »ç±â ÆÈ±âµî)
		}
		break;

	case MP_PK_LOOTING_ITEMLOOTING:
		{
			MSG_LOOTINGIEM* pmsg = (MSG_LOOTINGIEM*)pMsg;
			if( pmsg->bOptionItem )

⌨️ 快捷键说明

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