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

📄 handler_cg_gm.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -