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