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

📄 sector.h

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 H
字号:
//=============================================================================================================================
/// Sector class
/**
	@author	Kim Min Wook < taiyo@webzen.com >
	@since	2004. 12. 14
	@remark
		- 鞘靛甫 备己窍绰 扁夯 窜困 冀磐
	@note
		- 
	@history 
		- 2006/1/11 : 敲饭捞绢啊 冀磐俊 甸绢 吭阑 锭 辨靛 沥焊 焊郴林档废 眠啊, 
					扁粮狼 m_ResultMsg甫 荤侩窍带 何盒阑 昏力, 荤侩窍瘤 臼酒档 凳.
					SetFirst(), GetNext() -> iterator肺 官厕
*/
//=============================================================================================================================
#ifndef __SECTOR_H__
#define __SECTOR_H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <ResultCode.h>
#include <CriticalSection.h>
#include <map>
#include <PacketStruct.h>
#include <SolarHashTable.h>
#include "VarMsg.h"

using namespace util;
using namespace std;

class Sector;
class Object;
class Character;
class Player;
class Item;
class NPC;
struct AI_MSG;

typedef util::SolarHashTable<Player *>				SECTOR_PLAYER_HASH;
typedef util::SolarHashTable<Player *>::iterator	SECTOR_PLAYER_HASH_ITR;
typedef util::SolarHashTable<NPC *>					SECTOR_NPC_HASH;
typedef util::SolarHashTable<NPC *>::iterator		SECTOR_NPC_HASH_ITR;
typedef util::SolarHashTable<Item *>				SECTOR_ITEM_HASH;
typedef util::SolarHashTable<Item *>::iterator		SECTOR_ITEM_HASH_ITR;

class Sector  
{
	/// 抛胶飘 搬苞俊 蝶扼 弥利拳啊 夸备凳!
	enum { MAX_BROADCAST_AT_ONCE_SIZE = 50 };
	enum { DEFAULT_OBJECT_POOL_SIZE = 30 };
	enum { MAX_DEFAULT_RENDERINFO_COUNT = 50 };

public:

	Sector();
	virtual ~Sector();
	VOID					Init( DWORD dwSectorIndex, WORD wGroupIndex );
	VOID					Release();
	VOID					Update( DWORD dwDeltaTick );
	DWORD					GetPlayerNum() { return m_pPlayerHashTable->GetDataNum(); }

	// 按眉 火涝, 昏力
	RC::eSECTOR_REULT		AddObject( Object * pObject, BOOL bEnterField );
	RC::eSECTOR_REULT		RemoveObject( Object * pObject );

	// 按眉 火涝, 昏力甫 林函俊 舅覆
	RC::ePACKET_SEND_RESULT SendAddObject( Object * pObject, BOOL bVillage=FALSE );
	RC::ePACKET_SEND_RESULT SendAddObject_Dir( Object * pObject, WORD wAngle );
	RC::ePACKET_SEND_RESULT SendRemoveObject( Object * pObject );

	// 脚痹 冀磐 沥焊 眠啊, 昏力(敲饭捞绢俊霸 舅覆)
	VOID					SendAddSectorInfo( Object *pObject, BOOL bVillage=FALSE );
	VOID					SendDelSectorInfo( Object *pObject );


	RC::ePACKET_SEND_RESULT SendPacketToSector( MSG_BASE_FORWARD * pMsg, WORD wSize );								// Sector俊 菩哦阑 焊晨
	RC::ePACKET_SEND_RESULT SendPacketToSectorExceptMe( MSG_BASE_FORWARD * pMsg, WORD wSize, DWORD dwMyObjKey=0 );	// Sector俊 磊脚阑 力寇窍绊 菩哦阑 焊晨

	RC::ePACKET_SEND_RESULT SendExPacketToSector( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize );
	RC::ePACKET_SEND_RESULT SendExPacketToSectorExceptMe( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize, DWORD dwMyObjKey=0 );


	Object*					FindObject( eOBJECT_TYPE eObjecType, DWORD dwObjectKey );

	VOID					SendAIMessageToSectorExceptMe( Object *pObject, AI_MSG *pMsg, WORD wSize );

	// 皋牢鸥百阑 吝缴栏肺 老沥康开俊 加窍绰 某腐磐甸阑 茫绰促.
	BYTE					FindTargetsByAttacker( eSKILL_TARGET_TYPE eTargetType, Character* pAttacker, Character** pTargetArray, WzVector &vMainTargetPos, 
													float fRange, unsigned int uiRangeForm, float fArea, 
													BYTE byCountLimit, DWORD dwExceptTargetKey );

	// 老沥 康开俊 加窍绰 某腐磐甸阑 茫绰促.
	BYTE					FindTargetsByPosition( Character** pTargetArray, WzVector &vMainPos, float fRange, BYTE byCountLimit );
    
	template <class PlayerFinder>
	Character *				SearchPlayer( PlayerFinder& finder );

	template <class NPCFinder>
	Character *				SearchNPC( NPCFinder& finder );

	template <class ItemFinder>
	BOOL					SearchFieldItem( ItemFinder& finder );

	// 敲饭捞绢 府胶飘 iterating
	template< class ObjectOperator >
	VOID					ForeachPlayer( ObjectOperator & Operator );

	// 酒捞袍 府胶飘 iterating
	template< class ObjectOperator >
		VOID				ForeachItem( ObjectOperator & Operator );

	// NPC 府胶飘 iterating
	template< class ObjectOperator >
	VOID					ForeachNPC( ObjectOperator & Operator );

	// 轰器飘 贸府 包访(弊缝, 冀磐 盒且)
	VOID					IncreaseReferencePlayer( Object *pObject );
	VOID					DecreaseReferencePlayer( Object *pObject );
	inline WORD				GetGroupIndex()		{ return m_wGroupIndex; }
	inline DWORD			GetSectorIndex()	{ return m_dwSectorIndex; }

protected:
	VOID					OnSendAddPlayer(Player *pPlayer, BOOL bVillage=FALSE);	// Player狼 眠啊 菩哦 焊晨
	VOID					OnSendRemovePlayer(Player *pPlayer);	// Player狼 力芭 菩哦 焊晨

	VOID					OnSendAddFieldItem(Item *pItem);		// FieldItem狼 眠啊 菩哦 焊晨
	VOID					OnSendRemoveFieldItem(Item *pItem);		// FieldItem狼 力芭 菩哦 焊晨

	VOID					OnSendAddNPC(NPC *pNPC);				// NPC狼 眠啊 菩哦 焊晨
	VOID					OnSendAddNPC_Dir(NPC *pNPC, WORD wAngle);	// NPC狼 眠啊 菩哦 焊晨 - 规氢 爱绊 积己登绰 版快
	VOID					OnSendRemoveNPC(NPC *pNPC);				// NPC狼 力芭 菩哦 焊晨

	VOID					OnSendAllPlayersInfo( Player *pPlayer, BOOL bVillage );

private:
	VOID					OnSendSummonedInfo( Player *pPlayer, NPC *pNearNPC );

private:
	int						m_iPlayerReferenceCount;		// 捞 冀磐狼 沥焊甫 曼炼窍绰 敲饭捞绢狼 荐

	WORD					m_wGroupIndex;		// 冀磐甸狼 弓澜(弊缝) 牢郸胶
	DWORD					m_dwSectorIndex;	// 冀磐 牢郸胶

	SECTOR_PLAYER_HASH *	m_pPlayerHashTable;
	SECTOR_NPC_HASH *		m_pNPCHashTable;
	SECTOR_ITEM_HASH *		m_pFieldItemHashTable;

	static VarMsg			m_VarMsg;
};


template <class PlayerFinder>
Character* Sector::SearchPlayer( PlayerFinder& finder )
{
	// 利(敲饭捞绢) 府胶飘吝俊辑 矫具郴俊 甸绢坷绰 利捞 乐绰瘤 八荤
	for( SECTOR_PLAYER_HASH_ITR it = m_pPlayerHashTable->begin() ; it != m_pPlayerHashTable->end() ; ++it )
	{
		if( finder((*it)) )
		{
			break;
		}
	}
	return finder.GetTarget();
}

template <class NPCFinder>
Character* Sector::SearchNPC( NPCFinder& finder )
{
	// 利(敲饭捞绢) 府胶飘吝俊辑 矫具郴俊 甸绢坷绰 利捞 乐绰瘤 八荤
	for( SECTOR_NPC_HASH_ITR it = m_pNPCHashTable->begin() ; it != m_pNPCHashTable->end() ; ++it )
	{
		if( finder((*it)) )
		{
			break;
		}
	}

	return finder.GetTarget();
}

template <class ItemFinder>
BOOL Sector::SearchFieldItem( ItemFinder& finder )
{
	// 利(敲饭捞绢) 府胶飘吝俊辑 矫具郴俊 甸绢坷绰 利捞 乐绰瘤 八荤
	for( SECTOR_ITEM_HASH_ITR it = m_pFieldItemHashTable->begin() ; it != m_pFieldItemHashTable->end() ; ++it )
	{
		if( finder((*it)) )
		{
			return TRUE;
		}
	}

	return FALSE;
}


template< class ObjectOperator >
VOID Sector::ForeachPlayer( ObjectOperator & Operator )
{
	for( SECTOR_PLAYER_HASH_ITR it = m_pPlayerHashTable->begin() ; it != m_pPlayerHashTable->end() ; ++it )
	{
		Operator((*it));
	}
}

template< class ObjectOperator >
VOID Sector::ForeachItem( ObjectOperator & Operator )
{
	for( SECTOR_ITEM_HASH_ITR it = m_pFieldItemHashTable->begin() ; it != m_pFieldItemHashTable->end() ; ++it )
	{
		Operator((*it));
	}
}

template< class ObjectOperator >
VOID Sector::ForeachNPC( ObjectOperator & Operator )
{
	for( SECTOR_NPC_HASH_ITR it = m_pNPCHashTable->begin() ; it != m_pNPCHashTable->end() ; ++it )
	{
		Operator((*it));
	}
}


#endif // __SECTOR_H__

⌨️ 快捷键说明

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