📄 handler_cg_gm.cpp
字号:
#include "StdAfx.h"
#include ".\handler_cg_gm.h"
#include <Protocol_CG.h>
#include <PacketStruct_CG.h>
#include "Field.h"
#include "Player.h"
#include "PlayerManager.h"
#include "ServerSession.h"
#include "DropManager.h"
#include "GameServer.h"
#include "Global.h"
#include "Map.h"
#include "Item.h"
#include "Define.h"
#include "ObjectFactory.h"
#include <ItemInfoParser.h>
#include "GameZone.h"
#include "GameZoneManager.h"
#include "GameRoom.h"
#include "StatusManager.h"
GMCmdManager Handler_CG_GM::m_GMCmdManager;
Handler_CG_GM::Handler_CG_GM()
{
}
Handler_CG_GM::~Handler_CG_GM()
{
}
/*
VOID Handler_CG_GM::OnCG_GM_MONSTER_CREATE_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_MONSTER_CREATE_SYN* pRecv = (MSG_CG_GM_MONSTER_CREATE_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if (!pPlayer) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( NULL == pField )
{
// GM篮 霸烙郴 鞘靛救俊 甸绢客辑 疙飞阑 且 版快父 阁胶磐甫 积己秦临 抗沥!!
return;
}
WzVector vPlayerPos;
pPlayer->GetPos( &vPlayerPos );
// 敲饭捞绢啊 困摹茄 鸥老困俊辑 罚待茄 困摹俊 阁胶磐 积己(20050624)
int iTileIdx = pPlayer->GetPathExplorer()->GetTile();
if( -1 == iTileIdx )
{
//DISPMSG( "[OnCG_GM_MONSTER_CREATE_SYN] Player Position : TileIdx -1 !!!");
return;
}
vPlayerPos = pField->GetFieldInfo()->GetWorldBase()->GetRandomPosInTile(iTileIdx);
pField->CreateNPC( MONSTER_OBJECT, pRecv->m_dwMonsterCode, pRecv->m_byMonsterCnt, &vPlayerPos);
}
VOID Handler_CG_GM::OnCG_GM_MONSTER_DESTROYALL_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{
MSG_CG_GM_MONSTER_DESTROYALL_SYN* pRecv = (MSG_CG_GM_MONSTER_DESTROYALL_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( NULL == pField )
{
// GM篮 霸烙郴 鞘靛救俊 甸绢客辑 疙飞阑 且 版快父 阁胶磐甫 积己秦临 抗沥!!
return;
}
// 鞘靛郴 葛电 阁胶磐 家戈
pField->KillAllNPC( pPlayer, FALSE );
}
class DestroyMonsterAround
{
WzVector m_vOriginPos;
int m_iRange;
Player * m_pAttackPlayer;
public:
DestroyMonsterAround( WzVector &vOriginPos, int iRange, Player * pPlayer ):m_pAttackPlayer(pPlayer) { m_vOriginPos = vOriginPos; m_iRange = iRange; }
~DestroyMonsterAround(){}
void operator() ( NPC * pNPC)
{
Field *pField = pNPC->GetField();
if( !pField ) return;
WzVector vNPCPos;
pNPC->GetPos( &vNPCPos );
float fDist = VectorLength( &(vNPCPos - m_vOriginPos) );
if( fDist <= m_iRange )
{
DAMAGETYPE wDamage = (DAMAGETYPE)pNPC->GetMaxHP();
// 单固瘤 贸府
// pNPC->Damaged( m_pAttackPlayer, eATTACK_TYPE_MELEE, wDamage );
// 阁胶磐 力芭甫 荤侩秦辑 飘府芭甫 柳青窍扁 困秦 bIsDrop阑 TRUE肺 悸泼茄促.
pField->KillNPC( m_pAttackPlayer, pNPC, TRUE );
// 磊脚阑 器窃茄 牢立 敲饭捞绢俊霸 宏肺靛 某胶飘
MSG_CG_BATTLE_PLAYER_ATTACK_BRD sendMsg;
sendMsg.dwClientSerial = 0;
sendMsg.wvCurPos = m_vOriginPos;
sendMsg.wvDestPos = vNPCPos;
sendMsg.dwAttackerKey = m_pAttackPlayer->GetObjectKey();
sendMsg.byAttackType = eATTACK_SEQUENCE_FIRST;
sendMsg.dwTargetKey = pNPC->GetObjectKey();
sendMsg.wDamage = wDamage;
sendMsg.dwTargetHP = pNPC->GetHP();
sendMsg.byEffect = 0; // GM疙飞绢肺 磷捞绰 巴捞瘤父 捞 蔼俊 措茄 技泼阑 秦林绢具 窃!!(20060115)
m_pAttackPlayer->SendPacketAround( (MSG_BASE_FORWARD*)&sendMsg, sizeof(sendMsg) );
//pField->AddDeadNPCList( pNPC );
}
}
};
VOID Handler_CG_GM::OnCG_GM_MONSTER_DESTROYNEAR_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{
MSG_CG_GM_MONSTER_DESTROYNEAR_SYN* pRecv = (MSG_CG_GM_MONSTER_DESTROYNEAR_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( !pField ) return;
WzVector vPlayerPos;
pPlayer->GetPos( &vPlayerPos );
// 馆版 15m 郴狼 阁胶磐甸阑 昏力茄促.
DestroyMonsterAround DestroyMonsterOpr( vPlayerPos, 15, pPlayer );
pField->ForeachNeighborNPCAt( pPlayer->GetSectorIndex(), DestroyMonsterOpr );
}
VOID Handler_CG_GM::OnCG_GM_OBSERVER_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_OBSERVER_SYN* pRecv = (MSG_CG_GM_OBSERVER_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if (!pPlayer) return;
if( !pPlayer->IsGMPlayer() )
{
MSG_CG_GM_OBSERVER_NAK NakMsg;
NakMsg.m_dwErrorCode = RC::RC_GM_ISNOT_GM;
pPlayer->SendPacket( &NakMsg, sizeof(NakMsg) );
return;
}
BOOL bObserverOn = pPlayer->IsStatus(eCHAR_STATE_ETC_OBSERVER);
BOOL bSuccess = FALSE;
if (bObserverOn)
{
// ON --> OFF
if (!pRecv->m_byObserverOn)
{
pPlayer->GetStatusManager()->Remove( eCHAR_STATE_ETC_OBSERVER );
bSuccess = TRUE;
}
}
else
{
// OFF --> ON
if (pRecv->m_byObserverOn)
{
pPlayer->GetStatusManager()->AllocStatus( eCHAR_STATE_ETC_OBSERVER );
bSuccess = TRUE;
}
}
if (bSuccess)
{
MSG_CG_GM_OBSERVER_BRD BrdMsg;
BrdMsg.m_dwObjectKey = pPlayer->GetObjectKey();
BrdMsg.m_byObserverOn = pRecv->m_byObserverOn;
pPlayer->SendPacketAround( &BrdMsg, sizeof(BrdMsg) );
}
else
{
MSG_CG_GM_OBSERVER_NAK NakMsg;
NakMsg.m_dwErrorCode = RC::RC_GM_ISNOT_GM;
pPlayer->SendPacket( &NakMsg, sizeof(NakMsg) );
}
}
// 公利惑怕肺 傈券
VOID Handler_CG_GM::OnCG_GM_UNDEAD_MODE_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_UNDEAD_MODE_SYN* pRecv = (MSG_CG_GM_UNDEAD_MODE_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if (!pPlayer) return;
if( !pPlayer->IsGMPlayer() ) return;
BOOL bUndeadOn = pPlayer->IsStatus(eCHAR_STATE_ETC_UNDEAD);
BOOL bSuccess = FALSE;
if( bUndeadOn )
{
// ON --> OFF
if (!pRecv->m_bUndeadOn)
{
pPlayer->GetStatusManager()->Remove( eCHAR_STATE_ETC_UNDEAD );
bSuccess = TRUE;
}
}
else
{
// OFF --> ON
if( pRecv->m_bUndeadOn )
{
pPlayer->GetStatusManager()->AllocStatus( eCHAR_STATE_ETC_UNDEAD );
bSuccess = TRUE;
}
}
if( bSuccess )
{
// ack
MSG_CG_GM_UNDEAD_MODE_ACK AckMsg;
AckMsg.m_bUndeadOn = pRecv->m_bUndeadOn;
pPlayer->SendPacket( &AckMsg, sizeof(AckMsg) );
}
else
{
// nak
MSG_CG_GM_UNDEAD_MODE_NAK NakMsg;
pPlayer->SendPacket( &NakMsg, sizeof(NakMsg) );
}
}
// 某腐磐 沥焊 夸没
VOID Handler_CG_GM::OnCG_GM_CHARINFO_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_CHARINFO_SYN* pRecv = (MSG_CG_GM_CHARINFO_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
// 秦寸 敲饭捞绢甫 茫绰促.
Player * pFindChar = NULL;
if( pRecv->m_dwUserID )
{
pFindChar = PlayerManager::Instance()->FindPlayer( pRecv->m_dwUserID );
}
else
{
TCHAR tszCharName[MAX_CHARNAME_LENGTH+1];
memcpy( tszCharName, pRecv->m_szCharName, sizeof(TCHAR)*MAX_CHARNAME_LENGTH );
tszCharName[MAX_CHARNAME_LENGTH] = '\0';
pFindChar = PlayerManager::Instance()->FindPlayer( tszCharName );
}
if( !pFindChar )
{
MSG_CG_GM_CHARINFO_NAK sendMsg;
sendMsg.m_byCategory = CG_GM;
sendMsg.m_byProtocol = CG_GM_CHARINFO_NAK;
pPlayer->SendPacket( &sendMsg, sizeof(sendMsg) );
return;
}
// 某腐磐 沥焊甫 舅妨霖促.
MSG_CG_GM_CHARINFO_ACK sendMsg;
sendMsg.m_byCategory = CG_GM;
sendMsg.m_byProtocol = CG_GM_CHARINFO_ACK;
sendMsg.m_eCharType = pFindChar->GetCharType();
sendMsg.m_wLevel = pFindChar->GetLevel();
sendMsg.m_Money = pFindChar->GetMoney();
pFindChar->GetPos( & sendMsg.m_vCurPos );
if( pFindChar->GetField() && pFindChar->GetField()->GetMap() )
{
GameZone *pZone = pFindChar->GetField()->GetMap()->GetGameZone();
sendMsg.m_RoomKey = pZone->GetKey();
sendMsg.m_MapCode = pFindChar->GetField()->GetMap()->GetMapCode();
}
pPlayer->SendPacket( &sendMsg, sizeof(sendMsg) );
}
// 酒捞袍 积己
VOID Handler_CG_GM::OnCG_GM_CREATE_ITEM_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_CREATE_ITEM_SYN* pRecv = (MSG_CG_GM_CREATE_ITEM_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( !pField ) return;
if( pRecv->m_dwItemCount > GM_MAX_CREATE_ITEM_NUM )
{
// NAK贸府 且 巴!!
return;
}
if( !ItemInfoParser::Instance()->GetItemInfo( pRecv->m_ItemCode ) )
{
// NAK贸府 且 巴!!
return;
}
// 冻绢哆副 困摹甫 茫绰促.
// 俺荐父怒 酒捞袍阑 鞘靛俊 冻绢哆赴促.
for( DWORD i = 0; i < pRecv->m_dwItemCount; ++i )
{
WzVector vDropPos = pPlayer->GetRandomPosInAround(2);
SCItemSlot slot;
slot.SetCode( pRecv->m_ItemCode );
//g_DropManager.DropItemToField( pField, &vDropPos, pPlayer->GetObjectKey(), 0, slot );
g_DropManager.DropItemToField( pField, &vDropPos, NULL, 0, slot );
}
}
// 牢镁飘 酒捞袍 积己
VOID Handler_CG_GM::OnCG_GM_CREATE_ENCHANT_ITEM_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_CREATE_ENCHANT_ITEM_SYN* pRecv = (MSG_CG_GM_CREATE_ENCHANT_ITEM_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( !pField ) return;
if( pRecv->m_dwItemCount > GM_MAX_CREATE_ITEM_NUM )
{
return;
}
if( !ItemInfoParser::Instance()->GetItemInfo( pRecv->m_ItemCode ) )
{
// NAK贸府 且 巴!!
return;
}
//牢镁飘 酒捞袍 饭骇 眉农
if( pRecv->m_byEnchant < 0 || pRecv->m_byEnchant > 12 )
{
return;
}
// 俺荐父怒 牢镁飘 酒捞袍阑 鞘靛俊 冻绢哆赴促.
for( DWORD i = 0; i < pRecv->m_dwItemCount; ++i )
{
WzVector vDropPos = pPlayer->GetRandomPosInAround(2);
SCItemSlot slot;
slot.SetSerial( TEMP_DBSERIAL_VALUE );
slot.SetCode( pRecv->m_ItemCode );
slot.SetEnchant( pRecv->m_byEnchant);
//g_DropManager.DropItemToField( pField, &vDropPos, pPlayer->GetObjectKey(), 0, slot );
g_DropManager.DropItemToField( pField, &vDropPos, NULL, 0, slot );
}
}
// 林函 鞘靛 酒捞袍甸阑 昏力
class DestroyItemAround
{
WzVector m_vOriginPos;
int m_iRange;
public:
DestroyItemAround( WzVector &vOriginPos, int iRange ) { m_vOriginPos = vOriginPos; m_iRange = iRange; }
~DestroyItemAround(){}
void operator() ( Item * pItem )
{
WzVector vItemPos;
pItem->GetPos( &vItemPos );
float fDist = VectorLength( &(vItemPos - m_vOriginPos) );
if( fDist <= m_iRange )
{
pItem->DestroyFromField();
}
}
};
VOID Handler_CG_GM::OnCG_GM_DESTROY_ITEM_AROUND_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_DESTROY_ITEM_AROUND_SYN* pRecv = (MSG_CG_GM_DESTROY_ITEM_AROUND_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( !pField ) return;
WzVector vPlayerPos;
pPlayer->GetPos( &vPlayerPos );
// 馆版 15m 郴狼 酒捞袍甸阑 昏力茄促.
DestroyItemAround DestroyItemOpr( vPlayerPos, 15 );
pField->ForeachNeighborFieldItemAt( pPlayer->GetSectorIndex(), DestroyItemOpr );
}
// 捣 积己
VOID Handler_CG_GM::OnCG_GM_CREATE_MONEY_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
MSG_CG_GM_CREATE_MONEY_SYN* pRecv = (MSG_CG_GM_CREATE_MONEY_SYN*)pMsg;
Player * pPlayer = PlayerManager::Instance()->FindPlayer( pRecv->m_dwKey );
if ( !pPlayer ) return;
if( !pPlayer->IsGMPlayer() ) return;
Field* pField = pPlayer->GetField();
if( !pField ) return;
if( pRecv->m_Money > GM_MAX_CREATE_MONEY || pRecv->m_Money <= 0 )
{
return;
}
// 冻绢哆副 困摹甫 茫绰促.
WzVector vDropPos = pPlayer->GetRandomPosInAround(2);
// 捣阑 冻绢哆赴促.
g_DropManager.DropMoneyToField( pField, &vDropPos, NULL, 0, pRecv->m_Money );
}
// 饭骇诀
VOID Handler_CG_GM::OnCG_GM_LEVEL_UP_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -