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

📄 sector.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "Sector.h"
#include <math.h>
#include <PacketStruct_AG.h>
#include <PacketStruct_CG.h>
#include <VarPacket.h>
#include "ObjectFactory.h"
#include "Object.h"
#include "Player.h"
#include "NPC.h"
#include "Monster.h"
#include "Item.h"
#include "PlayerManager.h"
#include "ItemManager.h"
#include "PublicMath.h"
#include "AIParamParser.h"
#include "SummonManager.h"
#include "Summoned.h"
#include "SummonedNPCs.h"


VarMsg Sector::m_VarMsg;

Sector::Sector()
{
	m_pPlayerHashTable = new util::SolarHashTable<Player*>;
	m_pPlayerHashTable->Initialize( DEFAULT_OBJECT_POOL_SIZE );
	m_pNPCHashTable = new util::SolarHashTable<NPC*>;
	m_pNPCHashTable->Initialize( DEFAULT_OBJECT_POOL_SIZE );
	m_pFieldItemHashTable = new util::SolarHashTable<Item*>;
	m_pFieldItemHashTable->Initialize( DEFAULT_OBJECT_POOL_SIZE );
}

Sector::~Sector()
{
	// NPC 府胶飘俊 乐绰 按眉甸篮 咯扁辑 秦力秦拎具 茄促.
	/*
	NPC *pNPC = NULL;
	m_pNPCHashTable->SetFirst();
	while( pNPC = m_pNPCHashTable->GetNext() )
	{
		ObjectFactory::Instance()->FreeObject( (Object*)pNPC );
	}
	*/

	SAFE_DELETE( m_pPlayerHashTable );
	SAFE_DELETE( m_pNPCHashTable );
	SAFE_DELETE( m_pFieldItemHashTable );
}

VOID Sector::Init( DWORD dwSectorIndex, WORD wGroupIndex )
{
	m_dwSectorIndex = dwSectorIndex;
	m_wGroupIndex = wGroupIndex;
	m_iPlayerReferenceCount = 0;
}

VOID Sector::Release()
{
	m_pPlayerHashTable->clear();
	m_pNPCHashTable->clear();

	for( SECTOR_ITEM_HASH_ITR it = m_pFieldItemHashTable->begin() ; it != m_pFieldItemHashTable->end() ; ++it )
	{
		ObjectFactory::Instance()->FreeObject( (Object*)(*it) );
	}
	m_pFieldItemHashTable->clear();
}

VOID Sector::Update( DWORD dwDeltaTick )
{
	NPC *pNPC = NULL;
	Player *pPlayer = NULL;
	Item *pItem = NULL;
	for( SECTOR_PLAYER_HASH_ITR it = m_pPlayerHashTable->begin() ; it != m_pPlayerHashTable->end() ; ++it )
	{
		pPlayer = (*it);
		pPlayer->Update( dwDeltaTick );
	}
	for( SECTOR_ITEM_HASH_ITR it = m_pFieldItemHashTable->begin() ; it != m_pFieldItemHashTable->end() ; ++it )
	{
		pItem = (*it);
		pItem->Update( dwDeltaTick );
	}
	for( SECTOR_NPC_HASH_ITR it = m_pNPCHashTable->begin() ; it != m_pNPCHashTable->end() ; ++it )
	{
		pNPC = (*it);
		pNPC->Update( dwDeltaTick );
	}
}

RC::eSECTOR_REULT Sector::AddObject( Object *pObject, BOOL bEnterField )
{
	switch(pObject->GetObjectType())
	{
	case PLAYER_OBJECT :
		{
			Player *pPlayer = m_pPlayerHashTable->GetData( pObject->GetObjectKey() );
			if( pPlayer )	return RC::RC_SECTOR_ADD_FAILED;
			pPlayer = (Player*)pObject;

			m_pPlayerHashTable->Add( pPlayer, pPlayer->GetObjectKey() );

			if( bEnterField )
			{
				MSG_AG_SYNC_PLAYER_ENTER_ACK msg;
				WzVector wzVec;
				pPlayer->GetPos(&wzVec);
				msg.m_fPos[0] = wzVec.x;	msg.m_fPos[1] = wzVec.y;	msg.m_fPos[2] = wzVec.z;
				pPlayer->SendPacket( &msg, sizeof(msg) );

				//SUNLOG( eFULL_LOG,  "[ID:%d]:MSG_AG_SYNC_PLAYER_ENTER_ACK焊晨", pPlayer->GetObjectKey() );
			}
			break;
		}
	case MONSTER_OBJECT:	case SUMMON_OBJECT:		case MAPNPC_OBJECT:
		{
			NPC *pNPC = m_pNPCHashTable->GetData( pObject->GetObjectKey() );
			if( pNPC )	return RC::RC_SECTOR_ADD_FAILED;
			pNPC = (NPC*)pObject;

			// 泅犁 冀磐狼 敲饭捞绢 饭欺繁胶 墨款飘甫 NPC尔 老摹矫挪促.
			pNPC->SetReferencePlayerNum( m_iPlayerReferenceCount );

			m_pNPCHashTable->Add( pNPC, pNPC->GetObjectKey() );
			break;
		}
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			Item *pItem = m_pFieldItemHashTable->GetData( pObject->GetObjectKey() );
			if( pItem )	return RC::RC_SECTOR_ADD_FAILED;
			pItem = (Item *)pObject;

			m_pFieldItemHashTable->Add( pItem, pItem->GetObjectKey() );
			break;
		}
	default: 
		return RC::RC_SECTOR_ADD_FAILED;
	}//End of switch

	return RC::RC_SECTOR_ADD_SUCCESS;
}

RC::eSECTOR_REULT Sector::RemoveObject( Object* pObject )
{
	switch(pObject->GetObjectType())
	{
	case PLAYER_OBJECT:
		{
			if( m_pPlayerHashTable->GetData( pObject->GetObjectKey() ) )
			{
				m_pPlayerHashTable->Remove( pObject->GetObjectKey() );
			}
			else
			{
				SASSERT( NULL, "刮宽阑 阂矾林技夸!" );
				return RC::RC_SECTOR_REMOVE_FAILED;
			}
			break;
		}
	case MONSTER_OBJECT:	case SUMMON_OBJECT:		case MAPNPC_OBJECT:
		{	
			if( m_pNPCHashTable->GetData( pObject->GetObjectKey() ) )
			{
				m_pNPCHashTable->Remove( pObject->GetObjectKey() );
			}
			else
			{
				return RC::RC_SECTOR_REMOVE_FAILED;
			}
			break;
		}
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			if( m_pFieldItemHashTable->GetData( pObject->GetObjectKey() ) )
			{
				m_pFieldItemHashTable->Remove( pObject->GetObjectKey() );
			}
			else
			{
				return RC::RC_SECTOR_REMOVE_FAILED;
			}
			break;	
		}
	default:
		{	
			return RC::RC_SECTOR_REMOVE_FAILED;
		}
	}//End of switch

	return RC::RC_SECTOR_REMOVE_SUCCESS;
}

// 按眉 火涝, 昏力甫 林函俊 舅覆
RC::ePACKET_SEND_RESULT Sector::SendAddObject( Object * pObject, BOOL bVillage )
{
	switch(pObject->GetObjectType())
	{
	case PLAYER_OBJECT :
		{
			OnSendAddPlayer( (Player *)pObject, bVillage );
		}
		break;
	case MONSTER_OBJECT:	case MAPNPC_OBJECT:
		{
			OnSendAddNPC( (NPC*)pObject );
		}
		break;
	case SUMMON_OBJECT:
		{
			OnSendAddNPC( (NPC*)pObject );

			// 家券沥焊甫 舅妨霖促.
			OnSendSummonedInfo( NULL, (NPC*)pObject );
		}
		break;
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			OnSendAddFieldItem( (Item *)pObject );
		}
		break;
	default:
		return RC::RC_SEND_FAILED;
	}

	return RC::RC_SEND_SUCCESS;
}

// 按眉 火涝, 昏力甫 林函俊 舅覆(规氢 器窃)
RC::ePACKET_SEND_RESULT Sector::SendAddObject_Dir( Object * pObject, WORD wAngle )
{
	switch(pObject->GetObjectType())
	{
	case PLAYER_OBJECT :
		{
			OnSendAddPlayer( (Player *)pObject );
		}
		break;
	case MONSTER_OBJECT:	case SUMMON_OBJECT:
		{
			OnSendAddNPC_Dir( (NPC*)pObject, wAngle );
		}
		break;
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			OnSendAddFieldItem( (Item *)pObject );
		}
		break;
	default:
		return RC::RC_SEND_FAILED;
	}

	return RC::RC_SEND_SUCCESS;
}

RC::ePACKET_SEND_RESULT Sector::SendRemoveObject( Object * pObject )
{
	switch(pObject->GetObjectType())
	{
	case PLAYER_OBJECT :
		{
			OnSendRemovePlayer( (Player *)pObject );
		}
		break;
	case MONSTER_OBJECT:	case SUMMON_OBJECT:		case MAPNPC_OBJECT:
		{
			OnSendRemoveNPC( (NPC*)pObject );
		}
		break;
	case MONEY_OBJECT:
	case ITEM_OBJECT:
		{
			OnSendRemoveFieldItem( (Item *)pObject );
		}
		break;
	default:
		return RC::RC_SEND_FAILED;
	}
	return RC::RC_SEND_SUCCESS;
}

// 脚痹 冀磐 沥焊 眠啊(敲饭捞绢俊霸 舅覆)
VOID Sector::SendAddSectorInfo( Object *pObject, BOOL bVillage )
{
	if( ( pObject->GetObjectType() & PLAYER_OBJECT ) != PLAYER_OBJECT )		return;

	Player *pPlayer = (Player*)pObject;

	// 林函 敲饭捞绢 沥焊(RenderInfo)
	OnSendAllPlayersInfo( pPlayer, bVillage );


	MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD * pEquipMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD>());
	//MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD * pEquipMsg = (MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD *)m_VarMsg.StartPtr();
	//pEquipMsg->m_byCategory = CG_SYNC;
	//pEquipMsg->m_byProtocol = CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD;
	m_VarMsg.SetSize( pEquipMsg->GetSize() );

	//BYTE byCnt = 1;
	Player *pTmpPlayer = NULL;
	for( SECTOR_PLAYER_HASH_ITR pit = m_pPlayerHashTable->begin() ; pit != m_pPlayerHashTable->end() ; ++pit )
	{
		pTmpPlayer = (*pit);
		if( pPlayer->GetObjectKey() == pTmpPlayer->GetObjectKey() ) continue;

		// 扁夯 EQUIP_ITEM_BASEINFO甫 盲款促.
		EQUIP_ITEM_BASEINFO *pResultMsg = (EQUIP_ITEM_BASEINFO*)m_VarMsg.NextPtr();
		pResultMsg->m_dwObjectKey = pTmpPlayer->GetObjectKey();

		// ITEMSLOT阑 盲款促.
		ITEMSLOT *pItemSlot = (ITEMSLOT*)( (BYTE*)pResultMsg + sizeof(EQUIP_ITEM_BASEINFO) );
		pResultMsg->m_Count = pTmpPlayer->SerializeEquipItemBaseInfo( pItemSlot );
		m_VarMsg.SetSize(pResultMsg->GetSize());

		if( m_VarMsg.GetMsgCount() == (MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD::_MAX_PLAYER_INFO_SIZE + 1) )
		{
			pEquipMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
			pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
			// 皋技瘤 檬扁拳
			pEquipMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLPLAYERS_EQUIPINFO_CMD>());
			m_VarMsg.SetSize( pEquipMsg->GetSize() );
		}
	}

	if( m_VarMsg.GetMsgCount() > 1 )
	{
		pEquipMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
		//pPlayer->SendExPacket( byCnt, (BYTE**)m_ppMsg, m_wSize );
		pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
		//byCnt = 1;
	}


	// 林函 阁胶磐 沥焊
	MSG_CG_SYNC_ALLMONSTERS_CMD * pMonsterMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLMONSTERS_CMD>());
	m_VarMsg.SetSize( pMonsterMsg->GetSize() );

	//byCnt = 1;
	NPC *pTmpNPC = NULL;
	for( SECTOR_NPC_HASH_ITR nit = m_pNPCHashTable->begin() ; nit != m_pNPCHashTable->end() ; ++nit )
	{
		pTmpNPC = (*nit);
		MONSTER_RENDER_INFO *pResultMsg = (MONSTER_RENDER_INFO*)m_VarMsg.NextPtr();
		pTmpNPC->GetNPCRenderInfo( pResultMsg );
		m_VarMsg.SetSize( pResultMsg->GetSize() );

		if( m_VarMsg.GetMsgCount() == (MSG_CG_SYNC_ALLMONSTERS_CMD::_MAX_MONSTER_INFO_SIZE+1) )
		{
			pMonsterMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
			pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );

			pMonsterMsg = m_VarMsg.StartTypePtr(Param2Class<MSG_CG_SYNC_ALLMONSTERS_CMD>());
			m_VarMsg.SetSize( pMonsterMsg->GetSize() );
		}
	}

	if( m_VarMsg.GetMsgCount() > 1 )
	{
		pMonsterMsg->m_byCount = m_VarMsg.GetMsgCount()-1;
		pPlayer->SendExPacket( m_VarMsg.GetMsgCount(), m_VarMsg.GetMsgPPtr(), m_VarMsg.GetMsgSizePtr() );
	}

	// 家券眉啊 乐阑 版快俊绰 蝶肺 家券眉 沥焊甫 焊郴霖促.
	for( SECTOR_NPC_HASH_ITR nit = m_pNPCHashTable->begin() ; nit != m_pNPCHashTable->end() ; ++nit )
	{
		pTmpNPC = (*nit);
		OnSendSummonedInfo( pPlayer, pTmpNPC );
	}

	// 林函 酒捞袍 沥焊
	MSG_CG_SYNC_ALLFIELDITEMS_CMD itemMsg;

	BYTE byCnt = 0;
	Item *pTmpItem = NULL;
	for( SECTOR_ITEM_HASH_ITR iit = m_pFieldItemHashTable->begin() ; iit != m_pFieldItemHashTable->end() ; ++iit )
	{
		pTmpItem = (*iit);
		pTmpItem->GetItemRenderInfo( itemMsg.m_pFieldItemRenderInfo[byCnt] );
		++byCnt;
		if( byCnt == MSG_CG_SYNC_ALLFIELDITEMS_CMD::_MAX_FIELDITEM_INFO_SIZE )
		{
			itemMsg.m_byCount = byCnt;
			pPlayer->SendPacket( &itemMsg, (WORD)itemMsg.GetSize() );
			byCnt = 0;
		}
	}

	if( byCnt != 0 )
	{
		itemMsg.m_byCount = byCnt;
		pPlayer->SendPacket( &itemMsg, (WORD)itemMsg.GetSize() );
	}
}

// 脚痹 冀磐 沥焊 昏力(敲饭捞绢俊霸 舅覆)
VOID Sector::SendDelSectorInfo( Object *pObject )
{
	if( ( pObject->GetObjectType() & PLAYER_OBJECT ) != PLAYER_OBJECT )		return;

	Player *pPlayer = (Player*)pObject;
	BYTE byCnt = 0;

	// 敲饭捞绢 沥焊
	MSG_CG_SYNC_PLAYER_LEAVE_BRD PlayerMsg;
	Player *pTmpPlayer = NULL;
	m_pPlayerHashTable->SetFirst();
	while( pTmpPlayer = m_pPlayerHashTable->GetNext() )
	{
		if( pPlayer->GetObjectKey() == pTmpPlayer->GetObjectKey() ) continue;
		PlayerMsg.m_dwObjectKey[byCnt] = pTmpPlayer->GetObjectKey();
		++byCnt;

		if( byCnt == MSG_CG_SYNC_PLAYER_LEAVE_BRD::_MAX_PLAYER_SIZE )
		{
			PlayerMsg.m_byCount = byCnt;
			pPlayer->SendPacket( &PlayerMsg, (WORD)PlayerMsg.GetSize() );
			byCnt = 0;
		}
	}
	if( byCnt != 0 )
	{
		PlayerMsg.m_byCount = byCnt;
		pPlayer->SendPacket( &PlayerMsg, (WORD)PlayerMsg.GetSize() );
		byCnt = 0;
	}

	// 阁胶磐 沥焊
	MSG_CG_SYNC_MONSTER_LEAVE_BRD MonsterMsg;
	NPC *pTmpNPC = NULL;
	m_pNPCHashTable->SetFirst();
	while( pTmpNPC = m_pNPCHashTable->GetNext() )
	{
		// MapNpc牢 版快绰 沥焊甫 林瘤 臼绰促.
//		if( (pTmpNPC->GetObjectType() & MAPNPC_OBJECT) == MAPNPC_OBJECT )	continue;

		MonsterMsg.m_dwObjectKey[byCnt] = pTmpNPC->GetObjectKey();
		++byCnt;

		if( byCnt == MSG_CG_SYNC_MONSTER_LEAVE_BRD::_MAX_MONSTER_SIZE )
		{
			MonsterMsg.m_byCount = byCnt;
			pPlayer->SendPacket( &MonsterMsg, (WORD)MonsterMsg.GetSize() );
			byCnt = 0;
		}
	}

	if( byCnt != 0 )
	{
		MonsterMsg.m_byCount = byCnt;
		pPlayer->SendPacket( &MonsterMsg, (WORD)MonsterMsg.GetSize() );
		byCnt = 0;
	}

	// 酒捞袍 沥焊
	MSG_CG_SYNC_FIELDITEM_LEAVE_BRD ItemMsg;
	Item *pTmpItem = NULL;
	m_pFieldItemHashTable->SetFirst();
	while( pTmpItem = m_pFieldItemHashTable->GetNext() )
	{
		ItemMsg.m_dwObjectKey[byCnt] = pTmpItem->GetObjectKey();
		++byCnt;
		
		if( byCnt == MSG_CG_SYNC_FIELDITEM_LEAVE_BRD::_MAX_FIELDITEM_SIZE )
		{
			ItemMsg.m_byCount = byCnt;
			pPlayer->SendPacket( &ItemMsg, (WORD)ItemMsg.GetSize() );
			byCnt = 0;
		}
	}

	if( byCnt != 0 )
	{
		ItemMsg.m_byCount = byCnt;
		pPlayer->SendPacket( &ItemMsg, (WORD)ItemMsg.GetSize() );
	}
}

⌨️ 快捷键说明

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