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

📄 sector.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
VOID Sector::OnSendAddPlayer( Player * pPlayer, BOOL bVillage )
{
	if( bVillage )
	{
		//MSG_CG_SYNC_ALLMONSTERS_CMD * pMonsterMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLMONSTERS_CMD>());
		MSG_CG_SYNC_VILLAGE_PLAYER_ENTER_BRD *pEnterBrdMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_VILLAGE_PLAYER_ENTER_BRD>());
		//MSG_CG_SYNC_VILLAGE_PLAYER_ENTER_BRD *pEnterBrdMsg = (MSG_CG_SYNC_VILLAGE_PLAYER_ENTER_BRD *)m_VarMsg.StartPtr();
//		pEnterBrdMsg->m_byCategory = CG_SYNC;
//		pEnterBrdMsg->m_byProtocol = CG_SYNC_VILLAGE_PLAYER_ENTER_BRD;
	///	m_wSize[0] = pEnterBrdMsg->GetSize();
		m_VarMsg.SetSize(pEnterBrdMsg->GetSize());

		// RenderInfo 沥焊 悸泼
		PLAYER_VILLAGE_INFO *pRenderMsg = (PLAYER_VILLAGE_INFO*)m_VarMsg.NextPtr();
		pPlayer->GetPlayerVillageInfo( pRenderMsg );
		m_VarMsg.SetSize(pRenderMsg->GetSize());
	///	m_wSize[1] = pRenderMsg->GetSize();
	}
	else
	{
		MSG_CG_SYNC_PLAYER_ENTER_BRD *pEnterBrdMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_PLAYER_ENTER_BRD>());
//		MSG_CG_SYNC_PLAYER_ENTER_BRD *pEnterBrdMsg = (MSG_CG_SYNC_PLAYER_ENTER_BRD *)m_VarMsg.StartPtr();
//		pEnterBrdMsg->m_byCategory = CG_SYNC;
//		pEnterBrdMsg->m_byProtocol = CG_SYNC_PLAYER_ENTER_BRD;
		//m_wSize[0] = pEnterBrdMsg->GetSize();
		m_VarMsg.SetSize(pEnterBrdMsg->GetSize());

		// RenderInfo 沥焊 悸泼
		PLAYER_RENDER_INFO *pRenderMsg = (PLAYER_RENDER_INFO*)m_VarMsg.NextPtr();
		pPlayer->GetPlayerRenderInfo( pRenderMsg );
		//m_wSize[1] = pRenderMsg->GetSize();
		m_VarMsg.SetSize(pRenderMsg->GetSize());
	}

	// 辨靛 沥焊 悸泼
	GUILD_RENDER_INFO *pGuildRenderInfo = (GUILD_RENDER_INFO*)m_VarMsg.NextPtr();
	pPlayer->GetGuildRenderInfo( pGuildRenderInfo );
	//m_wSize[2] = pGuildRenderInfo->GetSize();
	m_VarMsg.SetSize(pGuildRenderInfo->GetSize());

	// 厘馒 沥焊 悸泼
	EQUIP_ITEM_BASEINFO *pEquipMsg = (EQUIP_ITEM_BASEINFO*)m_VarMsg.NextPtr();
	pEquipMsg->m_dwObjectKey = pPlayer->GetObjectKey();

	ITEMSLOT *pItemSlot = (ITEMSLOT*)( (BYTE*)pEquipMsg + sizeof(EQUIP_ITEM_BASEINFO) );
	pEquipMsg->m_Count = pPlayer->SerializeEquipItemBaseInfo( pItemSlot );
	//m_wSize[3] = pEquipMsg->GetSize();
	m_VarMsg.SetSize(pEquipMsg->GetSize());

	SendExPacketToSectorExceptMe( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr(), pPlayer->GetObjectKey() );

}


VOID Sector::OnSendRemovePlayer(Player *pPlayer)// Player狼 力芭 菩哦 焊晨
{
	// Sector俊 乐绰 Player甸俊霸 力芭 菩哦阑 焊晨(磊扁 磊脚篮 力寇茄 冀磐俊 乐绰 葛电 Player甸阑 葛酒辑 啊函菩哦栏肺)

	// 磊扁 磊脚狼 栋巢阑 林函 敲饭捞绢甸俊霸 傈价!!=> 瞒饶 ChangeField甫 烹秦 贸府且 版快绰 PlayerManager狼 Send啊 酒聪扼 Sector狼 m_PlayerList俊辑 Send!!

	MSG_CG_SYNC_PLAYER_LEAVE_BRD brdMsg;
	brdMsg.m_byCount = 1;
	brdMsg.m_dwObjectKey[0] = pPlayer->GetObjectKey();

	/// 磊扁磊脚阑 力寇窍绊!!!!
	SendPacketToSectorExceptMe( &brdMsg, brdMsg.GetSize(), pPlayer->GetObjectKey() );
}


VOID Sector::OnSendAddNPC( NPC *pNPC ) // NPC狼 眠啊 菩哦 焊晨
{

	MSG_CG_SYNC_MONSTER_ENTER_BRD * pBrdMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_MONSTER_ENTER_BRD>());
	//MSG_CG_SYNC_MONSTER_ENTER_BRD * pBrdMsg = (MSG_CG_SYNC_MONSTER_ENTER_BRD *)m_VarMsg.StartPtr();
	//pBrdMsg->m_byCategory = CG_SYNC;
	//pBrdMsg->m_byProtocol = CG_SYNC_MONSTER_ENTER_BRD;
	m_VarMsg.SetSize(pBrdMsg->GetSize());

	// RenderInfo 沥焊 悸泼
	MONSTER_RENDER_INFO *pRenderMsg = (MONSTER_RENDER_INFO*)m_VarMsg.NextPtr();
	pNPC->GetNPCRenderInfo( pRenderMsg );
	m_VarMsg.SetSize(pRenderMsg->GetSize());

	SendExPacketToSector( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
}

VOID Sector::OnSendAddNPC_Dir( NPC *pNPC, WORD wAngle ) // NPC狼 眠啊 菩哦 焊晨 - 积己瞪 锭 规氢 啊瘤绰 版快
{
	MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD * pBrdMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD>());
	//MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD * pBrdMsg = (MSG_CG_SYNC_MONSTER_DIR_ENTER_BRD *)m_VarMsg.StartPtr();
	//pBrdMsg->m_byCategory = CG_SYNC;
	//pBrdMsg->m_byProtocol = CG_SYNC_MONSTER_DIR_ENTER_BRD;
	pBrdMsg->wAngle = wAngle;
	//m_wSize[0] = (WORD)pBrdMsg->GetSize();
	m_VarMsg.SetSize(pBrdMsg->GetSize());

	// RenderInfo 沥焊 悸泼
	MONSTER_RENDER_INFO * pRenderMsg = (MONSTER_RENDER_INFO *)m_VarMsg.NextPtr();
	pNPC->GetNPCRenderInfo( pRenderMsg );
	//m_wSize[1] = pRenderMsg->GetSize();
	m_VarMsg.SetSize(pRenderMsg->GetSize());

	SendExPacketToSector( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
	
}

VOID Sector::OnSendRemoveNPC( NPC *pNPC )// NPC狼 力芭 菩哦 焊晨
{
	// Sector俊 乐绰 Player甸俊霸 力芭 菩哦阑 焊晨
	MSG_CG_SYNC_MONSTER_LEAVE_BRD BrdMsg;
	BrdMsg.m_byCount = 1;
	BrdMsg.m_dwObjectKey[0] = pNPC->GetObjectKey();

	SendPacketToSector( &BrdMsg, BrdMsg.GetSize() );
}

VOID Sector::OnSendAddFieldItem( Item *pItem )// FieldItem狼 眠啊 菩哦 焊晨
{
	MSG_CG_SYNC_FIELDITEM_ENTER_BRD BrdMsg;
	BrdMsg.m_dwFromMonsterKey = pItem->GetFromMonsterKey();
	pItem->GetItemRenderInfo( BrdMsg.m_ItemRenderInfo );

	SendPacketToSector( &BrdMsg, sizeof(MSG_CG_SYNC_FIELDITEM_ENTER_BRD) );
}

VOID Sector::OnSendRemoveFieldItem(Item *pItem)// FieldItem狼 力芭 菩哦 焊晨
{
	MSG_CG_SYNC_FIELDITEM_LEAVE_BRD BrdMsg;
	BrdMsg.m_byCount = 1;
	BrdMsg.m_dwObjectKey[0] = pItem->GetObjectKey();

	SendPacketToSector( &BrdMsg, BrdMsg.GetSize() );
}


RC::ePACKET_SEND_RESULT Sector::SendPacketToSector( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
	return SendPacketToSectorExceptMe( pMsg, wSize, 0 );
}

RC::ePACKET_SEND_RESULT Sector::SendPacketToSectorExceptMe( MSG_BASE_FORWARD * pMsg, WORD wSize, DWORD dwMyObjKey )
{
	Player *pPlayer = NULL;
	m_pPlayerHashTable->SetFirst();
	while( pPlayer = m_pPlayerHashTable->GetNext() )
	{
		if( dwMyObjKey == pPlayer->GetObjectKey() )		continue;

		pPlayer->SendPacket( pMsg, wSize );
	}
	return RC::RC_SEND_SUCCESS;
}

RC::ePACKET_SEND_RESULT Sector::SendExPacketToSector( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize )
{
	return SendExPacketToSectorExceptMe( dwNumberOfMessages, pMsg, pwSize, 0 );
}

RC::ePACKET_SEND_RESULT Sector::SendExPacketToSectorExceptMe( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize, DWORD dwMyObjKey )
{
	Player *pPlayer = NULL;
	m_pPlayerHashTable->SetFirst();
	while( pPlayer = m_pPlayerHashTable->GetNext() )
	{
		if( dwMyObjKey == pPlayer->GetObjectKey() )	continue;

		pPlayer->SendExPacket( dwNumberOfMessages, pMsg, pwSize );
	}
	return RC::RC_SEND_SUCCESS;
}


Object* Sector::FindObject( eOBJECT_TYPE eObjecType, DWORD dwObjectKey )
{
	switch( eObjecType )
	{
	case PLAYER_OBJECT:
		{
			return m_pPlayerHashTable->GetData( dwObjectKey );
		}
		break;
	case NPC_OBJECT:	case MONSTER_OBJECT:	case SUMMON_OBJECT:		case MAPNPC_OBJECT:
		{
			return m_pNPCHashTable->GetData( dwObjectKey );
		}
		break;
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			return m_pFieldItemHashTable->GetData( dwObjectKey );
		}
		break;
	default:
		{
			SUNLOG( eCRITICAL_LOG,  "[Sector::FindObject] Invalid ObjectKey! " );
			return NULL;
		}
	}
}

VOID Sector::SendAIMessageToSectorExceptMe( Object *pObject, AI_MSG *pMsg, WORD wSize )
{
	NPC *pNPC = NULL;
	m_pNPCHashTable->SetFirst();
	while( pNPC = m_pNPCHashTable->GetNext() )
	{
		if( pNPC == pObject ) 	continue;

		pNPC->SendAIMessage( pMsg, wSize );
	}
}

class RangeCheckByAttackerOperator
{
	BYTE				m_byCount;

	eSKILL_TARGET_TYPE	m_eTargetType;
	BYTE				m_byCountLimit;
	Character**			m_pTargetArray;
	Character*			m_pAttacker;
	WzVector&			m_vMainTargetPos;
	float				m_fRange;
	unsigned int		m_uiRangeForm;
	float				m_fArea;
	DWORD				m_dwExceptTargetKey;

public:
	RangeCheckByAttackerOperator( eSKILL_TARGET_TYPE eTargetType, Character* pAttacker, Character** pTargetArray, WzVector &vMainTargetPos, 
		float fRange, unsigned int uiRangeForm, float fArea, BYTE byCountLimit, DWORD dwExceptTargetKey )
		: m_eTargetType(eTargetType), m_pAttacker(pAttacker), m_pTargetArray(pTargetArray), m_vMainTargetPos(vMainTargetPos), m_fRange(fRange), 
		m_uiRangeForm(uiRangeForm), m_fArea(fArea), m_byCountLimit(byCountLimit), m_dwExceptTargetKey(dwExceptTargetKey), m_byCount(0) {}

	BYTE GetCount()	{ return m_byCount; }

	VOID operator () ( Character* pTarget )
	{
		if( m_byCount >= m_byCountLimit )						return;
		if( pTarget->GetObjectKey() == m_dwExceptTargetKey )	return;

		// 鸥百鸥涝 眉农
		if( !m_pAttacker->IsCoincidentWithTargetType( pTarget, m_eTargetType ) )
			return;

		// 胶懦 荤芭府 眉农
		WzVector vTargetPos;	pTarget->GetPos( &vTargetPos );
		if( m_fRange && !m_pAttacker->CheckSkillRange( vTargetPos, m_fRange ) )		return;

		// 胶懦 Area 眉农
		if( !m_pAttacker->CheckArea( vTargetPos, m_vMainTargetPos, m_uiRangeForm, m_fArea ) )	return;

		m_pTargetArray[m_byCount] = pTarget;
		++m_byCount;
	}
};

BYTE Sector::FindTargetsByAttacker( eSKILL_TARGET_TYPE eTargetType, Character* pAttacker, Character** pTargetArray, 
								   WzVector &vMainTargetPos, float fRange, unsigned int uiRangeForm, 
								   float fArea, BYTE byCountLimit, DWORD dwExceptTargetKey )
{
	// 敲饭捞绢, NPC 府胶飘俊辑 茫绰促.
	RangeCheckByAttackerOperator RangeCheckOpr( eTargetType, pAttacker, pTargetArray, vMainTargetPos, fRange, uiRangeForm, fArea, byCountLimit, dwExceptTargetKey );
	ForeachPlayer( RangeCheckOpr );
	ForeachNPC( RangeCheckOpr );

	return RangeCheckOpr.GetCount();
}

class RangeCheckByPositionOperator
{
	BYTE			m_byCount;
	Character**		m_pTargetArray;
	WzVector&		m_vMainPos;
	float			m_fRange;
	BYTE			m_byCountLimit;

public:
	RangeCheckByPositionOperator( Character** pTargetArray, WzVector &vMainPos, float fRange, BYTE byCountLimit )
		: m_pTargetArray(pTargetArray), m_vMainPos(vMainPos), m_fRange(fRange), m_byCount(0), m_byCountLimit(byCountLimit) {}

		BYTE GetCount()	{ return m_byCount; }

		VOID operator () ( Character* pTarget )
		{
			if( m_byCount >= m_byCountLimit )	return;
			if( pTarget->IsDead() )				return;

			WzVector vTargetPos;
			pTarget->GetPos( &vTargetPos );

			// 芭府 眉农
			AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
			if( m_fRange && Math_VectorLength( m_vMainPos, vTargetPos ) > m_fRange + stAIParamInfo.m_fRANGE_TOLERANCE )	return;

			m_pTargetArray[m_byCount] = pTarget;
			++m_byCount;
		}
};

BYTE Sector::FindTargetsByPosition( Character** pTargetArray, WzVector &vMainPos, float fRange, BYTE byCountLimit )
{
	// 敲饭捞绢, NPC 府胶飘俊辑 茫绰促.
	RangeCheckByPositionOperator RangeCheckOpr( pTargetArray, vMainPos, fRange, byCountLimit );
	ForeachPlayer( RangeCheckOpr );
	ForeachNPC( RangeCheckOpr );

	return RangeCheckOpr.GetCount();
}

VOID Sector::IncreaseReferencePlayer( Object *pObject )
{
	if( ( pObject->GetObjectType() & PLAYER_OBJECT ) == PLAYER_OBJECT )
	{
		m_iPlayerReferenceCount++;


		m_pNPCHashTable->SetFirst();
		while( NPC * pNPC = m_pNPCHashTable->GetNext() )
		{
			pNPC->SetReferencePlayerNum( m_iPlayerReferenceCount );
		}
	}
}

VOID Sector::DecreaseReferencePlayer( Object *pObject )
{
	if( ( pObject->GetObjectType() & PLAYER_OBJECT ) == PLAYER_OBJECT )
	{
		m_iPlayerReferenceCount--;
		m_iPlayerReferenceCount = max( 0, m_iPlayerReferenceCount );

		m_pNPCHashTable->SetFirst();
		while( NPC *pNPC = m_pNPCHashTable->GetNext() )
		{
			pNPC->SetReferencePlayerNum( m_iPlayerReferenceCount );
		}
	}
}

VOID Sector::OnSendAllPlayersInfo( Player *pPlayer, BOOL bVillage )
{
	MSG_CG_SYNC_VILLAGE_ALLPLAYERS_CMD * pAllPlayersMsg_Village = NULL;
	MSG_CG_SYNC_ALLPLAYERS_CMD * pAllPlayersMsg = NULL;
	BYTE MAX_PACKET_COUNT = 0;
	if( bVillage )
	{
		//pAllPlayersMsg_Village = (MSG_CG_SYNC_VILLAGE_ALLPLAYERS_CMD *)m_VarMsg.StartPtr();
		//pAllPlayersMsg_Village->m_byCategory = CG_SYNC;
		//pAllPlayersMsg_Village->m_byProtocol = CG_SYNC_VILLAGE_ALLPLAYERS_CMD;
		pAllPlayersMsg_Village = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_VILLAGE_ALLPLAYERS_CMD>());
		//m_wSize[0] = (WORD)pAllPlayersMsg_Village->GetSize();
		m_VarMsg.SetSize( pAllPlayersMsg_Village->GetSize() );

		MAX_PACKET_COUNT = MSG_CG_SYNC_VILLAGE_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE;
	}
	else
	{
		//pAllPlayersMsg = (MSG_CG_SYNC_ALLPLAYERS_CMD *)m_VarMsg.StartPtr();
		//pAllPlayersMsg->m_byCategory = CG_SYNC;
		//pAllPlayersMsg->m_byProtocol = CG_SYNC_ALLPLAYERS_CMD;
		pAllPlayersMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLPLAYERS_CMD>());
		//m_wSize[0] = (WORD)pAllPlayersMsg->GetSize();
		m_VarMsg.SetSize( pAllPlayersMsg->GetSize() );

		MAX_PACKET_COUNT = MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE;
	}

	BYTE byPlayerCount = 0;
	Player *pTmpPlayer = NULL;
	for( SECTOR_PLAYER_HASH_ITR it = m_pPlayerHashTable->begin() ; it != m_pPlayerHashTable->end() ; ++it )
	{
		pTmpPlayer = (*it);
		if( pPlayer->GetObjectKey() == pTmpPlayer->GetObjectKey() ) continue;

		// PLAYER_RENDER_INFO甫 盲款促.
		if( bVillage )
		{
			PLAYER_VILLAGE_INFO *pResultMsg = (PLAYER_VILLAGE_INFO*)m_VarMsg.NextPtr();
			pTmpPlayer->GetPlayerVillageInfo( pResultMsg );
			//m_wSize[byCnt] = pResultMsg->GetSize();
			m_VarMsg.SetSize( pResultMsg->GetSize() );
		}
		else
		{
			PLAYER_RENDER_INFO *pResultMsg = (PLAYER_RENDER_INFO*)m_VarMsg.NextPtr();
			pTmpPlayer->GetPlayerRenderInfo( pResultMsg );
			//m_wSize[byCnt] = pResultMsg->GetSize();
			m_VarMsg.SetSize( pResultMsg->GetSize() );
		}

		// 辨靛 沥焊 悸泼
		GUILD_RENDER_INFO *pGuildRenderInfo = (GUILD_RENDER_INFO*)m_VarMsg.NextPtr();
		pTmpPlayer->GetGuildRenderInfo( pGuildRenderInfo );
		//m_wSize[2] = pGuildRenderInfo->GetSize();
		m_VarMsg.SetSize(pGuildRenderInfo->GetSize());

		++byPlayerCount;

		if( byPlayerCount == MAX_PACKET_COUNT )
		{
			if( bVillage )	pAllPlayersMsg_Village->m_byCount = byPlayerCount;
			else			pAllPlayersMsg->m_byCount =byPlayerCount;
			pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );

			if( bVillage )
			{
				pAllPlayersMsg_Village = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_VILLAGE_ALLPLAYERS_CMD>());
				m_VarMsg.SetSize( pAllPlayersMsg_Village->GetSize() );
			}
			else
			{
				pAllPlayersMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLPLAYERS_CMD>());
				m_VarMsg.SetSize( pAllPlayersMsg->GetSize() );
			}
			byPlayerCount = 0;

		}/*

		if( m_VarMsg.GetMsgCount() == MSG_CG_SYNC_ALLPLAYERS_CMD::_MAX_PLAYER_INFO_SIZE + 1 )
		{
			if( bVillage )	pAllPlayersMsg_Village->m_byCount = m_VarMsg.GetMsgCount()-1;
			else			pAllPlayersMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
			pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
		}
		*/
	}

	if( byPlayerCount > 0 )
	{
		if( bVillage )	pAllPlayersMsg_Village->m_byCount = byPlayerCount;
		else			pAllPlayersMsg->m_byCount = byPlayerCount;
		pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
	}
/*
	if( m_VarMsg.GetMsgCount() > 1 )
	{
		if( bVillage )	pAllPlayersMsg_Village->m_byCount = m_VarMsg.GetMsgCount()-1;
		else			pAllPlayersMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
		pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
	}*/

}

VOID Sector::OnSendSummonedInfo( Player *pPlayer, NPC *pNearNPC )
{
	if( (pNearNPC->GetObjectType() & SUMMON_OBJECT) != SUMMON_OBJECT )	return;

	Summoned *pSummoned = (Summoned*)pNearNPC;
	SummonedNPCs *pSummonedNPCs = SummonManager::Instance()->FindSummonNPCs( pSummoned->GetSummonerKey() );
	if( !pSummonedNPCs )	return;

	// 家券沥焊甫 舅妨霖促.
	MSG_CG_SUMMON_SKILL_RESULT_BRD BrdMsg;
	BrdMsg.m_byCurCommand = pSummonedNPCs->GetCommandState();
	BrdMsg.m_dwSummonerObjKey = pSummoned->GetSummonerKey();
	BrdMsg.m_bySummonedNum = 1;
	BrdMsg.m_dwSummonedObjKey[0] = pSummoned->GetObjectKey();

	if( pPlayer )
	{
		pPlayer->SendPacket( &BrdMsg, BrdMsg.GetSize() );
	}
	else
	{
		SendPacketToSector( &BrdMsg, BrdMsg.GetSize() );
	}
}














⌨️ 快捷键说明

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