📄 sector.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 + -