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:
2025-11-29 20:17:20 +09:00
parent 5d3cd64a25
commit dd97ddec92
11602 changed files with 1446576 additions and 0 deletions

View File

@@ -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)
{
}