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,389 @@
#define NOMINMAX
#include "stdafx.h"
#include <Item/Item.h>
#include "BroadcastCharacterData.h"
#include <utility>
#include "GMMemory.h"
namespace Broadcast2nd
{
const unsigned char CNetworkEquipGrade::TransferNetworkEquipGrade(Item::CItem* lpItem)
{
Item::CEquipment* lpEquip = Item::CEquipment::DowncastToEquipment(lpItem);
if (NULL != lpEquip)
{
Item::Grade::GradeInfo gradeInfo = lpEquip->GetItemGrade();
// A <20>׷<EFBFBD><D7B7>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>.
if (Item::EquipType::B_GRADE > gradeInfo.m_eItemGrade)
{
return (Item::EquipType::B_GRADE - gradeInfo.m_eItemGrade);
}
}
return 0;
}
CAggresiveCreatureData::CAggresiveCreatureData()
: m_dwCID(0), m_usHP(0), m_dwDataFlag(0), m_dwLastUpdatedPulse(0)
{
}
CAggresiveCreatureData::~CAggresiveCreatureData()
{
}
void CAggresiveCreatureData::SetEnchantInfo(const EnchantInfo& enchantInfo)
{
std::copy(enchantInfo.m_dwStatusFlag,
enchantInfo.m_dwStatusFlag + EnchantInfo::MAX_ARRAY, m_EnchantInfo.m_dwStatusFlag);
}
void CAggresiveCreatureData::ClearData()
{
m_dwCID = 0;
m_usHP = 0;
m_dwDataFlag = 0;
m_dwLastUpdatedPulse = 0;
m_NetworkPos.Initialize(0, 0, 0, 0, 0);
m_EnchantInfo.ClearFlag();
}
CCharacterData::CCharacterData()
{
memset(m_szName, 0, sizeof(char) * MAX_NAME);
memset(m_szStallName, 0, sizeof(char) * StallNode::MAX_STALL_NAME);
memset(m_dwDoubleEquipsID, 0, sizeof(unsigned long) * HALF_EQUIP_POS);
memset(&m_CommunityInfo, 0, sizeof(CommunityInfo));
memset(&m_StatusInfo, 0, sizeof(bcStatusInfo));
memset(&m_NetworkEquipGrade, 0, sizeof(CNetworkEquipGrade));
memset(&m_WarFlagInfo, 0, sizeof(WarFlagInfo));
memset(&m_cRealmPoint, 0, sizeof(unsigned char));
}
CCharacterData::~CCharacterData()
{
}
void CCharacterData::ClearData()
{
CAggresiveCreatureData::ClearData();
memset(m_szName, 0, sizeof(char) * MAX_NAME);
memset(m_szStallName, 0, sizeof(char) * StallNode::MAX_STALL_NAME);
memset(m_dwDoubleEquipsID, 0, sizeof(unsigned long) * HALF_EQUIP_POS);
memset(&m_CommunityInfo, 0, sizeof(CommunityInfo));
memset(&m_StatusInfo, 0, sizeof(bcStatusInfo));
memset(&m_NetworkEquipGrade, 0, sizeof(CNetworkEquipGrade));
memset(&m_WarFlagInfo, 0, sizeof(WarFlagInfo));
memset(&m_cRealmPoint, 0, sizeof(unsigned char));
}
void CCharacterData::GetEquipmentsID(unsigned short* lpEquipmentsID_Out, unsigned char nIDNum) const
{
unsigned short* dupEquipsID = (unsigned short*)m_dwDoubleEquipsID;
std::copy(dupEquipsID, dupEquipsID +
std::min(nIDNum, unsigned char(Item::EquipmentPos::MAX_EQUPMENT_POS)), lpEquipmentsID_Out);
}
void CCharacterData::SetEquipmentsID(unsigned short* lpEquipmentsID_In, const unsigned char nIDNum)
{
std::copy(lpEquipmentsID_In, lpEquipmentsID_In +
std::min(nIDNum, unsigned char(Item::EquipmentPos::MAX_EQUPMENT_POS)), reinterpret_cast<unsigned short*>(m_dwDoubleEquipsID));
}
void Broadcast2nd::CCharacterData::SetEquipmentsID(unsigned long dwEquipmentsID_In, const unsigned char nIDIndex)
{
if (nIDIndex < HALF_EQUIP_POS)
{
m_dwDoubleEquipsID[nIDIndex] = dwEquipmentsID_In;
}
}
void CCharacterData::SetName(const char* szName, const size_t nNameLen)
{
memcpy(m_szName, szName, std::min(size_t(MAX_NAME), nNameLen));
}
void CCharacterData::SetStallName(const char* szStallName, const size_t nStallNameLen)
{
memcpy(m_szStallName, szStallName, std::min(size_t(StallNode::MAX_STALL_NAME), nStallNameLen));
}
bool CCharacterData::UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse,
const char* szData, int& nBufferSize_InOut)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
// UpdateFlag(4byte)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(16<31><36> * 2byte = 32byte)
// <20≯<EFBFBD>(16byte)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>(32byte)
// <20>ּ<EFBFBD> <20><><EFBFBD><EFBFBD> (public addr/private addr 12byte)
// Ŀ<>´<EFBFBD>Ƽ <20><><EFBFBD><EFBFBD> ( <20><><EFBFBD><EFBFBD>ID / <20><>ƼID / <20>뺴 / <20><><EFBFBD><EFBFBD> / <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> )
// <20><> <20><><EFBFBD><EFBFBD> ( 4byte )
// <20><><EFBFBD><EFBFBD> <20><>
// Total 138 Bytes
unsigned long dwUpdateFlag = 0;
const char* szDataPos = szData;
const int nBufferSize = nBufferSize_InOut;
if (nBufferSize < sizeof(unsigned long))
{
return false;
}
COPY_AND_ADVANCE_SRC(&dwUpdateFlag, szDataPos, sizeof(unsigned long));
// <20>о<EFBFBD><D0BE><EFBFBD> UpdateFlag<61><67>, <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
int nEstimateBufferSize = EstimateBufferSize(dwUpdateFlag);
if (nBufferSize < nEstimateBufferSize )
{
// <20><><EFBFBD><EFBFBD> ũ<><20>߻<EFBFBD><DFBB><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>״´<D7B4>!!.
m_dwCID = dwCID;
if (0 != dwCurrentPulse)
{
// Pulse<73><65> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CellLogin<69>̴<EFBFBD>. Pulse<73><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_dwLastUpdatedPulse = dwCurrentPulse;
}
int nCount = 0;
for (; nCount < HALF_EQUIP_POS; ++nCount)
{
if (dwUpdateFlag & (1 << nCount))
{
COPY_AND_ADVANCE_SRC(m_dwDoubleEquipsID + nCount, szDataPos, sizeof(unsigned long));
}
}
if (dwUpdateFlag & CHAR_DELTA_CHAR_NAME) { COPY_AND_ADVANCE_SRC(m_szName, szDataPos, sizeof(unsigned char) * MAX_NAME); }
if (dwUpdateFlag & CHAR_DELTA_STALL_NAME) { COPY_AND_ADVANCE_SRC(m_szStallName, szDataPos, sizeof(unsigned char) * StallNode::MAX_STALL_NAME); }
if (dwUpdateFlag & CHAR_DELTA_GUILD_ID) { COPY_AND_ADVANCE_SRC(&m_CommunityInfo.m_dwGuild_ID, szDataPos, sizeof(unsigned long)); }
if (dwUpdateFlag & CHAR_DELTA_GUILD_ID) { COPY_AND_ADVANCE_SRC(&m_CommunityInfo.m_cTacticsFlag, szDataPos, sizeof(unsigned char)); }
if (dwUpdateFlag & CHAR_DELTA_PARTY_ID) { COPY_AND_ADVANCE_SRC(&m_CommunityInfo.m_dwParty_ID, szDataPos, sizeof(unsigned long)); }
if (dwUpdateFlag & CHAR_DELTA_FAME) { COPY_AND_ADVANCE_SRC(&m_CommunityInfo.m_dwFame, szDataPos, sizeof(unsigned long)); }
if (dwUpdateFlag & CHAR_DELTA_FAME) { COPY_AND_ADVANCE_SRC(&m_CommunityInfo.m_dwMileage, szDataPos, sizeof(unsigned long)); }
if (dwUpdateFlag & CHAR_DELTA_BODYINFO) { COPY_AND_ADVANCE_SRC(&m_StatusInfo.m_dwBodyInfo, szDataPos, sizeof(unsigned long)); }
if (dwUpdateFlag & CHAR_DELTA_CLASS) { COPY_AND_ADVANCE_SRC(&m_StatusInfo.m_cClass, szDataPos, sizeof(unsigned char)); }
if (dwUpdateFlag & CHAR_DELTA_LEVEL) { COPY_AND_ADVANCE_SRC(&m_StatusInfo.m_cLevel, szDataPos, sizeof(unsigned char)); }
for (nCount = 0; nCount < EnchantInfo::MAX_ARRAY; ++nCount)
{
if (dwUpdateFlag & (CHAR_DELTA_ENCHANT_INFO << nCount))
{
COPY_AND_ADVANCE_SRC(m_EnchantInfo.m_dwStatusFlag + nCount, szDataPos, sizeof(unsigned long));
}
}
if (dwUpdateFlag & CHAR_DELTA_NETWORK_POS) { COPY_AND_ADVANCE_SRC(&m_NetworkPos, szDataPos, sizeof(CNetworkPos));}
if (dwUpdateFlag & CHAR_DELTA_HP) { COPY_AND_ADVANCE_SRC(&m_usHP, szDataPos, sizeof(unsigned short)); }
if (dwUpdateFlag & CHAR_DELTA_EQUIP_GRADE) { COPY_AND_ADVANCE_SRC(&m_NetworkEquipGrade, szDataPos, sizeof(CNetworkEquipGrade)); }
if (dwUpdateFlag & CHAR_DELTA_WAR_FLAG) { COPY_AND_ADVANCE_SRC(&m_WarFlagInfo, szDataPos, sizeof(WarFlagInfo)); }
if (dwUpdateFlag & CHAR_DELTA_REALM_POINT) { COPY_AND_ADVANCE_SRC(&m_cRealmPoint, szDataPos, sizeof(unsigned char)); }
nBufferSize_InOut = static_cast<int>(szDataPos - szData);
if (0 != dwUpdateFlag)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
SetDataFlag(CHARDATA_CHANGED);
}
return true;
}
int CCharacterData::EstimateBufferSize(unsigned long dwUpdateFlag)
{
// CID<49><44> UpdateFlag<61><67> <20><><EFBFBD≯<EFBFBD>ŭ <20><><EFBFBD>Ѵ<EFBFBD>.
int nEstimateBufferSize = 0;
int nCount = 0;
for (; nCount < Broadcast2nd::CCharacterData::HALF_EQUIP_POS; ++nCount)
{
if (dwUpdateFlag & (1 << nCount))
{
nEstimateBufferSize += sizeof(unsigned long);
}
}
if (dwUpdateFlag & CHAR_DELTA_CHAR_NAME) { nEstimateBufferSize += sizeof(unsigned char) * MAX_NAME; }
if (dwUpdateFlag & CHAR_DELTA_STALL_NAME) { nEstimateBufferSize += sizeof(unsigned char) * StallNode::MAX_STALL_NAME; }
if (dwUpdateFlag & CHAR_DELTA_GUILD_ID) { nEstimateBufferSize += sizeof(unsigned long); }
if (dwUpdateFlag & CHAR_DELTA_GUILD_ID) { nEstimateBufferSize += sizeof(unsigned char); }
if (dwUpdateFlag & CHAR_DELTA_PARTY_ID) { nEstimateBufferSize += sizeof(unsigned long); }
if (dwUpdateFlag & CHAR_DELTA_FAME) { nEstimateBufferSize += sizeof(unsigned long) * 2; }
if (dwUpdateFlag & CHAR_DELTA_BODYINFO) { nEstimateBufferSize += sizeof(unsigned long); }
if (dwUpdateFlag & CHAR_DELTA_CLASS) { nEstimateBufferSize += sizeof(unsigned char); }
if (dwUpdateFlag & CHAR_DELTA_LEVEL) { nEstimateBufferSize += sizeof(unsigned char); }
for (nCount = 0; nCount < EnchantInfo::MAX_ARRAY; ++nCount)
{
if (dwUpdateFlag & (CHAR_DELTA_ENCHANT_INFO << nCount))
{
nEstimateBufferSize += sizeof(unsigned long);
}
}
if (dwUpdateFlag & CHAR_DELTA_NETWORK_POS) { nEstimateBufferSize += sizeof(CNetworkPos); }
if (dwUpdateFlag & CHAR_DELTA_HP) { nEstimateBufferSize += sizeof(unsigned short); }
if (dwUpdateFlag & CHAR_DELTA_EQUIP_GRADE) { nEstimateBufferSize += sizeof(CNetworkEquipGrade); }
if (dwUpdateFlag & CHAR_DELTA_WAR_FLAG) { nEstimateBufferSize += sizeof(WarFlagInfo); }
if (dwUpdateFlag & CHAR_DELTA_REALM_POINT) { nEstimateBufferSize += sizeof(unsigned char); }
return nEstimateBufferSize;
}
void CMonsterData::ClearData()
{
CAggresiveCreatureData::ClearData();
m_dwMasterCID = 0;
}
CMonsterData::CMonsterData()
: m_dwMasterCID(0)
{
}
CMonsterData::~CMonsterData()
{
}
bool CMonsterData::UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse,
const char* szData, int& nBufferSize_InOut)
{
const char* szDataPos = szData;
const int nBufferSize = nBufferSize_InOut;
if (nBufferSize < sizeof(unsigned char))
{
return false;
}
unsigned char cUpdateFlag =
*reinterpret_cast<const unsigned char*>(szDataPos);
++szDataPos;
// <20>о<EFBFBD><D0BE><EFBFBD> UpdateFlag<61><67>, <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
int nEstimateBufferSize = EstimateBufferSize(cUpdateFlag);
if (nBufferSize < nEstimateBufferSize)
{
// <20><><EFBFBD><EFBFBD> ũ<><20>߻<EFBFBD><DFBB><EFBFBD> <20><><EFBFBD>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>״´<D7B4>!!.
m_dwCID = dwCID;
if (0 != dwCurrentPulse)
{
// Pulse<73><65> 0<><30><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CellLogin<69>̴<EFBFBD>. Pulse<73><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
m_dwLastUpdatedPulse = dwCurrentPulse;
}
for (int nCount = 0; nCount < EnchantInfo::MAX_ARRAY; ++nCount)
{
if (cUpdateFlag & (MON_DELTA_ENCHANT_INFO << nCount))
{
COPY_AND_ADVANCE_SRC(
m_EnchantInfo.m_dwStatusFlag + nCount,
szDataPos, sizeof(unsigned long));
}
}
const CNetworkPos oldNetPos = m_NetworkPos;
if (cUpdateFlag & MON_DELTA_NETWORK_POS) { COPY_AND_ADVANCE_SRC(&m_NetworkPos, szDataPos, sizeof(CNetworkPos)); }
if (cUpdateFlag & MON_DELTA_HP) { COPY_AND_ADVANCE_SRC(&m_usHP, szDataPos, sizeof(unsigned short)); }
if (cUpdateFlag & MON_DELTA_MASTERCID) { COPY_AND_ADVANCE_SRC(&m_dwMasterCID, szDataPos, sizeof(unsigned long)); }
/*
// TODO : REMOVE HERE
if (49 < oldNetPos.GetSquaredRange(CNetworkPos(0, 0, 0)) &&
49 < oldNetPos.GetSquaredRange(m_NetworkPos))
{
const int MAX_BUFFER = 256;
char szBuffer[MAX_BUFFER];
if (0 < _snprintf(szBuffer, MAX_BUFFER - 1,
"PktBroadcast2nd : CID:0x%08x : <20><><EFBFBD><EFBFBD><EFBFBD>̵<EFBFBD><CCB5>ϳ<EFBFBD>?.. %f<>Ÿ<EFBFBD><C5B8><EFBFBD> <20><><EFBFBD>տ<EFBFBD><D5BF><EFBFBD> <20>̵<EFBFBD><CCB5>ߴ<EFBFBD>!"
"/CurrentPulse:%d (%f,%f,%f)->(%f,%f,%f)\n",
m_dwCID, oldNetPos.GetSquaredRange(m_NetworkPos), dwCurrentPulse,
oldNetPos.GetXPos(), oldNetPos.GetYPos(), oldNetPos.GetZPos(),
m_NetworkPos.GetXPos(), m_NetworkPos.GetYPos(), m_NetworkPos.GetZPos()))
{
szBuffer[MAX_BUFFER - 1] = 0;
OutputDebugString(szBuffer);
}
}
*/
nBufferSize_InOut = static_cast<int>(szDataPos - szData);
if (0 != cUpdateFlag)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD>ǰ<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
SetDataFlag(CHARDATA_CHANGED);
}
return true;
}
int CMonsterData::EstimateBufferSize(unsigned char cUpdateFlag)
{
// CID<49><44> UpdateFlag<61><67> <20><><EFBFBD≯<EFBFBD>ŭ <20><><EFBFBD>Ѵ<EFBFBD>.
int nEstimateBufferSize = 0;
int nCount = 0;
for (nCount = 0; nCount < EnchantInfo::MAX_ARRAY; ++nCount)
{
if (cUpdateFlag & (MON_DELTA_ENCHANT_INFO << nCount))
{
nEstimateBufferSize += sizeof(unsigned long);
}
}
if (cUpdateFlag & MON_DELTA_NETWORK_POS) { nEstimateBufferSize += sizeof(CNetworkPos); }
if (cUpdateFlag & MON_DELTA_HP) { nEstimateBufferSize += sizeof(unsigned short); }
if (cUpdateFlag & MON_DELTA_MASTERCID) { nEstimateBufferSize += sizeof(unsigned long); }
return nEstimateBufferSize;
}
}

View File

@@ -0,0 +1,315 @@
#ifndef _BROADCAST_2ND_CHARACTER_DATA_H_
#define _BROADCAST_2ND_CHARACTER_DATA_H_
#include <winsock2.h>
#include <windows.h>
#include <Network/Packet/PacketStruct/CharMovePacket.h>
#include <Item/ItemStructure.h>
//! <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
//! ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><> <20>˾ƾ<CBBE> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
namespace Broadcast2nd
{
inline void COPY_AND_ADVANCE_SRC(void* dst, const char*& src, size_t size)
{
memcpy(dst, src, size); src += size;
}
inline void COPY_AND_ADVANCE_DST(char*& dst, const void* src, size_t size)
{
memcpy(dst, src, size); dst += size;
}
enum DeltaInfo
{
// CID : 4byte
// UpdateFlag : 4byte
CHAR_DELTA_EQUIPMENT = 1 << 0, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (0~7<><37>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.) 32byte
CHAR_DELTA_CHAR_NAME = 1 << 8, // ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> 16byte
CHAR_DELTA_STALL_NAME = 1 << 9, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> 32byte
CHAR_DELTA_GUILD_ID = 1 << 10, // <20><><EFBFBD><EFBFBD> ID, <20>뺴 5byte
CHAR_DELTA_PARTY_ID = 1 << 11, // <20><>Ƽ ID 4byte
CHAR_DELTA_FAME = 1 << 12, // <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> 8byte
CHAR_DELTA_BODYINFO = 1 << 13, // <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ 4byte
CHAR_DELTA_CLASS = 1 << 14, // Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1byte
CHAR_DELTA_LEVEL = 1 << 15, // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 1byte
CHAR_DELTA_ENCHANT_INFO = 1 << 16, // æƮ/<2F><>æƮ <20><><EFBFBD><EFBFBD>(16~19<31><39>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.) 16byte
CHAR_DELTA_NETWORK_POS = 1 << 20, // ij<><C4B3><EFBFBD><EFBFBD> <20><>ǥ (x,y,z,<2C><><EFBFBD><EFBFBD>,<2C>̵<EFBFBD><CCB5>Ÿ<EFBFBD>) 8byte
CHAR_DELTA_HP = 1 << 21, // ij<><C4B3><EFBFBD><EFBFBD> HP 2byte
CHAR_DELTA_EQUIP_GRADE = 1 << 22, // <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>̵<EFBFBD>(<28>Ӹ<EFBFBD>, <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>޼<EFBFBD>) 4byte
CHAR_DELTA_WAR_FLAG = 1 << 23, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> 2byte
CHAR_DELTA_REALM_POINT = 1 << 24 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ. 1byte.
// Total : 144Byte
};
enum MonsterDelta
{
MON_DELTA_ENCHANT_INFO = 1 << 0, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>æƮ <20><><EFBFBD><EFBFBD> (0~3<><33>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>) 4*4byte
MON_DELTA_NETWORK_POS = 1 << 4, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ <20><><EFBFBD><EFBFBD> 8byte
MON_DELTA_HP = 1 << 5, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> hp<68><70><EFBFBD><EFBFBD> 2byte
MON_DELTA_MASTERCID = 1 << 6 // <20><>ȯ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CID 4byte
};
//! <20><20><> <20><><EFBFBD><EFBFBD>
struct bcBodyInfo
{
unsigned long m_cHair : 4; //! <20>Ӹ<EFBFBD>Į
unsigned long m_cFace : 4; //! <20><><EFBFBD><EFBFBD>
unsigned long m_cNationality : 3; //! <20><><EFBFBD><EFBFBD>
unsigned long m_cAdminLevel : 3; //! <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD> ( 0 : <20>Ϲ<EFBFBD>, 1<><31><EFBFBD><EFBFBD> ũ<><C5A9> <20><EFBFBD><EEBFB5>..)
unsigned long m_cRace : 2; //! <20><><EFBFBD><EFBFBD>
unsigned long m_cSex : 1; //! 0 : <20><><EFBFBD><EFBFBD>, 1 : <20><><EFBFBD><EFBFBD>
unsigned long m_bPeaceMode : 1; //! 0 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 1 : <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD>
unsigned long m_cHandPos : 1; //! 0 : 1<><31> <20><>, 1 : 2<><32> <20><>
unsigned long m_cRideFlag : 1; //! 0 : x, 1 : <20><>Ž
unsigned long m_cReserved : 12; //! <20><>Ÿ <20>÷<EFBFBD><C3B7><EFBFBD>
};
//! <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>
struct bcStatusInfo
{
union
{
bcBodyInfo m_BodyInfo;
unsigned long m_dwBodyInfo;
};
unsigned char m_cClass; // Ŭ<><C5AC><EFBFBD><EFBFBD>
unsigned char m_cLevel; // <20><><EFBFBD><EFBFBD>
};
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
struct StallNode
{
enum
{
MAX_STALL_NAME = 32
};
unsigned long m_dwCID;
char m_szStallName[MAX_STALL_NAME];
};
//! <20><>Ƽ, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>ϸ<EFBFBD><CFB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
struct CommunityInfo
{
unsigned long m_dwGuild_ID;
unsigned long m_dwParty_ID;
unsigned char m_cTacticsFlag;
unsigned long m_dwFame;
unsigned long m_dwMileage;
};
//! <20><><EFBFBD><EFBFBD>Ʈ ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7>̵<EFBFBD>
class CNetworkEquipGrade
{
public:
CNetworkEquipGrade()
: m_cHead(0), m_cBody(0), m_cRightHand(0), m_cLeftHand(0)
{ }
CNetworkEquipGrade(unsigned char cHead, unsigned char cBody, unsigned char cRightHand, unsigned char cLeftHand)
: m_cHead(cHead), m_cBody(cBody), m_cRightHand(cRightHand), m_cLeftHand(cLeftHand)
{ }
inline bool operator != (const CNetworkEquipGrade& rhs)
{
return (m_cHead != rhs.m_cHead || m_cBody != rhs.m_cBody ||
m_cRightHand != rhs.m_cRightHand || m_cLeftHand != rhs.m_cLeftHand);
}
inline const unsigned char GetHead(void) { return m_cHead; }
inline const unsigned char GetBody(void) { return m_cBody; }
inline const unsigned char GetRightHand(void) { return m_cRightHand; }
inline const unsigned char GetLeftHand(void) { return m_cLeftHand; }
static const unsigned char TransferNetworkEquipGrade(Item::CItem* lpItem);
private:
unsigned short m_cHead : 4;
unsigned short m_cBody : 4;
unsigned short m_cRightHand : 4;
unsigned short m_cLeftHand : 4;
};
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD>
struct WarFlagInfo
{
unsigned char m_cGuildWarFlag;
unsigned char m_cRealmWarFlag;
};
enum DataFlag
{
CHARDATA_CHANGED = (1 << 0)
};
class CAggresiveCreatureData
{
public:
CAggresiveCreatureData();
virtual ~CAggresiveCreatureData();
const unsigned long GetCID() const { return m_dwCID; }
const EnchantInfo& GetEnchantInfo() const { return m_EnchantInfo; }
const CNetworkPos GetNetworkPos() const { return m_NetworkPos; }
const unsigned short GetHP() const { return m_usHP; }
void SetEnchantInfo(const EnchantInfo& enchantInfo);
void SetEnchantInfo(unsigned char cIndex, unsigned long dwFlag) { m_EnchantInfo.m_dwStatusFlag[cIndex] = dwFlag; }
void SetNetworkPos(const CNetworkPos& networkPos) { m_NetworkPos = networkPos; }
void SetHP(unsigned short usHP) { m_usHP = usHP; }
void SetDataFlag(unsigned long dwDataFlag) { m_dwDataFlag |= dwDataFlag; }
bool IsSetDataFlag(unsigned long dwDataFlag) { return 0 != (m_dwDataFlag & dwDataFlag); }
void ResetDataFlag(unsigned long dwDataFlag) { m_dwDataFlag &= ~dwDataFlag; }
void ClearDataFlag() { m_dwDataFlag = 0; }
unsigned long GetDataFlag() const { return m_dwDataFlag; }
const unsigned long GetLastUpdatedPulse() const { return m_dwLastUpdatedPulse; }
//! <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20><><EFBFBD>ڷ<EFBFBD> <20>޾Ƽ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
//! <20><><EFBFBD>Ͻÿ<CFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD≯<EFBFBD> <20>־<EFBFBD> <20>ش<EFBFBD>.
//! <20><><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
virtual bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse,
const char* szData, int& nBufferSize_InOut) = 0;
virtual void ClearData();
protected:
unsigned long m_dwCID;
unsigned long m_dwLastUpdatedPulse;
unsigned long m_dwDataFlag;
EnchantInfo m_EnchantInfo;
CNetworkPos m_NetworkPos;
unsigned short m_usHP;
};
// ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
class CCharacterData : public CAggresiveCreatureData
{
public:
enum
{
MAX_NAME = 16,
HALF_EQUIP_POS = 8
};
CCharacterData();
virtual ~CCharacterData();
const char* GetName() const { return m_szName; }
const char* GetStallName() const { return m_szStallName; }
void GetEquipmentsID(unsigned short* lpEquipmentsID_Out, unsigned char nIDNum) const;
const unsigned long GetGuildID() const { return m_CommunityInfo.m_dwGuild_ID; }
const unsigned long GetPartyID() const { return m_CommunityInfo.m_dwParty_ID; }
const unsigned long GetFame() const { return m_CommunityInfo.m_dwFame; }
const unsigned long GetMileage() const { return m_CommunityInfo.m_dwMileage; }
const unsigned long GetBodyInfo() const { return m_StatusInfo.m_dwBodyInfo; }
const CNetworkEquipGrade GetNetworkEquipGrade() const { return m_NetworkEquipGrade; }
const unsigned char GetGuildWarFlag() const { return m_WarFlagInfo.m_cGuildWarFlag; }
const unsigned char GetRealmWarFlag() const { return m_WarFlagInfo.m_cRealmWarFlag; }
const unsigned char GetTacticsFlag() const { return m_CommunityInfo.m_cTacticsFlag; }
const unsigned char GetAdminLevel() const { return m_StatusInfo.m_BodyInfo.m_cAdminLevel; }
const unsigned char GetClassType() const { return m_StatusInfo.m_cClass; }
const unsigned char GetLevel() const { return m_StatusInfo.m_cLevel; }
const unsigned char GetRace() const { return m_StatusInfo.m_BodyInfo.m_cRace; }
const unsigned char GetNation() const { return m_StatusInfo.m_BodyInfo.m_cNationality; }
const unsigned char GetFace() const { return m_StatusInfo.m_BodyInfo.m_cFace; }
const unsigned char GetHair() const { return m_StatusInfo.m_BodyInfo.m_cHair; }
const unsigned char GetSex() const { return static_cast<unsigned char>(m_StatusInfo.m_BodyInfo.m_cSex) + 1; }
const unsigned char GetHandPos() const { return m_StatusInfo.m_BodyInfo.m_cHandPos; }
const unsigned char GetRideFlag() const { return m_StatusInfo.m_BodyInfo.m_cRideFlag; }
const bool IsPeaceMode() const { return m_StatusInfo.m_BodyInfo.m_bPeaceMode; }
const bool IsAdmin() const { return (0 != m_StatusInfo.m_BodyInfo.m_cAdminLevel); }
const unsigned char GetRealmPoint() const { return m_cRealmPoint; }
void SetEquipmentsID(unsigned short* lpEquipmentsID_In, const unsigned char nIDNum);
void SetEquipmentsID(unsigned long dwEquipmentsID_In, const unsigned char nIDIndex);
void SetName(const char* szName, const size_t nNameLen);
void SetStallName(const char* szStallName, const size_t nStallNameLen);
void SetGuildID(unsigned long dwGID) { m_CommunityInfo.m_dwGuild_ID = dwGID; }
void SetPartyID(unsigned long dwPID) { m_CommunityInfo.m_dwParty_ID = dwPID; }
void SetFame(unsigned long dwFame) { m_CommunityInfo.m_dwFame = dwFame; }
void SetMileage(unsigned long dwMileage) { m_CommunityInfo.m_dwMileage = dwMileage;}
void SetBodyInfo(unsigned long dwBodyInfo) { m_StatusInfo.m_dwBodyInfo = dwBodyInfo; }
void SetNetworkEquipGrade(const CNetworkEquipGrade& equipGrade) { m_NetworkEquipGrade = equipGrade; }
void SetGuildWarFlag(unsigned char cFlag) { m_WarFlagInfo.m_cGuildWarFlag = cFlag; }
void SetRealmWarFlag(unsigned char cFlag) { m_WarFlagInfo.m_cRealmWarFlag = cFlag; }
void SetTacticsFlag(unsigned char cFlag) { m_CommunityInfo.m_cTacticsFlag = cFlag; }
void SetClass(unsigned char cClass) { m_StatusInfo.m_cClass = cClass; }
void SetLevel(unsigned char cLevel) { m_StatusInfo.m_cLevel = cLevel; }
void SetRealmPoint(unsigned char cRealmPoint) { m_cRealmPoint = cRealmPoint; }
void ClearData();
bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse,
const char* szData, int& nBufferSize_InOut);
static int EstimateBufferSize(unsigned long dwUpdateFlag);
protected:
char m_szName[MAX_NAME];
char m_szStallName[StallNode::MAX_STALL_NAME];
unsigned long m_dwDoubleEquipsID[HALF_EQUIP_POS]; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
CommunityInfo m_CommunityInfo;
bcStatusInfo m_StatusInfo;
CNetworkEquipGrade m_NetworkEquipGrade;
WarFlagInfo m_WarFlagInfo;
unsigned char m_cRealmPoint;
};
class CMonsterData : public CAggresiveCreatureData
{
public:
CMonsterData();
virtual ~CMonsterData();
void ClearData();
bool UpdateData(unsigned long dwCID, unsigned long dwCurrentPulse,
const char* szData, int& nBufferSize_InOut);
static int EstimateBufferSize(unsigned char cUpdateFlag);
protected:
unsigned long m_dwMasterCID; // <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>....
};
}
#endif

View File

@@ -0,0 +1,703 @@
#include "stdafx.h"
#include "ChatCharData.h"
#include "BroadcastCharacterData.h"
#include <DB/DBComponent.h>
#include <DB/AdminDBComponent.h>
#include <Community/FriendList.h>
#include <Community/BanList.h>
#include <Network/Dispatch/GameClient/SendCharCommunity.h>
#include <Network/Dispatch/MultiDispatchStorage.h>
using Broadcast2nd::COPY_AND_ADVANCE_SRC;
using Broadcast2nd::COPY_AND_ADVANCE_DST;
ChatData::CCharInfo::CCharInfo(unsigned long dwUID, unsigned long dwCID,
unsigned long dwServerID, CXRefFriends* lpXRefFriends, CXRefBans* lpXRefBans)
: m_dwUID(dwUID), m_dwServerID(dwServerID), m_bSendLoginData(false),
m_cAdminLevel(0), m_FriendList(dwCID, lpXRefFriends), m_BanList(dwCID, lpXRefBans)
{
memset(m_szName, 0, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
memset(m_szAccountName, 0, sizeof(char) * CHAR_INFOST::MAX_ACCOUNT_LEN);
memset(&m_CharData, 0, sizeof(BattleInclination::CharData));
memset(&m_RejectOption, 0, sizeof(RejectOption));
m_CharData.m_dwCID = dwCID;
}
bool ChatData::CCharInfo::UpdateData(const char* szData, int& nDataLen)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const char* szDataPos = szData;
if (nDataLen < sizeof(unsigned short))
{
return false;
}
unsigned short usUpdateFlag = 0;
COPY_AND_ADVANCE_SRC(&usUpdateFlag, szDataPos, sizeof(unsigned short));
int nEstimateSize = EstimateBufferSize(usUpdateFlag) + sizeof(unsigned short);
if (nDataLen < nEstimateSize)
{
return false;
}
if (usUpdateFlag & DELTA_NAME)
{
COPY_AND_ADVANCE_SRC(m_szName,
szDataPos, sizeof(char) * CHAR_INFOST::MAX_NAME_LEN);
}
if (usUpdateFlag & DELTA_PID)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_dwPID,
szDataPos, sizeof(unsigned long));
}
if (usUpdateFlag & DELTA_GID)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_dwGID,
szDataPos, sizeof(unsigned long));
COPY_AND_ADVANCE_SRC(&m_CharData.m_cTacticsFlag,
szDataPos, sizeof(unsigned char));
}
if (usUpdateFlag & DELTA_WARFLAG)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_cRealmWarFlag,
szDataPos, sizeof(unsigned char));
COPY_AND_ADVANCE_SRC(&m_CharData.m_cGuildWarFlag,
szDataPos, sizeof(unsigned char));
}
if (usUpdateFlag & DELTA_CASTLEID)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_dwCastleID,
szDataPos, sizeof(unsigned long));
}
if (usUpdateFlag & DELTA_SIEGESTATE)
{
m_CharData.m_cSiegeState = *szDataPos;
++szDataPos;
}
if (usUpdateFlag & DELTA_NATION)
{
m_CharData.m_cNation = *szDataPos;
++szDataPos;
}
if (usUpdateFlag & DELTA_ETCFLAGS)
{
m_CharData.m_cFlags = *szDataPos;
++szDataPos;
}
if (usUpdateFlag & DELTA_REJECTOPTION)
{
COPY_AND_ADVANCE_SRC(&m_RejectOption,
szDataPos, sizeof(RejectOption));
}
if (usUpdateFlag & DELTA_ADMINLEVEL)
{
m_cAdminLevel = *szDataPos;
++szDataPos;
}
if (usUpdateFlag & DELTA_ACCOUNTNAME)
{
COPY_AND_ADVANCE_SRC(m_szAccountName,
szDataPos, sizeof(char) * CHAR_INFOST::MAX_ACCOUNT_LEN);
}
if (usUpdateFlag & DELTA_CREATURETYPE)
{
m_CharData.m_cCreatureType = *szDataPos;
++szDataPos;
}
if (usUpdateFlag & DELTA_OBJECTTYPE)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_wObjectType,
szDataPos, sizeof(unsigned short));
}
if (usUpdateFlag & DELTA_KID)
{
COPY_AND_ADVANCE_SRC(&m_CharData.m_wObjectType,
szDataPos, sizeof(unsigned short));
}
nDataLen = static_cast<int>(szDataPos - szData);
return true;
}
int ChatData::CCharInfo::EstimateBufferSize(unsigned short usUpdateFlag)
{
int nBufferSize = 0;
if (usUpdateFlag & DELTA_NAME) { nBufferSize += sizeof(char) * CHAR_INFOST::MAX_NAME_LEN; }
if (usUpdateFlag & DELTA_PID) { nBufferSize += sizeof(unsigned long); }
if (usUpdateFlag & DELTA_GID) { nBufferSize += sizeof(unsigned long); }
if (usUpdateFlag & DELTA_GID) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_WARFLAG) { nBufferSize += sizeof(unsigned char)*2; }
if (usUpdateFlag & DELTA_CASTLEID) { nBufferSize += sizeof(unsigned long); }
if (usUpdateFlag & DELTA_SIEGESTATE) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_NATION) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_ETCFLAGS) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_REJECTOPTION) { nBufferSize += sizeof(RejectOption); }
if (usUpdateFlag & DELTA_ADMINLEVEL) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_ACCOUNTNAME) { nBufferSize += sizeof(char) * CHAR_INFOST::MAX_ACCOUNT_LEN; }
if (usUpdateFlag & DELTA_CREATURETYPE) { nBufferSize += sizeof(unsigned char); }
if (usUpdateFlag & DELTA_OBJECTTYPE) { nBufferSize += sizeof(unsigned short); }
if (usUpdateFlag & DELTA_KID) { nBufferSize += sizeof(unsigned short); }
return nBufferSize;
}
ChatData::CCharInfoMap& ChatData::CCharInfoMap::GetInstance()
{
static CCharInfoMap charInfoMap;
return charInfoMap;
}
ChatData::CCharInfoMap::~CCharInfoMap()
{
Destroy();
}
void ChatData::CCharInfoMap::Destroy()
{
CharInfoMap::iterator pos = m_cidMap.begin();
CharInfoMap::iterator end = m_cidMap.end();
for(;pos != end; ++pos)
{
delete pos->second;
}
m_cidMap.clear();
m_pidMap.clear();
m_gidMap.clear();
m_raceMap.clear();
m_nameMap.clear();
}
inline unsigned long nameHash(const unsigned char *str, int length)
{
unsigned long hash = 0;
int c;
while (c = *str && 0 < length)
{
++str;
--length;
hash = c + (hash << 6) + (hash << 16) - hash;
}
return hash;
}
bool ChatData::CCharInfoMap::AddCharInfo(CCharInfo* lpCharInfo)
{
if (0 != lpCharInfo)
{
// <20>̹<EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>ű<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20>ִ´<D6B4>.
CharInfoMap::iterator insertPos = m_cidMap.lower_bound(lpCharInfo->GetCID());
if (insertPos != m_cidMap.end() && insertPos->first == lpCharInfo->GetCID())
{
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> ã<>Ҵ<EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
CCharInfo* lpDelCharInfo = insertPos->second;
CCharInfo* lpRemovedCharInfo = RemoveCharInfo(lpDelCharInfo->GetUID(),
lpDelCharInfo->GetCID(), lpDelCharInfo->GetServerID());
if (0 != lpRemovedCharInfo)
{
delete lpRemovedCharInfo;
}
}
// <20>ű<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
CharInfoMap::iterator result = m_cidMap.insert(insertPos,
CharInfoMap::value_type(lpCharInfo->GetCID(), lpCharInfo));
if (result != m_cidMap.end())
{
// GID
if (0 != lpCharInfo->GetGID())
{
m_gidMap.insert(CharInfoMap::value_type(
lpCharInfo->GetGID(), lpCharInfo));
}
// PID
if (0 != lpCharInfo->GetPID())
{
m_pidMap.insert(CharInfoMap::value_type(
lpCharInfo->GetPID(), lpCharInfo));
}
// Race
m_raceMap.insert(CharInfoMap::value_type(
lpCharInfo->GetRace(), lpCharInfo));
// ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD>
unsigned long dwNameHash = nameHash(
reinterpret_cast<const unsigned char*>(lpCharInfo->GetName()),
CHAR_INFOST::MAX_NAME_LEN);
m_nameMap.insert(CharInfoMultiMap::value_type(dwNameHash, lpCharInfo));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned long dwAccountHash = nameHash(
reinterpret_cast<const unsigned char*>(lpCharInfo->GetAccountName()),
CHAR_INFOST::MAX_ACCOUNT_LEN);
m_accountMap.insert(CharInfoMultiMap::value_type(dwAccountHash, lpCharInfo));
// ä<><C3A4> <20><><EFBFBD><EFBFBD>
unsigned long dwMinutes = 0;
if (DBComponent::AdminDB::GetCharChatBan(
CDBSingleObject::GetInstance(), lpCharInfo->GetCID(), dwMinutes) && dwMinutes)
{
AddCharChatBan(lpCharInfo->GetCID(), dwMinutes);
}
DETLOG3(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><><EFBFBD><EFBFBD>",
lpCharInfo->GetUID(), lpCharInfo->GetCID(), lpCharInfo->GetServerID());
return true;
}
else
{
ERRLOG1(g_Log, "CID:0x%08x/<2F><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.", lpCharInfo->GetCID());
}
}
return false;
}
ChatData::CCharInfo* ChatData::CCharInfoMap::GetCharInfoByUID(unsigned long dwUID)
{
CharInfoMap::iterator pos = m_cidMap.begin();
CharInfoMap::iterator end = m_cidMap.end();
for(; pos != end; ++pos)
{
CCharInfo* lpCharInfo = pos->second;
if (lpCharInfo->GetUID() == dwUID)
{
return lpCharInfo;
}
}
return 0;
}
ChatData::CCharInfo* ChatData::CCharInfoMap::GetCharInfoByCID(unsigned long dwCID)
{
CharInfoMap::iterator pos = m_cidMap.find(dwCID);
CharInfoMap::iterator end = m_cidMap.end();
return pos != end ? pos->second : 0;
}
ChatData::CCharInfo* ChatData::CCharInfoMap::GetCharInfoByName(const char* szName)
{
std::pair<CharInfoMultiMap::iterator, CharInfoMultiMap::iterator>
result = m_nameMap.equal_range(nameHash(
reinterpret_cast<const unsigned char*>(szName), CHAR_INFOST::MAX_NAME_LEN));
for(; result.first != result.second; ++result.first)
{
CCharInfo* lpCharInfo = result.first->second;
if (0 == strncmp(lpCharInfo->GetName(), szName, CHAR_INFOST::MAX_NAME_LEN))
{
return lpCharInfo;
}
}
return 0;
}
ChatData::CCharInfo* ChatData::CCharInfoMap::GetCharInfoByAccountName(const char* szAccountName)
{
std::pair<CharInfoMultiMap::iterator, CharInfoMultiMap::iterator>
result = m_accountMap.equal_range(nameHash(
reinterpret_cast<const unsigned char*>(szAccountName), CHAR_INFOST::MAX_ACCOUNT_LEN));
for(; result.first != result.second; ++result.first)
{
CCharInfo* lpCharInfo = result.first->second;
if (0 == strncmp(lpCharInfo->GetAccountName(), szAccountName, CHAR_INFOST::MAX_ACCOUNT_LEN))
{
return lpCharInfo;
}
}
return 0;
}
namespace ChatData
{
inline bool EraseByKey(CCharInfoMap::CharInfoMultiMap& map,
unsigned long dwUID, unsigned long dwCID, unsigned long dwServerID, unsigned long dwKey)
{
std::pair<CCharInfoMap::CharInfoMultiMap::iterator,
CCharInfoMap::CharInfoMultiMap::iterator> result = map.equal_range(dwKey);
for(; result.first != result.second; ++result.first)
{
CCharInfo* lpDelCharInfo = result.first->second;
if(!lpDelCharInfo)
{
return false;
}
if (lpDelCharInfo->GetUID() == dwUID &&
lpDelCharInfo->GetCID() == dwCID &&
lpDelCharInfo->GetServerID() == dwServerID)
{
map.erase(result.first);
return true;
}
}
return false;
}
};
ChatData::CCharInfo* ChatData::CCharInfoMap::RemoveCharInfo(unsigned long dwUID,
unsigned long dwCID, unsigned long dwServerID)
{
CharInfoMap::iterator pos = m_cidMap.find(dwCID);
if (pos != m_cidMap.end())
{
CCharInfo* lpCharInfo = pos->second;
CCharInfo* lpDelCharInfo = 0;
if (dwUID == lpCharInfo->GetUID() &&
dwCID == lpCharInfo->GetCID() &&
dwServerID == lpCharInfo->GetServerID())
{
// UID<49>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 != lpCharInfo->GetGID())
{
EraseByKey(m_gidMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetGID());
}
// PID<49>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 != lpCharInfo->GetPID())
{
EraseByKey(m_pidMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetPID());
}
// Race<63>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
EraseByKey(m_raceMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetRace());
// ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
EraseByKey(m_nameMap, dwUID, dwCID, dwServerID,
nameHash(reinterpret_cast<const unsigned char*>(lpCharInfo->GetName()),
CHAR_INFOST::MAX_NAME_LEN));
// <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
EraseByKey(m_accountMap, dwUID, dwCID, dwServerID,
nameHash(reinterpret_cast<const unsigned char*>(lpCharInfo->GetAccountName()),
CHAR_INFOST::MAX_ACCOUNT_LEN));
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const unsigned long dwRemainTime = GetCharChatBan(dwCID);
if (0 != dwRemainTime)
{
DBComponent::AdminDB::UpdateCharChatBanTime(
CDBSingleObject::GetInstance(), dwCID, dwRemainTime);
DeleteCharChatBan(dwCID);
}
m_cidMap.erase(pos);
DETLOG3(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>",
dwUID, dwCID, dwServerID);
return lpCharInfo;
}
else
{
ERRLOG6(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/"
"CurrentUID:%10u/CurrentCID:0x%08x/CurrentServerID:0x%08x/"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>.", dwUID, dwCID, dwServerID,
lpCharInfo->GetUID(), lpCharInfo->GetCID(), lpCharInfo->GetServerID());
}
}
else
{
ERRLOG3(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwUID, dwCID, dwServerID);
}
return 0;
}
void ChatData::CCharInfoMap::RemoveCharInfo(unsigned long dwServerID)
{
CharInfoMap::iterator pos = m_cidMap.begin();
CharInfoMap::iterator end = m_cidMap.end();
for(; pos != end;)
{
CCharInfo* lpCharInfo = pos->second;
if(lpCharInfo->GetServerID() == dwServerID)
{
unsigned long dwUID = lpCharInfo->GetUID();
unsigned long dwCID = lpCharInfo->GetCID();
if (0 != lpCharInfo->GetGID())
{
EraseByKey(m_gidMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetGID());
}
if (0 != lpCharInfo->GetPID())
{
EraseByKey(m_pidMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetPID());
}
// Race<63>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD>
EraseByKey(m_raceMap, dwUID, dwCID,
dwServerID, lpCharInfo->GetRace());
unsigned long dwNameHash = nameHash(
reinterpret_cast<const unsigned char*>(lpCharInfo->GetName()), CHAR_INFOST::MAX_NAME_LEN);
EraseByKey(m_nameMap, dwUID, dwCID, dwServerID, dwNameHash);
// ä<><C3A4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const unsigned long dwRemainTime = GetCharChatBan(dwCID);
if (0 != dwRemainTime)
{
DBComponent::AdminDB::UpdateCharChatBanTime(
CDBSingleObject::GetInstance(), dwCID, dwRemainTime);
DeleteCharChatBan(dwCID);
}
pos = m_cidMap.erase(pos);
delete lpCharInfo;
}
else
{
++pos;
}
}
}
bool ChatData::CCharInfoMap::AddCharChatBan(unsigned long dwTargetCID, unsigned long dwMinutes)
{
CharBanMap::iterator pos = m_banMap.find(dwTargetCID);
if (pos != m_banMap.end())
{
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų <20><> <20>ٽ<EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD>Ų<EFBFBD><C5B2>. (<28>α<EFBFBD><CEB1>ÿ<EFBFBD><C3BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.)
m_banMap.erase(pos);
//DBComponent::AdminDB::EndCharChatBan(CDBSingleObject::GetInstance(), dwTargetCID);
}
m_banMap.insert(std::make_pair(dwTargetCID, dwMinutes));
return true;
}
bool ChatData::CCharInfoMap::GetCharChatBanInfo(unsigned long dwTargetCID, unsigned long& dwMinutes)
{
DBComponent::AdminDB::GetCharChatBan(CDBSingleObject::GetInstance(), dwTargetCID, dwMinutes);
return true;
}
bool ChatData::CCharInfoMap::DeleteCharChatBan(unsigned long dwCID)
{
CharBanMap::iterator pos = m_banMap.find(dwCID);
if (pos != m_banMap.end())
{
if(pos->second)
{
DBComponent::AdminDB::UpdateCharChatBanTime(CDBSingleObject::GetInstance(), pos->first, pos->second);
}
m_banMap.erase(pos);
return true;
}
return false;
}
unsigned long ChatData::CCharInfoMap::GetCharChatBan(unsigned long dwCID)
{
CharBanMap::iterator pos = m_banMap.find(dwCID);
if (pos != m_banMap.end())
{
return pos->second;
}
return 0;
}
void ChatData::CCharInfoMap::ProcessCharChatBan(CMultiDispatch& dispatch)
{
for (CharBanMap::iterator pos = m_banMap.begin(); pos != m_banMap.end(); )
{
if (0 < pos->second)
{
--(pos->second);
}
if (0 == pos->second)
{
DWORD dwCID = pos->first;
DWORD dwMinute = pos->second;
dispatch.Process(CSendCharChatBanAllGameServer(dwCID, dwMinute));
pos = m_banMap.erase(pos);
DBComponent::AdminDB::EndCharChatBan(CDBSingleObject::GetInstance(), dwCID);
}
else
{
// 10<31><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DB<44><42> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
if (0 == pos->second % 10)
{
DBComponent::AdminDB::UpdateCharChatBanTime(
CDBSingleObject::GetInstance(), pos->first, pos->second);
}
++pos;
}
}
}
bool ChatData::CCharInfoMap::Update(unsigned long dwUID, unsigned long dwCID,
unsigned long dwServerID, const char* lpData, int& nDataLen)
{
CharInfoMap::iterator pos = m_cidMap.find(dwCID);
if (pos != m_cidMap.end())
{
CCharInfo* lpCharInfo = pos->second;
if (dwUID == lpCharInfo->GetUID() &&
dwCID == lpCharInfo->GetCID() &&
dwServerID == lpCharInfo->GetServerID())
{
unsigned long dwGID = lpCharInfo->GetGID();
unsigned long dwPID = lpCharInfo->GetPID();
char szName[CHAR_INFOST::MAX_NAME_LEN];
strncpy(szName, lpCharInfo->GetName(), CHAR_INFOST::MAX_NAME_LEN);
szName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
if (lpCharInfo->UpdateData(lpData, nDataLen))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD>.
// GID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (dwGID != lpCharInfo->GetGID())
{
if (0 != dwGID) { EraseByKey(m_gidMap, dwUID, dwCID, dwServerID, dwGID); }
if (0 != lpCharInfo->GetGID())
{
m_gidMap.insert(CharInfoMultiMap::value_type(
lpCharInfo->GetGID(), lpCharInfo));
}
}
// PID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (dwPID != lpCharInfo->GetPID())
{
if (0 != dwPID) { EraseByKey(m_pidMap, dwUID, dwCID, dwServerID, dwPID); }
if (0 != lpCharInfo->GetPID())
{
m_pidMap.insert(CharInfoMultiMap::value_type(
lpCharInfo->GetPID(), lpCharInfo));
}
}
// <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD>
if (0 != strncmp(szName, lpCharInfo->GetName(), CHAR_INFOST::MAX_NAME_LEN))
{
EraseByKey(m_nameMap, dwUID, dwCID, dwServerID, nameHash(
reinterpret_cast<const unsigned char*>(szName), CHAR_INFOST::MAX_NAME_LEN));
m_nameMap.insert(CharInfoMultiMap::value_type(
nameHash(reinterpret_cast<const unsigned char*>(
lpCharInfo->GetName()), CHAR_INFOST::MAX_NAME_LEN), lpCharInfo));
}
return true;
}
else
{
ERRLOG3(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/ä<><C3A4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>",
dwUID, dwCID, dwServerID);
}
}
else
{
ERRLOG6(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/"
"CurrentUID:%10u/CurrentCID:0x%08x/CurrentServerID:0x%08x/"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϳ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>ϴ<EFBFBD>.", dwUID, dwCID, dwServerID,
lpCharInfo->GetUID(), lpCharInfo->GetCID(), lpCharInfo->GetServerID());
}
}
else
{
ERRLOG3(g_Log, "UID:%10u/CID:0x%08x/ServerID:0x%08x/"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> : <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>", dwUID, dwCID, dwServerID);
}
return false;
}
bool CSendCharChatBanAllGameServer::operator () (unsigned long dwServerID, CPacketDispatch& dispatch)
{
CRylServerDispatch& rylServerDispatch = static_cast<CRylServerDispatch&>(dispatch);
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4><EFBFBD><EFBFBD> <20><> <20><EFBFBD><EEBFB5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD>.
return GameClientSendPacket::SendCharChatBan(rylServerDispatch.GetSendStream(), 0, m_dwCID, m_dwMinutes);
}

View File

@@ -0,0 +1,254 @@
#ifndef _GAMA_RYL_CHATSERVER_CHAT_SEND_H_
#define _GAMA_RYL_CHATSERVER_CHAT_SEND_H_
#include <boost/pool/pool_alloc.hpp>
#include <Community/FriendList.h>
#include <Community/BanList.h>
#include <Network/Dispatch/RylServerDispatch.h>
#include <Network/Packet/PacketStruct/CharAttackPacketStruct.h>
#include <Network/Packet/PacketStruct/CharConfigPacketStruct.h>
#include <Creature/CreatureStructure.h>
class CMultiDispatch;
namespace ChatData
{
enum DeltaInfo
{
DELTA_NAME = (1 << 0),
DELTA_PID = (1 << 1),
DELTA_GID = (1 << 2),
DELTA_CASTLEID = (1 << 3),
DELTA_SIEGESTATE = (1 << 4),
DELTA_NATION = (1 << 5),
DELTA_ETCFLAGS = (1 << 6),
DELTA_REJECTOPTION = (1 << 7),
DELTA_ADMINLEVEL = (1 << 8),
DELTA_ACCOUNTNAME = (1 << 9),
DELTA_CREATURETYPE = (1 << 10),
DELTA_OBJECTTYPE = (1 << 11),
DELTA_KID = (1 << 12),
DELTA_WARFLAG = (1 << 13),
};
class CCharInfo
{
public:
CCharInfo(unsigned long dwUID, unsigned long dwCID,
unsigned long dwServerID, CXRefFriends* lpXRefFriends = 0, CXRefBans* lpXRefBans = 0);
unsigned char GetRealmWarFlag() const { return m_CharData.m_cRealmWarFlag; }
unsigned char GetGuildWarFlag() const { return m_CharData.m_cGuildWarFlag; }
unsigned char GetTacticsFlag() const { return m_CharData.m_cTacticsFlag; }
unsigned long GetUID() const { return m_dwUID; }
unsigned long GetCID() const { return m_CharData.m_dwCID; }
unsigned long GetPID() const { return m_CharData.m_dwPID; }
unsigned long GetGID() const { return m_CharData.m_dwGID; }
unsigned long GetServerID() const { return m_dwServerID; }
unsigned char GetCreatureType() const { return m_CharData.m_cCreatureType; }
unsigned short GetObjectType() const { return m_CharData.m_wObjectType; }
unsigned short GetKind() const { return m_CharData.m_wKind; }
unsigned long GetCastleID() const { return m_CharData.m_dwCastleID; }
unsigned char GetSiegeState() const { return m_CharData.m_cSiegeState; }
unsigned char GetNation() const { return m_CharData.m_cNation; }
RejectOption GetRejectOption() const { return m_RejectOption; }
unsigned char GetRace() const { return m_CharData.m_cNation; }
unsigned char GetAdminLevel() const { return m_cAdminLevel; } // 0 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD>. 1,2,3,... <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
unsigned char GetIsPeaceMode() const { return m_CharData.IsPeaceMode(); } // 0 : <20><20><><EFBFBD><EFBFBD> 1 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
const char* GetName() const { return m_szName; }
const char* GetAccountName() const { return m_szAccountName; }
unsigned char GetFlags() const { return m_CharData.m_cFlags; }
BattleInclination::CharData GetInclinationData() { return m_CharData; }
CFriendList& GetFriendList() { return m_FriendList; }
CBanList& GetBanList() { return m_BanList; }
// Ű<><C5B0> <20><> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>
// <20><><EFBFBD>߿<EFBFBD> <20>˻<EFBFBD><CBBB><EFBFBD> <20><><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>Ժη<D4BA> <20><><EFBFBD><EFBFBD> <20><> <20><>.
void SetTacticsFlag(unsigned char cFlag) { m_CharData.m_cTacticsFlag = cFlag; }
void SetUID(unsigned long dwUID) { m_dwUID = dwUID; }
void SetCID(unsigned long dwCID) { m_CharData.m_dwCID = dwCID; }
void SetPID(unsigned long dwPID) { m_CharData.m_dwPID = dwPID; }
void SetGID(unsigned long dwGID) { m_CharData.m_dwGID = dwGID; }
void SetServerID(unsigned long dwServerID) { m_dwServerID = dwServerID; }
void SetRealmWarFlag(unsigned char cFlag) { m_CharData.m_cRealmWarFlag = cFlag; }
void SetGuildWarFlag(unsigned char cFlag) { m_CharData.m_cGuildWarFlag = cFlag; }
void SetName(const char* szName)
{
strncpy(m_szName, szName, CHAR_INFOST::MAX_NAME_LEN);
m_szName[CHAR_INFOST::MAX_NAME_LEN - 1] = 0;
}
void SetAccountName(const char* szAccountName)
{
strncpy(m_szAccountName, szAccountName, CHAR_INFOST::MAX_ACCOUNT_LEN);
m_szAccountName[CHAR_INFOST::MAX_ACCOUNT_LEN - 1] = 0;
}
void SetCastleID(unsigned long dwCastleID) { m_CharData.m_dwCastleID = dwCastleID; }
void SetSiegeState(unsigned char cSiegeState) { m_CharData.m_cSiegeState = cSiegeState; }
void SetNation(unsigned char cNation) { m_CharData.m_cNation = cNation; }
void SetFlags(unsigned char cFlags) { m_CharData.m_cFlags = cFlags; }
void SetCreatureType(unsigned char cCreatureType) { m_CharData.m_cCreatureType = cCreatureType; }
void SetObjectType(unsigned short wObjectType) { m_CharData.m_wObjectType = wObjectType; }
void SetKind(unsigned short wKind) { m_CharData.m_wKind = wKind; }
void SetRejectOption(RejectOption rejectOption) { m_RejectOption = rejectOption; }
void SetAdminLevel(unsigned char cAdminLevel) { m_cAdminLevel = cAdminLevel; }
// <20><>Ŷ<EFBFBD><C5B6><EFBFBD>κ<EFBFBD><CEBA><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
bool UpdateData(const char* szData, int& nDataLen);
static int EstimateBufferSize(unsigned short usUpdateFlag);
bool IsSendLoginData() const { return m_bSendLoginData; }
void SetSendLoginData(bool bSendLoginData) { m_bSendLoginData = bSendLoginData; }
private:
char m_szName[CHAR_INFOST::MAX_NAME_LEN]; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28>̺<EFBFBD>Ʈ)
char m_szAccountName[CHAR_INFOST::MAX_ACCOUNT_LEN]; // <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
unsigned long m_dwUID; // <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
unsigned long m_dwServerID; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
BattleInclination::CharData m_CharData; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RejectOption m_RejectOption; // <20>ź<EFBFBD> <20>ɼ<EFBFBD>
unsigned char m_cAdminLevel; // <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD>
bool m_bSendLoginData;
CBanList m_BanList;
CFriendList m_FriendList;
};
class CCharInfoMap
{
public:
typedef std::map<unsigned long, CCharInfo*, std::less<unsigned long>,
boost::fast_pool_allocator<std::pair<const unsigned long, CCharInfo*> > > CharInfoMap;
typedef std::multimap<unsigned long, CCharInfo*, std::less<unsigned long>,
boost::fast_pool_allocator< std::pair <const unsigned long, CCharInfo*> > > CharInfoMultiMap;
typedef std::map<unsigned long, unsigned long, std::less<unsigned long>,
boost::fast_pool_allocator< std::pair <const unsigned long, unsigned long> > > CharBanMap;
static CCharInfoMap& GetInstance();
bool AddCharInfo(CCharInfo* lpCharInfo);
void RemoveCharInfo(unsigned long dwServerID);
CCharInfo* RemoveCharInfo(unsigned long dwUID, unsigned long dwCID, unsigned long dwServerID);
bool AddCharChatBan(unsigned long dwTargetCID, unsigned long dwMinutes);
bool DeleteCharChatBan(unsigned long dwCID);
unsigned long GetCharChatBan(unsigned long dwCID);
void ProcessCharChatBan(CMultiDispatch& dispatch);
bool GetCharChatBanInfo(unsigned long dwTargetCID, unsigned long& dwMinutes);
CCharInfo* GetCharInfoByUID(unsigned long dwUID);
CCharInfo* GetCharInfoByCID(unsigned long dwCID);
CCharInfo* GetCharInfoByName(const char* szName);
CCharInfo* GetCharInfoByAccountName(const char* szAccountName);
bool Update(unsigned long dwUID, unsigned long dwCID,
unsigned long dwServerID, const char* lpData, int& nDataLen);
template<typename FnProcess>
void EnumerateByPID(unsigned long dwPID, FnProcess fnProcess)
{
std::pair<CharInfoMultiMap::iterator, CharInfoMultiMap::iterator> result
= m_pidMap.equal_range(dwPID);
for(; result.first != result.second; ++result.first)
{
fnProcess(*result.first->second);
}
}
template<typename FnProcess>
void EnumerateByGID(unsigned long dwGID, FnProcess fnProcess)
{
std::pair<CharInfoMultiMap::iterator, CharInfoMultiMap::iterator> result
= m_gidMap.equal_range(dwGID);
for(; result.first != result.second; ++result.first)
{
fnProcess(*result.first->second);
}
}
template<typename FnProcess>
void EnumerateByRace(unsigned long dwRace, FnProcess fnProcess)
{
std::pair<CharInfoMultiMap::iterator, CharInfoMultiMap::iterator> result
= m_raceMap.equal_range(dwRace);
for(; result.first != result.second; ++result.first)
{
fnProcess(*result.first->second);
}
}
template<typename FnProcess>
void EnumerateAll(FnProcess fnProcess)
{
CharInfoMap::iterator pos = m_cidMap.begin();
CharInfoMap::iterator end = m_cidMap.end();
for(; pos != end; ++pos)
{
fnProcess(*pos->second);
}
}
void Destroy();
private:
~CCharInfoMap();
CharInfoMap m_cidMap; // <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CharInfoMultiMap m_pidMap; // PID<49><44> 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
CharInfoMultiMap m_gidMap; // GID<49><44> 0<><30> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
CharInfoMultiMap m_raceMap; // Race<63><65>
CharInfoMultiMap m_nameMap; // ij<><C4B3><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.
CharInfoMultiMap m_accountMap; // ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>Ұ<EFBFBD><D2B0><EFBFBD><EFBFBD>ϴ<EFBFBD>.
CharBanMap m_banMap; // ä<><C3A4> <20><><EFBFBD><EFBFBD>Ʈ
};
}
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ä<><C3A4> <20><><EFBFBD><EFBFBD> <20>˸<EFBFBD><CBB8><EFBFBD>
class CSendCharChatBanAllGameServer
{
public:
CSendCharChatBanAllGameServer(unsigned long dwCID, unsigned long dwMinutes)
: m_dwCID(dwCID), m_dwMinutes(dwMinutes)
{ }
bool operator () (unsigned long dwServerID, CPacketDispatch& dispatch);
private:
unsigned long m_dwCID;
bool m_dwMinutes;
};
#endif

View File

@@ -0,0 +1,296 @@
#include "stdafx.h"
#include "ClientCellMgr.h"
#include "BroadcastCharacterData.h"
#include <functional>
#include <utility>
#include <algorithm>
#include <Creature/CreatureStructure.h>
#include "GMMemory.h"
namespace Broadcast2nd
{
CClientCellMgr::CClientCellMgr()
: m_dwCID(0)
{
}
CClientCellMgr::~CClientCellMgr()
{
}
void CClientCellMgr::Initialize(unsigned long dwCID)
{
Clear();
m_dwCID = dwCID;
}
void CClientCellMgr::Clear()
{
m_CharacterDataMap.clear();
}
void CClientCellMgr::CellLogin(const char* szData, unsigned short usDataSize)
{
int nDataSize = usDataSize;
const char* szDataPos = szData;
unsigned long dwCID = 0;
CCharacterData characterData;
CMonsterData monsterData;
CharacterDataMap::iterator char_pos;
MonsterDataMap::iterator mon_pos;
for(; sizeof(unsigned long) < nDataSize; )
{
memcpy(&dwCID, szDataPos, sizeof(unsigned long));
szDataPos += sizeof(unsigned long);
nDataSize -= sizeof(unsigned long);
int nBufferSize = nDataSize;
switch(Creature::GetCreatureType(dwCID))
{
case Creature::CT_PC:
characterData.ClearData();
if(characterData.UpdateData(dwCID, 0, szDataPos, nBufferSize))
{
char_pos = m_CharacterDataMap.lower_bound(dwCID);
if(char_pos != m_CharacterDataMap.end() && char_pos->first == dwCID)
{
// <20>̹<EFBFBD> ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
char_pos->second = characterData;
}
else
{
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20>űԷ<C5B1> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
m_CharacterDataMap.insert(char_pos, std::make_pair(dwCID, characterData));
}
}
break;
case Creature::CT_MONSTER:
case Creature::CT_SUMMON:
case Creature::CT_STRUCT:
monsterData.ClearData();
if (monsterData.UpdateData(dwCID, 0, szDataPos, nBufferSize))
{
mon_pos = m_MonsterDataMap.lower_bound(dwCID);
if (mon_pos != m_MonsterDataMap.end() && mon_pos->first == dwCID)
{
mon_pos->second = monsterData;
}
else
{
m_MonsterDataMap.insert(mon_pos, std::make_pair(dwCID, monsterData));
}
}
break;
}
// <20>Ѹ<EFBFBD><D1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>, <20><><EFBFBD>۰<EFBFBD> <20><>â <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>
// <20>׳<EFBFBD> Pass<73>Ѵ<EFBFBD>.
szDataPos += nBufferSize;
nDataSize -= nBufferSize;
}
}
void CClientCellMgr::CellUpdateData(const char* szData, unsigned short usDataSize,
unsigned long dwCurrentPulse)
{
int nDataSize = usDataSize;
const char* szDataPos = szData;
unsigned long dwCID = 0;
unsigned long dwUpdateData = 0;
CharacterDataMap::iterator char_pos;
MonsterDataMap::iterator mon_pos;
for(; sizeof(unsigned long) < nDataSize; )
{
// CID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, CID<49><44><EFBFBD≯<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
memcpy(&dwCID, szDataPos, sizeof(unsigned long));
szDataPos += sizeof(unsigned long);
nDataSize -= sizeof(unsigned long);
int nBufferSize = nDataSize;
switch(Creature::GetCreatureType(dwCID))
{
case Creature::CT_PC:
char_pos = m_CharacterDataMap.find(dwCID);
if(char_pos != m_CharacterDataMap.end())
{
CCharacterData& charData = char_pos->second;
if(!charData.UpdateData(dwCID,
dwCurrentPulse, szDataPos, nBufferSize))
{
break;
}
}
else
{
// ij<><C4B3><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>!. <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> update<74><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
memcpy(&dwUpdateData, szDataPos, sizeof(unsigned long));
szDataPos += sizeof(unsigned long);
nDataSize -= sizeof(unsigned long);
nBufferSize = CCharacterData::EstimateBufferSize(dwUpdateData);
}
break;
case Creature::CT_MONSTER:
case Creature::CT_SUMMON:
case Creature::CT_STRUCT:
mon_pos = m_MonsterDataMap.find(dwCID);
if(mon_pos != m_MonsterDataMap.end())
{
CMonsterData& monData = mon_pos->second;
if(!monData.UpdateData(dwCID,
dwCurrentPulse, szDataPos, nBufferSize))
{
break;
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD>!. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> update<74><65> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
unsigned char cUpdateData =
*reinterpret_cast<const unsigned char*>(szDataPos);
szDataPos += sizeof(unsigned char);
nDataSize -= sizeof(unsigned char);
nBufferSize = CMonsterData::EstimateBufferSize(cUpdateData);
}
break;
}
szDataPos += nBufferSize;
nDataSize -= nBufferSize;
}
}
void CClientCellMgr::CellLogout(unsigned long dwCID)
{
switch(Creature::GetCreatureType(dwCID))
{
case Creature::CT_PC:
m_CharacterDataMap.erase(dwCID);
break;
case Creature::CT_MONSTER:
case Creature::CT_SUMMON:
case Creature::CT_STRUCT:
m_MonsterDataMap.erase(dwCID);
break;
}
}
void CClientCellMgr::RemoveCharDataByPulse(unsigned long dwCurrentPulse,
unsigned long dwExceptCID)
{
CharacterDataMap::iterator char_pos = m_CharacterDataMap.begin();
CharacterDataMap::iterator char_end = m_CharacterDataMap.end();
for (; char_pos != char_end ; )
{
CCharacterData& charData = char_pos->second;
if (charData.GetLastUpdatedPulse() == dwCurrentPulse ||
charData.GetCID() == dwExceptCID)
{
++char_pos;
}
else
{
char_pos = m_CharacterDataMap.erase(char_pos);
}
}
MonsterDataMap::iterator mon_pos = m_MonsterDataMap.begin();
MonsterDataMap::iterator mon_end = m_MonsterDataMap.end();
for (; mon_pos != mon_end; )
{
CMonsterData& monData = mon_pos->second;
if (monData.GetLastUpdatedPulse() == dwCurrentPulse ||
monData.GetCID() == dwExceptCID)
{
++mon_pos;
}
else
{
mon_pos = m_MonsterDataMap.erase(mon_pos);
}
}
}
CCharacterData* CClientCellMgr::GetCharacterData(unsigned long dwCID)
{
CharacterDataMap::iterator pos = m_CharacterDataMap.find(dwCID);
return (pos != m_CharacterDataMap.end()) ? &pos->second : 0;
}
void CClientCellMgr::UpdatePos(unsigned long dwCID, const CNetworkPos& netPos)
{
switch(Creature::GetCreatureType(dwCID))
{
case Creature::CT_PC:
{
CharacterDataMap::iterator pos = m_CharacterDataMap.find(dwCID);
if(pos != m_CharacterDataMap.end())
{
pos->second.SetNetworkPos(netPos);
}
}
break;
case Creature::CT_MONSTER:
case Creature::CT_SUMMON:
case Creature::CT_STRUCT:
{
MonsterDataMap::iterator pos = m_MonsterDataMap.find(dwCID);
if(pos != m_MonsterDataMap.end())
{
pos->second.SetNetworkPos(netPos);
}
}
break;
}
}
void CClientCellMgr::UpdateStallName(unsigned long dwCID, const char* szStallName)
{
if(0 == szStallName)
{
szStallName = "";
}
CharacterDataMap::iterator pos = m_CharacterDataMap.find(dwCID);
if(pos != m_CharacterDataMap.end())
{
pos->second.SetStallName(szStallName, strlen(szStallName) + 1);
}
}
}

View File

@@ -0,0 +1,95 @@
#ifndef _CLIENT_BROADCAST_2ND_CELL_MGR_H_
#define _CLIENT_BROADCAST_2ND_CELL_MGR_H_
#include <map>
#include "BroadcastCharacterData.h"
//! Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.
//! <20><>Ʈ<EFBFBD><C6AE>ũ<EFBFBD><C5A9> <20><><EFBFBD>۵<EFBFBD> <20><><EFBFBD>̳ʸ<CCB3> <20><><EFBFBD><EFBFBD><EFBFBD>ͷκ<CDB7><CEBA><EFBFBD> CCharacterData<74><61> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>,
//! <20><><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD><CCBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
//! <20><> <20>α<EFBFBD><CEB1><EFBFBD>, <20><> <20>α׾ƿ<D7BE><C6BF><EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20>޾Ƽ<DEBE>, <20><><EFBFBD>ù<EFBFBD><C3B9><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϰ<EFBFBD>
//! <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ<EFBFBD><C6AE> <20>޾Ƽ<DEBE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ݴϴ<DDB4>.
/*!
<20><> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><> ó<><C3B3><><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE>)
1byte(<28><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ Ÿ<><C5B8>)
1. <20><> <20>α<EFBFBD><CEB1><EFBFBD>
2. <20><> <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3. <20><> <20>α׾ƿ<D7BE>
4. <20><> <20><><EFBFBD>ε<EFBFBD>ij<EFBFBD><C4B3>Ʈ
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ľ<EFBFBD><C4BD><EFBFBD> <20>Ŀ<EFBFBD>..
*/
class CNetworkPos;
namespace Broadcast2nd
{
class CClientCellMgr
{
public:
CClientCellMgr();
~CClientCellMgr();
//! <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> CID<49><44> <20>ʱ<EFBFBD>ȭ<EFBFBD>Ѵ<EFBFBD>. (ó<><C3B3> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>)
void Initialize(unsigned long dwCID);
//! <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
void Clear();
//! <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
void CellLogin(const char* szData, unsigned short usDataSize);
//! <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
void CellUpdateData(const char* szData,
unsigned short usDataSize, unsigned long dwCurrentPulse);
//! ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void CellLogout(unsigned long dwCID);
//! <20><><EFBFBD><EFBFBD> Pulse<73><65> <20>ٸ<EFBFBD> Pulse<73><65> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> ij<><C4B3><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void RemoveCharDataByPulse(unsigned long dwCurrentPulse, unsigned long dwExceptCID);
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>´<EFBFBD>.
CCharacterData* GetCharacterData(unsigned long dwCID);
CMonsterData* GetMonsterData(unsigned long dwCID);
void UpdatePos(unsigned long dwCID, const CNetworkPos& netPos); //! <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
void UpdateStallName(unsigned long dwCID, const char* szStallName = 0); //! <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD>Ѵ<EFBFBD>.
size_t GetCharacterNum() const { return m_CharacterDataMap.size(); }
size_t GetMonsterNum() const { return m_MonsterDataMap.size(); }
//! <20><>ȸ <20>޼<EFBFBD><DEBC><EFBFBD>. ij<><C4B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> <20><>ü<EFBFBD><C3BC> <20><>ȸ<EFBFBD>Ѵ<EFBFBD>.
template<typename FnProcess>
void ProcessCharacter(FnProcess fnProcess)
{
CharacterDataMap::iterator pos = m_CharacterDataMap.begin();
CharacterDataMap::iterator end = m_CharacterDataMap.end();
for(; pos != end; ++pos) { fnProcess(pos->second); }
}
template<typename FnProcess>
void ProcessMonster(FnProcess fnProcess)
{
MonsterDataMap::iterator pos = m_MonsterDataMap.begin();
MonsterDataMap::iterator end = m_MonsterDataMap.end();
for(; pos != end; ++pos) { fnProcess(pos->second); }
}
private:
typedef std::map<unsigned long, CCharacterData> CharacterDataMap;
typedef std::map<unsigned long, CMonsterData> MonsterDataMap;
unsigned long m_dwCID; // <20><><EFBFBD><EFBFBD> CID;
CharacterDataMap m_CharacterDataMap;
MonsterDataMap m_MonsterDataMap;
};
};
#endif

View File

@@ -0,0 +1,111 @@
#ifndef _SERIALIZE_CHARACTER_DATA_H_
#define _SERIALIZE_CHARACTER_DATA_H_
#include "BroadcastCharacterData.h"
#include "ChatCharData.h"
//! <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>. Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>
//! <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>ȭ(Serialze) <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
//! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, <20><> <20>ʸ<EFBFBD><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>Ѹ<EFBFBD><D1B8><EFBFBD>.
//! forward decl
class CCharacter;
class CMonster;
namespace Broadcast2nd
{
class CSerializeCharacterData
{
public:
enum
{
MAX_CHARACTER_DATA = 160
};
CSerializeCharacterData();
~CSerializeCharacterData();
//! <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void InitializeData(CCharacter& character);
//! <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>غ<EFBFBD><D8BA>ϰ<EFBFBD>, Delta<74><61> <20><><EFBFBD>Ѵ<EFBFBD>.
void PrepareData(CCharacter& character);
void PrepareBroadcastData(CCharacter& character);
void PrepareDeltaData(CCharacter& character);
void ClearDeltaData() { m_usDeltaBroadcastDataLen = 0; }
CCharacterData& GetCharacterData() { return m_LastCharacterData; }
const char* GetBroadcastData() const { return m_aryBroadcastData; }
unsigned short GetBroadcastDataLen() const { return m_usBroadcastDataLen; }
const char* GetDeltaBroadcastData() const { return m_aryDeltaBroadcastData; }
unsigned short GetDeltaBroadcastDataLen() const { return m_usDeltaBroadcastDataLen; }
bool SendChatLogin(CCharacter& character);
bool SendChatLogout(CCharacter& character);
private:
// ä<>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Diff<66><66><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>غ<EFBFBD><D8BA>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void SendDeltaChatData(CCharacter& character);
CCharacterData m_LastCharacterData;
ChatData::CCharInfo m_LastChatData;
unsigned long m_dwPreparedCount;
unsigned short m_usBroadcastDataLen;
unsigned short m_usDeltaBroadcastDataLen;
char m_aryBroadcastData[MAX_CHARACTER_DATA];
char m_aryDeltaBroadcastData[MAX_CHARACTER_DATA];
};
class CSerializeMonsterData
{
public:
enum
{
MAX_MONSTER_DATA = 64
};
CSerializeMonsterData();
~CSerializeMonsterData();
//! <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
void InitializeData(CMonster& monster);
//! <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>غ<EFBFBD><D8BA>ϰ<EFBFBD>, Delta<74><61> <20><><EFBFBD>Ѵ<EFBFBD>.
void PrepareData(CMonster& monster);
void PrepareBroadcastData(CMonster& monster);
void PrepareDeltaData(CMonster& monster);
void ClearDeltaData() { m_usDeltaBroadcastDataLen = 0; }
CMonsterData& GetMonsterData() { return m_LastMonsterData; }
const char* GetBroadcastData() const { return m_aryBroadcastData; }
unsigned short GetBroadcastDataLen() const { return m_usBroadcastDataLen; }
const char* GetDeltaBroadcastData() const { return m_aryDeltaBroadcastData; }
unsigned short GetDeltaBroadcastDataLen() const { return m_usDeltaBroadcastDataLen; }
private:
CMonsterData m_LastMonsterData;
unsigned long m_dwPreparedCount;
unsigned short m_usBroadcastDataLen;
unsigned short m_usDeltaBroadcastDataLen;
char m_aryBroadcastData[MAX_MONSTER_DATA];
char m_aryDeltaBroadcastData[MAX_MONSTER_DATA];
};
};
#endif