Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,568 @@
|
||||
#include "stdafx.h"
|
||||
#include "Cell.h"
|
||||
#include <Map/FieldMap/CellManager.h>
|
||||
#include <Map/FieldMap/VirtualArea/VirtualArea.h>
|
||||
#include <Map/FieldMap/VirtualArea/VirtualAreaMgr.h>
|
||||
|
||||
#include <Utility/Compress/MiniLZO/miniLZOWrapper.h>
|
||||
|
||||
#include <Creature/Creature.h>
|
||||
#include <Creature/AggresiveCreature.h>
|
||||
#include <Creature/Character/Character.h>
|
||||
#include <Creature/Monster/Monster.h>
|
||||
#include <Creature/Monster/VirtualMonsterMgr.h>
|
||||
#include <Creature/Siege/SiegeObject.h>
|
||||
|
||||
#include <Network/Packet/WrapPacket.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/CharItemPacket.h>
|
||||
#include <Network/Packet/PacketStruct/CharBroadCastPacket.h>
|
||||
#include <Network/Dispatch/GameClient/GameClientDispatch.h>
|
||||
|
||||
#include <Network/Packet/PacketStruct/CastlePacket.h>
|
||||
|
||||
__declspec(thread) static char g_BroadcastBuffer[PktMaxLen];
|
||||
|
||||
void CCell::ReleaseAllBuffer(CBuffer*& lpBuffer)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> buffer<65><72> <20><><EFBFBD><EFBFBD> Release<73>Ѵ<EFBFBD>.
|
||||
CBuffer* lpPos = lpBuffer;
|
||||
CBuffer* lpDel = lpBuffer;
|
||||
|
||||
while (0 != lpPos)
|
||||
{
|
||||
lpDel = lpPos;
|
||||
lpPos = lpPos->next();
|
||||
|
||||
SAFE_RELEASE_BUFFER(lpDel);
|
||||
}
|
||||
|
||||
lpBuffer = 0;
|
||||
}
|
||||
|
||||
|
||||
void CCell::PrepareBroadCast()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD> buffer<65><72> <20><><EFBFBD><EFBFBD> Release<73>Ѵ<EFBFBD>.
|
||||
ReleaseAllBuffer(m_lpBroadcast2ndBuffer);
|
||||
|
||||
if (m_lstCharacter.empty() && m_lstMonster.empty())
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>, ij<><C4B3><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD>. ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||||
return;
|
||||
}
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
const int MAX_BROADCAST_BUFFER_SIZE = 14 * 1024;
|
||||
CBufferFactory& bufferFactory = CCellManager::GetInstance().GetBufferFactory();
|
||||
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
CharacterList::iterator char_pos = m_lstCharacter.begin();
|
||||
CharacterList::iterator char_end = m_lstCharacter.end();
|
||||
|
||||
CBuffer* lpBroadcastBuffer = CREATE_BUFFER(bufferFactory, MAX_BROADCAST_BUFFER_SIZE);
|
||||
|
||||
for (; char_pos != char_end && 0 != lpBroadcastBuffer; )
|
||||
{
|
||||
CCharacter* lpCharacter = *char_pos;
|
||||
|
||||
//if (0 != lpCharacter && !lpCharacter->IsRideArms() &&
|
||||
|
||||
// <20>켱 <20><><EFBFBD> Ÿ<><C5B8> <20>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if (0 != lpCharacter &&
|
||||
lpCharacter->IsOperationFlagSet(CCharacter::CHAR_INFO_LOADED))
|
||||
{
|
||||
Broadcast2nd::CSerializeCharacterData& charData =
|
||||
lpCharacter->GetSerializeData();
|
||||
|
||||
if (lpBroadcastBuffer->push(
|
||||
charData.GetDeltaBroadcastData(),
|
||||
charData.GetDeltaBroadcastDataLen()))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
++char_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
lpBroadcastBuffer->next(m_lpBroadcast2ndBuffer);
|
||||
m_lpBroadcast2ndBuffer = lpBroadcastBuffer;
|
||||
|
||||
lpBroadcastBuffer = CREATE_BUFFER(bufferFactory, MAX_BROADCAST_BUFFER_SIZE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
++char_pos;
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
MonsterList::iterator mon_pos = m_lstMonster.begin();
|
||||
MonsterList::iterator mon_end = m_lstMonster.end();
|
||||
|
||||
for (; mon_pos != mon_end && 0 != lpBroadcastBuffer; )
|
||||
{
|
||||
CMonster* lpMonster = *mon_pos;
|
||||
|
||||
if (0 != lpMonster)
|
||||
{
|
||||
Broadcast2nd::CSerializeMonsterData& monsterData = lpMonster->GetSerializeData();
|
||||
|
||||
if (lpBroadcastBuffer->push(
|
||||
monsterData.GetDeltaBroadcastData(),
|
||||
monsterData.GetDeltaBroadcastDataLen()))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
++mon_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>۸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ְ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
lpBroadcastBuffer->next(m_lpBroadcast2ndBuffer);
|
||||
m_lpBroadcast2ndBuffer = lpBroadcastBuffer;
|
||||
|
||||
lpBroadcastBuffer = CREATE_BUFFER(bufferFactory, MAX_BROADCAST_BUFFER_SIZE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++mon_pos;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != lpBroadcastBuffer)
|
||||
{
|
||||
if(0 < lpBroadcastBuffer->length())
|
||||
{
|
||||
lpBroadcastBuffer->next(m_lpBroadcast2ndBuffer);
|
||||
m_lpBroadcast2ndBuffer = lpBroadcastBuffer;
|
||||
|
||||
lpBroadcastBuffer = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
SAFE_RELEASE_BUFFER(lpBroadcastBuffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SendBroadcastPacket(CCell& sendCell,
|
||||
char* szBroadcastBuffer,
|
||||
unsigned short usPacketLength,
|
||||
unsigned char cBroadcastType,
|
||||
unsigned char cDataType,
|
||||
unsigned long dwCurrentPulse)
|
||||
{
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD> <20>ۼ<EFBFBD>
|
||||
Broadcast2nd::PktBroadcast* lpBroadcast =
|
||||
reinterpret_cast<Broadcast2nd::PktBroadcast*>(szBroadcastBuffer);
|
||||
|
||||
lpBroadcast->m_dwCurrentPulse = dwCurrentPulse;
|
||||
lpBroadcast->m_cBroadcastType = cBroadcastType;
|
||||
lpBroadcast->m_cDataType = cDataType;
|
||||
|
||||
sendCell.SendAllCharacter(lpBroadcast, usPacketLength, CmdCellBroadCast2nd);
|
||||
}
|
||||
|
||||
|
||||
void CCell::BroadCast(unsigned long dwCurrentPulse)
|
||||
{
|
||||
if (!m_lstCharacter.empty())
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD>, <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
CCell** lppCellPos = m_lpConnectCell;
|
||||
CCell** lppCellEnd = m_lpConnectCell + CONNECT_NUM;
|
||||
|
||||
char* szBufferPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
char* szBufferEnd = g_BroadcastBuffer + sizeof(g_BroadcastBuffer);
|
||||
|
||||
CCell* lpCell = 0;
|
||||
CBuffer* lpBuffer = 0;
|
||||
|
||||
unsigned long dwCompressed = PktMaxLen;
|
||||
unsigned short usPacketLength = 0;
|
||||
|
||||
for (; lppCellPos != lppCellEnd; ++lppCellPos)
|
||||
{
|
||||
lpCell = *lppCellPos;
|
||||
|
||||
if (0 != lpCell)
|
||||
{
|
||||
lpBuffer = lpCell->m_lpBroadcast2ndBuffer;
|
||||
|
||||
while(0 != lpBuffer)
|
||||
{
|
||||
size_t nBufferLen = lpBuffer->length();
|
||||
|
||||
if (szBufferPos + nBufferLen < szBufferEnd)
|
||||
{
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
||||
memcpy(szBufferPos, lpBuffer->rd_ptr(), nBufferLen);
|
||||
szBufferPos += nBufferLen;
|
||||
|
||||
lpBuffer = lpBuffer->next();
|
||||
}
|
||||
else
|
||||
{
|
||||
SendBroadcastPacket(*this, g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szBufferPos - g_BroadcastBuffer),
|
||||
Broadcast2nd::PktBroadcast::BROADCAST,
|
||||
Broadcast2nd::PktBroadcast::CHAR_DATA, dwCurrentPulse);
|
||||
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> á<><C3A1>. <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
szBufferPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>)
|
||||
SendBroadcastPacket(*this, g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szBufferPos - g_BroadcastBuffer),
|
||||
Broadcast2nd::PktBroadcast::BROADCAST_END,
|
||||
Broadcast2nd::PktBroadcast::CHAR_DATA, dwCurrentPulse);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SendCharInfoToOthers(CCharacter& character,
|
||||
CCell** lppSendCell, const int nMaxSendCell)
|
||||
{
|
||||
// <20>켱 <20><><EFBFBD> Ÿ<><C5B8> <20>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
//if (!character.IsRideArms())
|
||||
{
|
||||
const unsigned short MAX_PKT_DATA = sizeof(Broadcast2nd::PktBroadcast) +
|
||||
Broadcast2nd::CSerializeCharacterData::MAX_CHARACTER_DATA * 2;
|
||||
|
||||
char szPacketBuffer[MAX_PKT_DATA];
|
||||
|
||||
Broadcast2nd::PktBroadcast* lpBroadcast =
|
||||
reinterpret_cast<Broadcast2nd::PktBroadcast*>(szPacketBuffer);
|
||||
|
||||
Broadcast2nd::CSerializeCharacterData& characterData = character.GetSerializeData();
|
||||
unsigned short usCharacterDataLen = characterData.GetBroadcastDataLen();
|
||||
|
||||
// <20><>ǥ<EFBFBD><C7A5> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Delta<74><61> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>)
|
||||
characterData.PrepareBroadcastData(character);
|
||||
|
||||
lpBroadcast->m_dwCurrentPulse = 0;
|
||||
lpBroadcast->m_cBroadcastType = Broadcast2nd::PktBroadcast::LOGIN;
|
||||
lpBroadcast->m_cDataType = Broadcast2nd::PktBroadcast::CHAR_DATA;
|
||||
|
||||
memcpy(lpBroadcast + 1, characterData.GetBroadcastData(), usCharacterDataLen);
|
||||
|
||||
CCell** lppSendPos = lppSendCell;
|
||||
CCell** lppSendEnd = lppSendCell + nMaxSendCell;
|
||||
|
||||
for (; lppSendPos != lppSendEnd; ++lppSendPos)
|
||||
{
|
||||
CCell* lpSendPos = *lppSendPos;
|
||||
if (0 != lpSendPos)
|
||||
{
|
||||
lpSendPos->SendAllCharacter(lpBroadcast,
|
||||
sizeof(Broadcast2nd::PktBroadcast) + usCharacterDataLen,
|
||||
CmdCellBroadCast2nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><> <20>α<EFBFBD><CEB1><EFBFBD>
|
||||
//
|
||||
// Parameter :
|
||||
// 1st : ũ<><C5A9><EFBFBD><EFBFBD> <20>ּ<EFBFBD>
|
||||
// 2st : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>αƿ<D7BE><C6BF><EFBFBD> <20><> (<28>α<EFBFBD><CEB1><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0)
|
||||
//
|
||||
// Do :
|
||||
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>˷<EFBFBD> <20>ش<EFBFBD>.
|
||||
//
|
||||
// Return :
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CCell::SendCellLogin(CAggresiveCreature* lpAggresiveCreature, CCell* lpLastLogoutCell)
|
||||
{
|
||||
if (0 != lpAggresiveCreature)
|
||||
{
|
||||
unsigned long dwCID = lpAggresiveCreature->GetCID();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>αƿ<D7BE><C6BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
|
||||
// lpSendCell<6C><6C><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>༮<EFBFBD><E0BCAE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
||||
CCell* lpSendCell[CONNECT_NUM];
|
||||
|
||||
CCell** lppSendPos = 0;
|
||||
CCell** lppSendEnd = 0;
|
||||
CCell* lpSendPos = 0;
|
||||
|
||||
if (0 != lpLastLogoutCell)
|
||||
{
|
||||
std::fill_n(lpSendCell, int(CONNECT_NUM), reinterpret_cast<CCell*>(0));
|
||||
|
||||
std::set_difference(
|
||||
m_lpSortedConnectedCell,
|
||||
m_lpSortedConnectedCell + CONNECT_NUM,
|
||||
lpLastLogoutCell->m_lpSortedConnectedCell,
|
||||
lpLastLogoutCell->m_lpSortedConnectedCell + CONNECT_NUM,
|
||||
lpSendCell);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::copy(m_lpSortedConnectedCell, m_lpSortedConnectedCell + CONNECT_NUM, lpSendCell);
|
||||
}
|
||||
|
||||
switch(Creature::GetCreatureType(dwCID))
|
||||
{
|
||||
case Creature::CT_PC:
|
||||
{
|
||||
CCharacter* lpCharacter = static_cast<CCharacter*>(lpAggresiveCreature);
|
||||
|
||||
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> ij<><C4B3><EFBFBD>͵鿡<CDB5><E9BFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD>̴<EFBFBD>.
|
||||
SendCharInfoToOthers(*lpCharacter, lpSendCell, CONNECT_NUM);
|
||||
|
||||
CGameClientDispatch* lpDispatch = lpCharacter->GetDispatcher();
|
||||
if (0 != lpDispatch)
|
||||
{
|
||||
// <20>ֺ<EFBFBD><D6BA><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
char* szDataPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
char* szDataEnd = g_BroadcastBuffer + PktMaxLen - 1024;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
Broadcast2nd::PktBroadcast* lpBroadcast =
|
||||
reinterpret_cast<Broadcast2nd::PktBroadcast*>(g_BroadcastBuffer);
|
||||
|
||||
lpBroadcast->m_dwCurrentPulse = 0;
|
||||
lpBroadcast->m_cBroadcastType = Broadcast2nd::PktBroadcast::LOGIN;
|
||||
lpBroadcast->m_cDataType = Broadcast2nd::PktBroadcast::CHAR_DATA;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
lppSendPos = lpSendCell;
|
||||
lppSendEnd = lpSendCell + CONNECT_NUM;
|
||||
|
||||
for (; lppSendPos != lppSendEnd; ++lppSendPos)
|
||||
{
|
||||
lpSendPos = *lppSendPos;
|
||||
if (0 != lpSendPos)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
CCell::CharacterList::iterator char_pos = lpSendPos->m_lstCharacter.begin();
|
||||
CCell::CharacterList::iterator char_end = lpSendPos->m_lstCharacter.end();
|
||||
|
||||
for (; char_pos != char_end; )
|
||||
{
|
||||
CCharacter* lpOtherCharacter = *char_pos;
|
||||
|
||||
Broadcast2nd::CSerializeCharacterData& characterData =
|
||||
lpOtherCharacter->GetSerializeData();
|
||||
|
||||
unsigned short usCharacterDataLen =
|
||||
characterData.GetBroadcastDataLen();
|
||||
|
||||
// <20><><EFBFBD> Ÿ<><C5B8> <20>־ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(By Minbobo)
|
||||
/*if (lpOtherCharacter->IsRideArms())
|
||||
{
|
||||
// <20><><EFBFBD> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
++char_pos;
|
||||
}*/
|
||||
|
||||
if (szDataPos + usCharacterDataLen < szDataEnd)
|
||||
{
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>۸<EFBFBD>. <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>.
|
||||
|
||||
memcpy(szDataPos, characterData.GetBroadcastData(), usCharacterDataLen);
|
||||
szDataPos += usCharacterDataLen;
|
||||
|
||||
++char_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpDispatch->GetSendStream().WrapCompress(g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szDataPos - g_BroadcastBuffer),
|
||||
CmdCellBroadCast2nd, 0, 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ġ <20>ʱ<EFBFBD>ȭ
|
||||
szDataPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
CCell::MonsterList::iterator mon_pos = lpSendPos->m_lstMonster.begin();
|
||||
CCell::MonsterList::iterator mon_end = lpSendPos->m_lstMonster.end();
|
||||
|
||||
for (; mon_pos != mon_end; )
|
||||
{
|
||||
CMonster* lpMonster = *mon_pos;
|
||||
|
||||
Broadcast2nd::CSerializeMonsterData& monsterData =
|
||||
lpMonster->GetSerializeData();
|
||||
|
||||
unsigned short usMonsterData = monsterData.GetBroadcastDataLen();
|
||||
|
||||
if (szDataPos + usMonsterData < szDataEnd)
|
||||
{
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>۸<EFBFBD>. <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>.
|
||||
memcpy(szDataPos, monsterData.GetBroadcastData(), usMonsterData);
|
||||
szDataPos += usMonsterData;
|
||||
|
||||
++mon_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpDispatch->GetSendStream().WrapCompress(g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szDataPos - g_BroadcastBuffer),
|
||||
CmdCellBroadCast2nd, 0, 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ġ <20>ʱ<EFBFBD>ȭ
|
||||
szDataPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast) < szDataPos)
|
||||
{
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpDispatch->GetSendStream().WrapCompress(g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szDataPos - g_BroadcastBuffer),
|
||||
CmdCellBroadCast2nd, 0, 0);
|
||||
}
|
||||
|
||||
// <20>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><> ij<><C4B3><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
// <20>̶<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20>ʰ<EFBFBD><CAB0><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>ġ<EFBFBD><C4A1> 14k<34><6B><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
szDataPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
lpBroadcast->m_dwCurrentPulse = 0;
|
||||
lpBroadcast->m_cBroadcastType = Broadcast2nd::PktBroadcast::LOGIN;
|
||||
lpBroadcast->m_cDataType = Broadcast2nd::PktBroadcast::ITEM_DATA;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
lppSendPos = lpSendCell;
|
||||
lppSendEnd = lpSendCell + CONNECT_NUM;
|
||||
|
||||
for (; lppSendPos != lppSendEnd; ++lppSendPos)
|
||||
{
|
||||
lpSendPos = *lppSendPos;
|
||||
if (0 != lpSendPos)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ƽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
CCell::ItemList::iterator item_pos = lpSendPos->m_lstItem.begin();
|
||||
CCell::ItemList::iterator item_end = lpSendPos->m_lstItem.end();
|
||||
|
||||
for (; item_pos != item_end; )
|
||||
{
|
||||
ItemInfo& itemInfo = (*item_pos);
|
||||
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۸<EFBFBD>, <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD>
|
||||
if (szDataPos + sizeof(FieldObject) < szDataEnd)
|
||||
{
|
||||
itemInfo.MakeFieldObject(*reinterpret_cast<FieldObject*>(szDataPos));
|
||||
|
||||
szDataPos += sizeof(FieldObject);
|
||||
++item_pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpDispatch->GetSendStream().WrapCompress(g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szDataPos - g_BroadcastBuffer),
|
||||
CmdCellBroadCast2nd, 0, 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><>ġ <20>ʱ<EFBFBD>ȭ
|
||||
szDataPos = g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (szDataPos != g_BroadcastBuffer + sizeof(Broadcast2nd::PktBroadcast))
|
||||
{
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
lpDispatch->GetSendStream().WrapCompress(g_BroadcastBuffer,
|
||||
static_cast<unsigned short>(szDataPos - g_BroadcastBuffer),
|
||||
CmdCellBroadCast2nd, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Creature::CT_MONSTER:
|
||||
case Creature::CT_SUMMON:
|
||||
case Creature::CT_STRUCT:
|
||||
{
|
||||
CMonster* lpMonster = static_cast<CMonster*>(lpAggresiveCreature);
|
||||
|
||||
// <20>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ֺ<EFBFBD> ij<><C4B3><EFBFBD>͵鿡<CDB5><E9BFA1> <20>Ѹ<EFBFBD><D1B8><EFBFBD>.
|
||||
const unsigned short MAX_PKT_DATA = sizeof(Broadcast2nd::PktBroadcast) +
|
||||
Broadcast2nd::CSerializeMonsterData::MAX_MONSTER_DATA * 2;
|
||||
|
||||
char szPacketBuffer[MAX_PKT_DATA];
|
||||
|
||||
Broadcast2nd::PktBroadcast* lpBroadcast =
|
||||
reinterpret_cast<Broadcast2nd::PktBroadcast*>(szPacketBuffer);
|
||||
|
||||
Broadcast2nd::CSerializeMonsterData& monsterData = lpMonster->GetSerializeData();
|
||||
unsigned short usMonsterDataLen = monsterData.GetBroadcastDataLen();
|
||||
|
||||
// <20><>ǥ<EFBFBD><C7A5> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Delta<74><61> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>)
|
||||
monsterData.PrepareBroadcastData(*lpMonster);
|
||||
|
||||
lpBroadcast->m_dwCurrentPulse = 0;
|
||||
lpBroadcast->m_cBroadcastType = Broadcast2nd::PktBroadcast::LOGIN;
|
||||
lpBroadcast->m_cDataType = Broadcast2nd::PktBroadcast::CHAR_DATA;
|
||||
|
||||
memcpy(lpBroadcast + 1, monsterData.GetBroadcastData(), usMonsterDataLen);
|
||||
|
||||
lppSendPos = lpSendCell;
|
||||
lppSendEnd = lpSendCell + CONNECT_NUM;
|
||||
|
||||
for (; lppSendPos != lppSendEnd; ++lppSendPos)
|
||||
{
|
||||
CCell* lpSendPos = *lppSendPos;
|
||||
if (0 != lpSendPos)
|
||||
{
|
||||
lpSendPos->SendAllCharacter(lpBroadcast,
|
||||
sizeof(Broadcast2nd::PktBroadcast) + usMonsterDataLen,
|
||||
CmdCellBroadCast2nd);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ij<><C4B3><EFBFBD><EFBFBD> <20><> <20>α<EFBFBD> <20>ƿ<EFBFBD>
|
||||
//
|
||||
// Parameter :
|
||||
// 1st : ũ<><C5A9><EFBFBD><EFBFBD> <20>ּ<EFBFBD>
|
||||
// 2st : <20>αƿ<D7BE><C6BF><EFBFBD> <20><> <20>α<EFBFBD><CEB1><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20><> (<28>αƿ<D7BE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> 0<><30> <20>ִ´<D6B4>.)
|
||||
//
|
||||
// Do :
|
||||
// <09>ֺ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>αƿ<D7BE><C6BF>Ѵٰ<D1B4> <20>˸<EFBFBD><CBB8><EFBFBD>.
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾƾ<CABE> <20><> ij<><C4B3><EFBFBD>͵<EFBFBD><CDB5><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
|
||||
//
|
||||
// Return :
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CCell::SendCellLogout(CAggresiveCreature* lpAggresiveCreature, CCell* lpPrepareLoginCell)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user