458 lines
14 KiB
C++
458 lines
14 KiB
C++
#include "stdafx.h"
|
|
#include "./StructInPacket.h"
|
|
#include <ArchiveOfStream.h>
|
|
|
|
// (WAVERIX) (090920) (CHANGES) no-define work Output&Input -> moved to code-file
|
|
|
|
void
|
|
CLIENT_CHARACTER_PART::Output(ArchiveOfStream& archive)
|
|
{
|
|
//write
|
|
m_tszCharName[MAX_CHARNAME_LENGTH] = '\0';
|
|
BYTE len = (BYTE)strlen(m_tszCharName);
|
|
|
|
archive << m_bySlot;
|
|
archive << len;
|
|
archive.Write(m_tszCharName, len);
|
|
archive << m_byHeight;
|
|
archive << m_byFace;
|
|
archive << m_byHair;
|
|
archive << m_byClass;
|
|
archive << m_LV;
|
|
archive << m_iRegion;
|
|
archive << m_sX;
|
|
archive << m_sY;
|
|
archive << m_sZ;
|
|
archive << m_ChangeOfClassStep;
|
|
archive << m_EquipItemInfo.m_Count;
|
|
for(BYTE i = 0 ; i < m_EquipItemInfo.m_Count ; ++i)
|
|
{
|
|
archive << m_EquipItemInfo.m_Slot[i];
|
|
}
|
|
|
|
archive << m_DelChk;
|
|
if(m_DelChk != 0)
|
|
{
|
|
m_tszDelDate[MAX_SMALLDATETIME_SIZE] = '\0';
|
|
len = (BYTE)strlen(m_tszDelDate);
|
|
archive << len;
|
|
archive.Write(m_tszDelDate, len);
|
|
}
|
|
|
|
archive << m_PetSlotStream;
|
|
archive << m_bSummoned;
|
|
#ifdef _NA_002050_20110216_ADD_GENDER
|
|
archive << gender;
|
|
#endif
|
|
//_NA_004035_20120227_COSTUME_ITEM
|
|
archive << is_equipped_costume;
|
|
archive << costume_item_pos;
|
|
archive << costume_item_code;
|
|
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
|
|
archive << is_equipped_decorate_costume;
|
|
archive << decorate_costume_item_pos;
|
|
archive << decorate_costume_item_code;
|
|
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
|
|
}
|
|
|
|
void
|
|
CLIENT_CHARACTER_PART::Input(ArchiveOfStream& archive)
|
|
{
|
|
//read
|
|
archive >> m_bySlot;
|
|
BYTE len = 0;
|
|
archive >> len;
|
|
archive.Read(m_tszCharName, len);
|
|
m_tszCharName[len] = '\0';
|
|
|
|
archive >> m_byHeight;
|
|
archive >> m_byFace;
|
|
archive >> m_byHair;
|
|
archive >> m_byClass;
|
|
archive >> m_LV;
|
|
archive >> m_iRegion;
|
|
archive >> m_sX;
|
|
archive >> m_sY;
|
|
archive >> m_sZ;
|
|
archive >> m_ChangeOfClassStep;
|
|
archive >> m_EquipItemInfo.m_Count;
|
|
for(BYTE i = 0 ; i < m_EquipItemInfo.m_Count ; ++i)
|
|
{
|
|
archive >> m_EquipItemInfo.m_Slot[i];
|
|
}
|
|
archive >> m_DelChk;
|
|
if(m_DelChk != 0)
|
|
{
|
|
archive >> len;
|
|
archive.Read(m_tszDelDate, len);
|
|
m_tszDelDate[len] = '\0';
|
|
|
|
}
|
|
|
|
archive >> m_PetSlotStream;
|
|
archive >> m_bSummoned;
|
|
#ifdef _NA_002050_20110216_ADD_GENDER
|
|
archive >> gender;
|
|
#endif
|
|
//_NA_004035_20120227_COSTUME_ITEM
|
|
archive >> is_equipped_costume;
|
|
archive >> costume_item_pos;
|
|
archive >> costume_item_code;
|
|
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
|
|
archive >> is_equipped_decorate_costume;
|
|
archive >> decorate_costume_item_pos;
|
|
archive >> decorate_costume_item_code;
|
|
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
|
|
}
|
|
|
|
int
|
|
PLAYER_RENDER_INFO_EX::ConvertForSend(BOOLEAN is_player_render,
|
|
const PLAYER_RENDER_INFO_EX& input,
|
|
PLAYER_RENDER_INFO_EX* packed_output)
|
|
{
|
|
//ZeroMemory(encoded_output, sizeof(*this));
|
|
ArchiveOfStream serializer((BYTE*)packed_output, sizeof(input));
|
|
|
|
is_player_render = !!is_player_render;
|
|
|
|
serializer << is_player_render;
|
|
serializer << input.player_key;
|
|
// (CHANGES) (WAVERIX) unify village render and player render
|
|
serializer << input.hp;
|
|
serializer << input.max_hp;
|
|
serializer << input.level;
|
|
|
|
|
|
BYTE len = (BYTE)strlen(input.char_name); //...
|
|
serializer << len;
|
|
//assert(len != 0);
|
|
serializer.Write(input.char_name, len);
|
|
|
|
serializer << input.position;
|
|
serializer << input.selected_style_code;
|
|
serializer << input.move_speed_ratio;
|
|
// (CHANGES) (WAVERIX) unify village render and player render
|
|
serializer << input.attack_speed_ratio;
|
|
|
|
#define RENDER_BITS_MASK(used_bits) \
|
|
((1 << (used_bits)) - 1)
|
|
|
|
#define RENDER_BITS_PUSH(field, used_bits) { \
|
|
bits <<= (used_bits); \
|
|
bits |= (field) & RENDER_BITS_MASK(used_bits); \
|
|
number_of_used_bits += (used_bits);}
|
|
|
|
//------------------------------------------------
|
|
;{
|
|
DWORD bits = 0, number_of_used_bits = 0;
|
|
#if !defined(_NA_002050_20110216_ADD_GENDER)
|
|
RENDER_BITS_PUSH(input.hair_style, 6);
|
|
#endif
|
|
RENDER_BITS_PUSH(input.transparent, 2);
|
|
#if !defined(_NA_002050_20110216_ADD_GENDER)
|
|
RENDER_BITS_PUSH(input.height, 3);
|
|
RENDER_BITS_PUSH(input.face, 4);
|
|
#endif
|
|
RENDER_BITS_PUSH(input.helmet, 1);
|
|
#ifdef _NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
|
|
RENDER_BITS_PUSH(input.wing, 1);
|
|
#endif //_NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
|
|
#ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
|
|
RENDER_BITS_PUSH(input.costume, 1);
|
|
#endif // _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
|
|
RENDER_BITS_PUSH(input.gm_grade, 3);
|
|
RENDER_BITS_PUSH(input.pcroom, 1);
|
|
RENDER_BITS_PUSH(input.char_condition, 1);
|
|
RENDER_BITS_PUSH(input.char_class, 4);
|
|
RENDER_BITS_PUSH(input.boradori, 1);
|
|
RENDER_BITS_PUSH(input.chao_state, 2);
|
|
RENDER_BITS_PUSH(input.behave_state, 5);
|
|
#if defined(_NA_002050_20110216_ADD_GENDER) && defined(_NA001955_110210_WING_COSTUME)
|
|
RENDER_BITS_PUSH(input.spread_wings, 1);
|
|
#endif
|
|
assert(number_of_used_bits <= 32);
|
|
serializer << bits;
|
|
};
|
|
//------------------------------------------------
|
|
#ifdef _NA_002050_20110216_ADD_GENDER
|
|
;{
|
|
DWORD bits = 0, number_of_used_bits = 0;
|
|
RENDER_BITS_PUSH(input.gender, 2);
|
|
RENDER_BITS_PUSH(input.hair_style, 6);
|
|
RENDER_BITS_PUSH(input.height, 3);
|
|
RENDER_BITS_PUSH(input.face, 4);
|
|
|
|
assert(number_of_used_bits <= 32);
|
|
serializer << bits;
|
|
};
|
|
#elif defined(_NA001955_110210_WING_COSTUME)
|
|
serializer << input.spread_wings;
|
|
#endif
|
|
//------------------------------------------------
|
|
|
|
serializer << input.special_effects;
|
|
|
|
BOOLEAN checked = !!input.is_summoned_pet;
|
|
serializer << checked;
|
|
if(checked) {
|
|
serializer << input.pet_index;
|
|
serializer << input.pet_fullness;
|
|
serializer << input.pet_intimacy;
|
|
}
|
|
|
|
len = (BYTE)strlen(input.pet_name);
|
|
serializer << len;
|
|
if(len) {
|
|
serializer.Write(input.pet_name, len);
|
|
}
|
|
|
|
serializer << input.ether_device_index;
|
|
|
|
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|
|
serializer << input.honor_title;
|
|
#endif //_NA_003027_20111013_HONOR_SYSTEM
|
|
|
|
//_NA_004035_20120227_COSTUME_ITEM
|
|
serializer << input.is_equipped_costume;
|
|
serializer << input.costume_item_code;
|
|
|
|
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
|
|
serializer << input.is_equipped_decorate_costume;
|
|
serializer << input.decorate_costume_item_code;
|
|
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
|
|
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
serializer << input.special_scene_item_code;
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
|
|
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
|
|
serializer << input.total_item_score_;
|
|
#endif // _NA_000000_20130206_BROADCAST_ITEM_SCORE
|
|
|
|
checked = !!input.is_riding;
|
|
serializer << checked;
|
|
if(checked) {
|
|
serializer << input.rider_item_slot;
|
|
}
|
|
|
|
BOOST_STATIC_ASSERT(sizeof(BOOLEAN) == sizeof(input.collection_render_info.m_bUseCollectRanderInfo));
|
|
checked = !!input.collection_render_info.m_bUseCollectRanderInfo;
|
|
if(checked == 0) {
|
|
serializer << checked;
|
|
}
|
|
else {
|
|
serializer << input.collection_render_info;
|
|
}
|
|
|
|
serializer.Write(&input.state_total_info, input.state_total_info.GetSize());
|
|
|
|
return serializer.GetSize();
|
|
}
|
|
|
|
int
|
|
PLAYER_RENDER_INFO_EX::ConvertForRecv(const PLAYER_RENDER_INFO_EX* packed_input,
|
|
PLAYER_RENDER_INFO_EX* output)
|
|
{
|
|
const int SmallClearRange = static_cast<int>((char*)(&output->state_total_info) - (char*)output);
|
|
ZeroMemory(output, SmallClearRange);
|
|
ArchiveOfStream serializer((BYTE*)packed_input, sizeof(*packed_input));
|
|
|
|
BOOLEAN is_player_render = 0;
|
|
serializer >> is_player_render;
|
|
serializer >> output->player_key;
|
|
// (CHANGES) (WAVERIX) unify village render and player render
|
|
serializer >> output->hp;
|
|
serializer >> output->max_hp;
|
|
serializer >> output->level;
|
|
|
|
BYTE len = 0; //(BYTE)strlen(output->char_name); //...
|
|
serializer >> len;
|
|
assert(len != 0);
|
|
serializer.Read(output->char_name, len);
|
|
|
|
serializer >> output->position;
|
|
serializer >> output->selected_style_code;
|
|
serializer >> output->move_speed_ratio;
|
|
// (CHANGES) (WAVERIX) unify village render and player render
|
|
serializer >> output->attack_speed_ratio;
|
|
|
|
//---- defined in 'ConvertForSend' ----
|
|
//#define RENDER_BITS_MASK(used_bits) \
|
|
// ((1 << (used_bits)) - 1)
|
|
//-------------------------------------
|
|
#define RENDER_BITS_POP(field, used_bits) { \
|
|
(field) = (BYTE)((bits) & RENDER_BITS_MASK(used_bits)); \
|
|
bits >>= (used_bits); } \
|
|
|
|
//------------------------------------------------
|
|
;{
|
|
DWORD bits = 0;
|
|
// (WARNING) PUSH와 역순으로 풀어야 한다.
|
|
serializer >> bits;
|
|
#if defined(_NA_002050_20110216_ADD_GENDER) && defined(_NA001955_110210_WING_COSTUME)
|
|
RENDER_BITS_POP(output->spread_wings, 1);
|
|
#endif
|
|
RENDER_BITS_POP(output->behave_state, 5);
|
|
RENDER_BITS_POP(output->chao_state, 2);
|
|
RENDER_BITS_POP(output->boradori, 1);
|
|
RENDER_BITS_POP(output->char_class, 4);
|
|
RENDER_BITS_POP(output->char_condition, 1);
|
|
RENDER_BITS_POP(output->pcroom, 1);
|
|
RENDER_BITS_POP(output->gm_grade, 3);
|
|
#ifdef _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
|
|
RENDER_BITS_POP(output->costume, 1);
|
|
#endif // _NA_006683_20130502_EQUIPMENTS_VISIBLE_COSTUME
|
|
#ifdef _NA_000000_20120420_EQUIPMENTS_VISIBLE_WING
|
|
RENDER_BITS_POP(output->wing, 1);
|
|
#endif
|
|
RENDER_BITS_POP(output->helmet, 1);
|
|
|
|
#if !defined(_NA_002050_20110216_ADD_GENDER)
|
|
RENDER_BITS_POP(output->face, 4);
|
|
RENDER_BITS_POP(output->height, 3);
|
|
#endif
|
|
RENDER_BITS_POP(output->transparent, 2);
|
|
#if !defined(_NA_002050_20110216_ADD_GENDER)
|
|
RENDER_BITS_POP(output->hair_style, 6);
|
|
#endif
|
|
};
|
|
//------------------------------------------------
|
|
//------------------------------------------------
|
|
#ifdef _NA_002050_20110216_ADD_GENDER
|
|
;{
|
|
DWORD bits = 0;
|
|
// (WARNING) PUSH와 역순으로 풀어야 한다.
|
|
serializer >> bits;
|
|
|
|
RENDER_BITS_POP(output->face, 4);
|
|
RENDER_BITS_POP(output->height, 3);
|
|
RENDER_BITS_POP(output->hair_style, 6);
|
|
RENDER_BITS_POP(output->gender, 2);
|
|
};
|
|
#elif defined(_NA001955_110210_WING_COSTUME)
|
|
serializer >> output->spread_wings;
|
|
#endif
|
|
|
|
serializer >> output->special_effects;
|
|
|
|
serializer >> output->is_summoned_pet;
|
|
if(output->is_summoned_pet) {
|
|
serializer >> output->pet_index;
|
|
serializer >> output->pet_fullness;
|
|
serializer >> output->pet_intimacy;
|
|
}
|
|
len = 0;
|
|
serializer >> len;
|
|
if(len) {
|
|
serializer.Read(output->pet_name, len);
|
|
}
|
|
|
|
serializer >> output->ether_device_index;
|
|
|
|
#ifdef _NA_003027_20111013_HONOR_SYSTEM
|
|
serializer >> output->honor_title;
|
|
#endif //_NA_003027_20111013_HONOR_SYSTEM
|
|
|
|
//_NA_004035_20120227_COSTUME_ITEM
|
|
serializer >> output->is_equipped_costume;
|
|
serializer >> output->costume_item_code;
|
|
#ifdef _NA_008610_20160104_ADD_DECORATECOSTUME
|
|
serializer >> output->is_equipped_decorate_costume;
|
|
serializer >> output->decorate_costume_item_code;
|
|
#endif //_NA_008610_20160104_ADD_DECORATECOSTUME
|
|
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
serializer >> output->special_scene_item_code;
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
|
|
#ifdef _NA_000000_20130206_BROADCAST_ITEM_SCORE
|
|
serializer >> output->total_item_score_;
|
|
#endif // _NA_000000_20130206_BROADCAST_ITEM_SCORE
|
|
|
|
serializer >> output->is_riding;
|
|
if(output->is_riding) {
|
|
serializer >> output->rider_item_slot;
|
|
}
|
|
|
|
BOOST_STATIC_ASSERT(sizeof(BOOLEAN) == \
|
|
sizeof(output->collection_render_info.m_bUseCollectRanderInfo));
|
|
|
|
serializer >> output->collection_render_info.m_bUseCollectRanderInfo;
|
|
if(output->collection_render_info.m_bUseCollectRanderInfo) {
|
|
serializer.Seek(-(int)(sizeof(output->collection_render_info.m_bUseCollectRanderInfo)));
|
|
serializer >> output->collection_render_info;
|
|
}
|
|
|
|
// (WARNING) 좀 더 좋은 방안을 강구하자.
|
|
BOOST_STATIC_ASSERT(sizeof(BYTE) == sizeof(output->state_total_info.m_Count));
|
|
serializer >> len;
|
|
output->state_total_info.m_Count = len;
|
|
if(len != 0) {
|
|
serializer.Seek(-(int)(sizeof(output->state_total_info.m_Count)));
|
|
serializer.Read(&output->state_total_info, output->state_total_info.GetSize());
|
|
}
|
|
|
|
return serializer.GetSize();
|
|
}
|
|
|
|
// (f100527.5L) moved a code block from a header file
|
|
void VENDOR_LIST_INFO::Output(ArchiveOfStream& archive) const
|
|
{
|
|
//write
|
|
BYTE len;
|
|
len = (BYTE)strlen(m_pszTitle);
|
|
archive << len;
|
|
archive.Write(m_pszTitle, len);
|
|
len = (BYTE)strlen(m_pszID);
|
|
archive << len;
|
|
archive.Write(m_pszID, len);
|
|
archive << m_dwPlayerKey;
|
|
}
|
|
|
|
void VENDOR_LIST_INFO::Input(const ArchiveOfStream& archive)
|
|
{
|
|
//read
|
|
BYTE len;
|
|
archive >> len;
|
|
archive.Read(m_pszTitle, len);
|
|
m_pszTitle[MAX_VENDOR_TITLE_LENGTH] = '\0';
|
|
archive >> len;
|
|
archive.Read(m_pszID, len);
|
|
m_pszID[ID_MAX_LEN] = '\0';
|
|
archive >> m_dwPlayerKey;
|
|
}
|
|
|
|
void VENDOR_LIST_TOTAL_INFO::Output(ArchiveOfStream& archive) const
|
|
{
|
|
//write
|
|
archive << m_AllPage;
|
|
archive << m_Count;
|
|
for (BYTE i = 0 ; i < m_Count ; i++)
|
|
{
|
|
m_List[i].Output(archive);
|
|
}
|
|
}
|
|
|
|
void VENDOR_LIST_TOTAL_INFO::Input(const ArchiveOfStream& archive)
|
|
{
|
|
archive >> m_AllPage;
|
|
archive >> m_Count;
|
|
for (BYTE i = 0 ; i < m_Count ; i++)
|
|
{
|
|
m_List[i].Input(archive);
|
|
}
|
|
}
|
|
|
|
//==================================================================================================
|
|
// in server
|
|
void nsSync::KBMoveSerialNode::Create()
|
|
{
|
|
ZeroMemory(this, sizeof(*this));
|
|
serial_guid = static_cast<uint16_t>(RandomNumberGenerator::GetRandomNumber());
|
|
serial_key_begin = RandomNumberGenerator::GetRandomNumber();
|
|
stop_serial_key_begin = RandomNumberGenerator::GetRandomNumber();
|
|
}
|
|
|
|
//==================================================================================================
|
|
|