系统代码块
XxXdef.hpp
#ifndef __XXX_DEF_HPP__
#define __XXX_DEF_HPP__
#pragma pack(push, 4)
#include "servercommon/servercommon.h"
const int INT_ARRAY_MAX = 10;
struct XxXParam
{
XxXParam() { this->Reset(); }
void Reset()
{
memset(int_array, 0, sizeof(int_array));
}
// 四字节对齐
int int_array[INT_ARRAY_MAX];
};
using XxXParamHex = char[sizeof(XxXParam) * 2 + 1];
static_assert(sizeof(XxXParamHex) < 4096, "Incorrect size");
#pragma pack(pop)
#endif // __XXX_DEF_HPP__
XxX.h
#ifndef __XXX_H__
#define __XXX_H__
#include "servercommon/xxxdef.hpp"
#include "obj/character/attribute.hpp"
class Role;
class XxX
{
public:
void SetRole(Role *role) { m_role = role; }
void InitParam(const XxXParam ¶m);
void GetInitParam(XxXParam *param) { *param = m_param; }
void ReCalcAttr(CharIntAttrs &base_add, bool is_recalc);
private:
Role *m_role = nullptr;
CharIntAttrs m_attrs_add;
XxXParam m_param;
};
#endif // __XXX_H__
XxX.cpp
#include "stdafx.h"
#include "gamecommon.h"
#include "xxx.h"
#include "protocal/msgxxx.h"
#include "xxxconfig.hpp"
void XxX::InitParam(const XxXParam ¶m)
{
m_param = param;
m_module.Init(m_role, this);
}
void XxX::ReCalcAttr(CharIntAttrs &base_add, bool is_recalc)
{
if (!is_recalc)
{
base_add.Add(m_attrs_add.m_attrs);
m_role->GetCapability()->AddCap(CAPABILITY_TYPE_XXX, m_other_capability);
return;
}
m_attrs_add.Reset();
m_other_capability = 0;
// m_attrs_add加属性
auto module_cfg = LOGIC_CONFIG->GetXxXCfg().GetModuleCfg();
module_cfg.AddAttrs(m_attrs_add);
base_add.Add(m_attrs_add.m_attrs);
m_role->GetCapability()->AddCap(CAPABILITY_TYPE_XXX, m_other_capability);
}
XxXcofig.hpp
// 系统配置
#ifndef __XXX_CONFIG_HPP__
#define __XXX_CONFIG_HPP__
#include "config/gameconfigcommon/gameconfigcommon.h"
#include "servercommon/xxxdef.hpp"
// 其它
struct XxXOtherConfig
{
int times_cfg = 0;
};
// 模块配置
struct ModuleConfig
{
struct CfgItem
{
int seq = 0; // 索引
ItemID item_id = 0; // 激活道具
AttributesConfig attrs_cfg; // 属性加成
};
int cfg_item_count = 0;
CfgItem cfg_item_list[XXX_ITEM_MAX_COUNT];
};
class XxXConfig
{
public:
XxXConfig();
bool Init(const std::string &configname, std::string *err); // Called by LogicConfigManager::Init
const XxXOtherConfig & GetOtherCfg() { return m_other_cfg; }
const XxXModuleConfig::CfgItem * GetModuleCfg(int seq);
protected:
int InitOtherCfg(RapidXmlNode *root_element);
int InitModuleCfg(RapidXmlNode *root_element);
private:
XxXOtherConfig m_other_cfg;
XxXModuleConfig m_module_cfg;
};
#endif
XxXconfig.cpp
#include "stdafx.h"
#include "xxxconfig.hpp"
bool XxXConfig::Init(const std::string &configname, std::string *err)
{
PRE_LOAD_CONFIG2;
LOAD_CONFIG2("other", InitOtherCfg);
LOAD_CONFIG2("module", InitModuleCfg);
return true;
}
bool XxXConfig::IsValidModuleSeq(int seq) const
{
return seq >= 0 && seq < m_active_cfg.cfg_item_count && seq < MODULE_ITEM_MAX_COUNT;
}
const XxXModuleConfig::CfgItem * XxXConfig::GetActiveCfg(int seq)
{
if (!this->IsValidModuleSeq(seq))
{
return nullptr;
}
return &m_module_cfg.cfg_item_list[seq];
}
int XxXConfig::InitOtherCfg(RapidXmlNode *root_element)
{
RapidXmlNode *data_element = root_element->first_node("data");
if (!data_element)
{
return -10000;
}
if (!ReadPositiveInt(data_element, "times_cfg", m_other_cfg.times_cfg))
{
return -1;
}
return 0;
}
int XxXConfig::InitActiveCfg(RapidXmlNode *root_element)
{
RapidXmlNode *data_element = root_element->first_node("data");
if (!data_element)
{
return -10000;
}
m_active_cfg.cfg_item_count = 0;
while (data_element)
{
if (m_active_cfg.cfg_item_count >= MODULE_ITEM_MAX_COUNT)
{
return -1000;
}
int seq = 0;
if (!GetSubNodeValue(data_element, "seq", seq) || seq != m_active_cfg.cfg_item_count)
{
return -1;
}
BeautyActiveConfig::CfgItem &cfg_item = m_active_cfg.cfg_item_list[m_active_cfg.cfg_item_count];
cfg_item.seq = seq;
if (!GetSubNodeValue(data_element, "active_item_id", cfg_item.active_item_id) || NULL == ITEMPOOL->GetItem(cfg_item.active_item_id))
{
return -2;
}
if (!cfg_item.attrs_cfg.ReadConfig(data_element))
{
return -100;
}
++m_active_cfg.cfg_item_count;
data_element = data_element->next_sibling();
}
return 0;
}
msgxxx.h
// XX协议
#ifndef __MSG_XXX_H__
#define __MSG_XXX_H__
#include "servercommon/userprotocal/msgheader.h"
#include "config/gameconfigcommon/gameconfigcommon.h"
#include "servercommon/xxxdef.hpp"
#include "msgrole.h"
#pragma pack(push)
#pragma pack(4)
namespace Protocol
{
//-------------------------------------------------------------------------------------------
// CS Protocols
// 通用请求类型
enum XXX_COMMON_REQ_TYPE
{
XXX_COMMON_REQ_TYPE_BASE_INFO = 0, // 基础信息请求
};
// 通用请求 协议号
class CSXxXCommonReq
{
public:
CSXxXCommonReq();
MessageHeader header;
unsigned short req_type;
unsigned short param_1;
unsigned short param_2;
unsigned short param_3;
};
//-------------------------------------------------------------------------------------------
// SC Protocols
// 基础信息 协议号
class SCXxXBaseInfo
{
public:
SCXxXBaseInfo();
MessageHeader header;
char reserve_ch1;
char reserve_ch2;
char reserve_ch3;
char reserve_ch4;
};
//-------------------------------------------------------------------------------------------
}
#pragma pack(pop)
#endif