📄 sector.cpp
字号:
#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 + -