📄 pkmanager.cpp
字号:
// 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 + -