Files
mir_server/server/LogicServer/config/PropertyConfig.h
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

471 lines
17 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include<vector>
#include<string>
#include<map>
/// 宠物的等级
#define MAX_PET_LEVEL_COUNT 10
//玩家的职业配置
#define MAX_LEVEL1_PROPERTY_COUNT 4 ///< 1级属性的数量
#define MAX_LEVEL2_PROPERTY_COUNT 15 ///< 2级属性的数量
#define ACTOR_MAX_LEVEL 120 ///< 玩家的最大的等级
#define MAX_DROP_COIN_ICON_COUNT 10 ///< 最大的掉落的金币的图标的数目
#define MAX_SUIT_COUNT 10 ///< 最大套装装备个数
#define MAX_WEAPONEXTENDBUFF_COUNT 2
#define MAX_LUCK_CURSE_LEVEL 20
#define THINGS_BUF_NUM 4 //秘宝buf加经验的配置数量
#define CHAT_HELP 2 //求救消费
typedef struct tagLevel1PropertyTransfer
{
/// 1级属性到2级属性的转换,一个5*15的矩阵
float m_level1PropertyTransTable[MAX_LEVEL1_PROPERTY_COUNT][MAX_LEVEL2_PROPERTY_COUNT];
tagLevel1PropertyTransfer()
{
memset(this,0,sizeof(*this) );
}
} LEVEL1PROPERTYTRANSFER, *PLEVEL1PROPERTYTRANSFER;
// 玩家的升级经验表
typedef struct tagLevelUpExpTable
{
CVector<LONGLONG> expTable; ///< 经验升级表
CVector<LONGLONG> expRateTable; ///< 多倍经验倍率
/*
* Comments: 获取升级的经验
* Param INT_PTR nLevel:如果输入2表示1级到2级的升级经验
* @Return LONGLONG:返回升级经验
*/
LONGLONG GetLevelExp(INT_PTR nLevel)
{
if(nLevel <=0 || nLevel > expTable.count() )
{
return 100000000000000000; //如果参数出现错误,搞一个很大的经验
}
else
{
return expTable[nLevel -1];
}
}
LONGLONG GetRatebyExp(INT_PTR nLevel)
{
if(nLevel <=0 || nLevel > expRateTable.count() )
{
return 0; //如果参数出现错误
}
else
{
return expRateTable[nLevel];
}
}
}LEVELUPEXPTABLE,*PLEVELUPEXPTABLE;
/// 杀怪经验衰减表
typedef struct tagKillMonsterExpTable
{
CVector<WORD> killMonsterAboveExpTable; ///< 杀>=自身等级怪经验表
CVector<WORD> killMonsterBelowExpTable; ///< 杀 < 自身等级怪经验表
std::map<int, int>killMonsterExpMap; //转生等级差-杀怪经验衰减
int nExpMapSize = 0;
/*
* Comments:获取杀怪的经验
* Param INT_PTR nLevelDis: 等级差
* @Return float: 返回经验的衰减,百分数的
*/
float GetKillMonsterExp(INT_PTR nLevelDis)
{
if(nLevelDis >=0 )
{
/*if(nLevelDis < killMonsterAboveExpTable.count())
{
//return (float)killMonsterAboveExpTable[nLevelDis] / 10000; // 杀死
} */
return 1.0 ;//怪物经验高于玩家不衰减
}
else
{
nLevelDis *= -1;
//nLevelDis --;
/*if(nLevelDis >= 0 && nLevelDis < killMonsterBelowExpTable.count())
{
return (float)killMonsterBelowExpTable[nLevelDis] /10000;
}*/
if(nLevelDis >= 0 )
{
if(nLevelDis <=20 ){
return 1.0;//玩家等级高于怪物20以内不衰减
}
else {
return (float)(1- (float)(nLevelDis -20 )/30.0) ;
//这里当返回值<=0时获得最小经验调用时候单独处理一下小于零
}
}
}
return 0.0;
}
/*
* Comments:获取杀怪的经验
* Param int nLevelDis: 转生等级差
* @Return float: 返回经验的衰减,百分数的
*/
float GetCircleKillMonsterExp(int nLevelDis)
{
if(nLevelDis <= 2)//(人转生等级 - 怪物转生等级 <= 2)均不进行经验衰减
{
return (float)killMonsterExpMap[2] / 100;
}
auto it = killMonsterExpMap.find(nLevelDis);
if(it != killMonsterExpMap.end()) {
return (float) it->second / 100;
} else {
auto it2 = killMonsterExpMap.crbegin();
return (float) it2->second / 100;
}
}
}KILLMONSTEREXPTABLE,*PKILLMONSTEREXPTABLE; //杀怪的经验衰减
typedef struct tagWorldLevelExpRate
{
int nMin;
int nMax;
float fValue;
}WORLDLEVELEXPRATE;
typedef struct tagOnLineAwardYb//活跃度奖励需要玩家等级跟世界等级的差距值
{
int nMin; //达到分钟数目
int nYb; //元宝数量
tagOnLineAwardYb()
{
nMin = 0;
nYb = 0;
}
}ONLINEAWARDYB;
typedef struct tagLevelLimit //活跃度奖励需要玩家等级跟世界等级的差距值
{
int nCircle; //达到分钟数目
int nLevel; //元宝数量
tagLevelLimit()
{
nCircle = 0;
nLevel = 0;
}
}LEVELLIMIT;
//ExpLmtOpenday的elmemet
typedef struct basiclmt{
LONGLONG num ;
int damprate;
basiclmt(LONGLONG _num = 1000000000000, int _damprate = 10000)
: num(_num)
, damprate(_damprate)
{ }
basiclmt(const basiclmt& tmp)
: num(tmp.num)
, damprate(tmp.damprate)
{ }
}BASICLMT;
typedef struct elemTypeOpenday{
LONGLONG multilmt;//多倍经验每日上限
std::map<int, BASICLMT> m_basiclmt ; //基础经验每日上限以及衰减率
elemTypeOpenday(LONGLONG param = 0)
:multilmt(param)
{ }
}ELEMTYPEOPENDAY;
typedef struct ExpLmtOpenday //开服天数相关的等级限制
{
std::map<int, ELEMTYPEOPENDAY> m_expLmtOpenday ;
}EXPLMTOPENDAY;
#define GLOBAL_TIME_LEN 32
/// 全局配置表
typedef struct tagGlobalConfig
{
int nBlinkEnterEffect; // 瞬移技能进入场景的特效id
int nScrollEnterEffect; // 回城卷进入场景的技能特效id
int nMonsterItemRefreshTime; // 怪物掉落物品的有效时间,单位毫秒
int teamLootMaxDistanceSquare; // 最大的拾取距离的平方
int nTeamOpenLevel; //组队开启等级
int nInitSceneId; // 初始化场景ID当地图销毁或者改变这默认登陆到洛阳城
int nInitScenePosX; // 场景坐标x
int nInitScenePosY; // 场景坐标y
int nOnlineCountBase; // 在线人数超过nOnlineCountBase人 怪物翻倍
int nSceneRefreshMonsterTime; // 场景中刷怪的时间限制,单位:毫秒
int nFubenDestoryTime; ///< 副本没人后的保留时间
bool bIsFcmOpen; // 防沉迷是否开启
unsigned int nFcmHalfExpMoneyTime; // 防沉迷开始经验、金钱减半的时间(单位秒)
unsigned int nFcmZeroExpMoneyTime ; // 防沉迷开始经验、金钱没有的时间(单位秒)
//以下是盛趣的防沉迷
bool bIsSqKidsFcmOpen; // 盛趣儿童防沉迷是否开启
unsigned int nKidsFcmHolidayTime; // 儿童防沉迷节假日
unsigned int nKidsFcmWorkDayTime ; // 儿童防沉迷非节假日
char strKidsFcmHolidayStartTime[GLOBAL_TIME_LEN];
char strKidsFcmHolidayEndTime[GLOBAL_TIME_LEN];
char strKidsFcmWorkDayStartTime[GLOBAL_TIME_LEN];
char strKidsFcmWorkDayEndTime[GLOBAL_TIME_LEN];
int nBindYuanbaoLimit; // 绑定元宝的上限默认值5000
int nMoneylimit; // 金币的上限默认值5000
int nBindmoneylimit; // 绑定金币的上限默认值5000
int nYuanbaolimit; // 元宝的上限默认值5000
int nPetLevelAboveOwner; // 宠物最多等级高出玩家的等级
float fPetDeathHpRate; // 宠物复活的时候恢复多少血nMaxCalCurseValue
int nMonsterVectResetInterval; ///怪物归属重置间隔(单位ms)(5s没有打怪清除怪物原来归属)
int nMonsterHatredKeepTime; //boss怪物仇恨值记录时间超过重置伤害值
int QuestEquipData[CHAT_HELP]; // 穿戴装备任务
float fWriteNameBagDropRate; // 白名背包掉落系数
float fWriteNameEquipDropRate; // 白名装备掉落系数
float fRedNameBagDropRate; // 红名背包掉落系数
float fRedNameEquipDropRate; // 红名装备掉落系数
int equipDropRates[itMaxEquipPos]; // 装备各部位系数
int nWriteNameBagDropNum; // 白名掉落数量
int nRedNameBagDropNum; // 全部掉出
int nWriteNameEquipDropNum; // 白名装备掉落数量
int nRedNameEquipDropNum; // 红名装备掉落数量
float fHeroWriteNameEquipDropRate; // 英雄白名装备掉落系数
float fHeroRedNameEquipDropRate; // 英雄红名装备掉落系数
int nHeroWriteNameEquipDropNum; // 英雄白名装备掉落数量
int nHeroRedNameEquipDropNum; // 英雄红名装备掉落数量
int heroEquipDropRates[itMaxEquipPos]; // 英雄装备各部位系数
int nDeathDropExpTotalRate; // 经验掉落总系数,0为不开启,大于0表示掉落总系数
int nWriteNameExpDropRate; // 白名经验掉落系数
int nWriteNameExpDropMax; // 白名经验掉落上限
int nRedNameExpDropRate; // 红名经验掉落系数
int nRedNameExpDropMax; // 红名经验掉落上限
int nSuckBloodRate; //吸血属性(怪物)
int nSuckBloodRatePlayer; //吸血属性 (玩家)万分比
float fBodyDamageRate;
int nMonsterGropDropRangeMax; // 掉落组(group>0)掉落区间最大值
std::vector<int> nDizzyBuffTateJob; // 战士,师法,道士触发麻痹系数
int nDizzyBuffMaxRate; // 麻痹最大概率
int nDizzyBuffMaxTime; // 麻痹最大时间
int nFriendChatLimit; // 好友聊天最低等级
//int nChatLogFlag; // 聊天内容是否存盘
int n2StepSkillHitRate; // 技能攻击的时候距离2格命中的概率1表示万分之1
int n3StepSkillHitRate; // 技能攻击的时候距离3格命中的概率1表示万分之1
int n4StepSkillHitRate; // 技能攻击的时候距离4格命中的概率1表示万分之1
int nMailExpireDays; // 邮件保存多少天
int nBossDigNeedStoreCount; // 挖boss需要寻宝空间
int nDoLevelMailGift; // 是否等级礼包发邮件1-是0-否)
int nCanActivityFiveAttrLevel;
int nCanActivityFiveAttrStrongLevel;
int nHammerItemId; // 副本采集的锤子物品ID
int nMoveSpeedLimit; // 人物移动速度限制,当人物速度移动速度小于这个值,则会强制变为默认速度
int nMailMaxCount; //最多保存邮件数
std::vector<std::string> nMessageColor; //发送消息的颜色
int nGuardEffId ; //守护特效
int nParalyEffId ; //麻痹
int nCritiEffId ; //暴击
std::vector<int> nFirstChargeIds; //首充对应的活动id
int nMaxDoubleExpValue; //多倍经验上限
int nMaxRankTipId;
std::vector<std::tuple<int,int,int>> vecTeamCallConsum; //团队召唤道具消耗
std::vector<std::tuple<int,int,int>> vecGuildCallConsum; //行会召唤道具消耗
int nMergeTimes = 0;//合服次数
int nCrossMsgDay = 0;//跨服消息限制
int nCrippleEffectId; //致残特效Id
int nAdvancedCrippleEffectId; //高级致残特效Id
//当前job 必须已经是玩家job 减1
int GetJobDizzyRate(int nJob) {
int nRate = 10000;
if(nJob < 0 || nJob >= nDizzyBuffTateJob.size()) {
return nRate;
}
return nDizzyBuffTateJob[nJob];
}
}GLOBALCONFIG,*PGLOBALCONFIG;
typedef struct tagStateConfig
{
bool allowTable[esMaxStateCount][esMaxStateCount]; //一个2维数组
}STATECONFIG,*PSTATECONFIG;
typedef struct tagTeamKillMonsterExp
{
float teamExp[9]; //队伍的经验加成
int teamExpBuf[4];//队伍的经验加成buf图标,TeamKillMonsterExpbufId
/*
* Comments:获取队伍的经验加成的比率
* Param INT_PTR nTeamMember:队伍的人数数量
* @Return int:返回
*/
float GetTeamKillMonsterExp(INT_PTR nTeamMember)
{
if(nTeamMember > ArrayCount(teamExp) || nTeamMember < 1) return 0;
//return teamExp[nTeamMember -1];
}
int GetTeamKillMonsterExpBufId(INT_PTR nCount)
{
if(nCount > ArrayCount(teamExpBuf) || nCount < 1) return 0;
return teamExpBuf[nCount -1];
}
}TEAMKILLMONSTEREXP,*PTEAMKILLMONSTEREXP;
/// 玩家的跳跃距离的消耗
typedef struct tagJumpLengthConsume
{
CVector<int> jumpConsumes;
int GetJumpConsume(int nLength)
{
if(nLength <= 0) return 0;
INT_PTR nCount = jumpConsumes.count();
if(nCount == 0) return 0;
return jumpConsumes[__min(nLength, nCount) - 1];
}
}JUMPLENGTHCONSUME, * PJUMPLENGTHCONSUME;
struct tagChatChannelLimit
{
BYTE btChannelId; // 聊天频道Id
WORD wLevel; // 聊天频道 等级限制
DWORD nRechargeAmount; // 聊天频道 充值金额限制(目前以元宝充值为准)
};
/// 聊天配置
typedef struct tagChatSystemConfig
{
int nChatChannelCD[ciChannelMax]; // 聊天频道CD配置
struct tagChatChannelLimit ChatLimit[ciChannelMax]; // 频道聊天等级限制配置
int nRechargeopen[ciChannelMax]; // 充值频道聊天等级限制配置
size_t nAutoSilencing; // 自动禁言,玩家连续发多少次相同内容就禁言
size_t nAutoSilencingSecond; // 自动禁言时长,单位是秒
size_t nAutoSilenceLevel; // 自动禁言限制等级, <= nAutoSilenceLevel,禁言范围
int nSameChatSliencingCount; //同一内容连续发N次禁言
int nSameChatSliencingSecond; //同一内容连续发N次禁言时间
int nAutoSilenceSameIpShutup; //同一ip禁言X次则整个ip禁言
int nChatLogFlag; // 聊天内容是否存盘
int nShowItemSize; //聊天最多展示的物品数量
std::vector<int> nVipChats; //聊天vip限制
int nCounter;//
int nDisplayLeftTimesLimit; //聊天vip限制 剩余次数提示限制
}CHATSYSTEMCONFIG,*PCHATSYSTEMCONFIG;
//掉落道具配置
typedef struct tagDropItemConfig
{
int nDropItemExpireTime; // 掉落在地上的物品的存活时间,单位秒
int nDropItemMasterProtectTime; // 掉落在地上的物品属于他的主人的时间,单位秒
int dropCoinCounts[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的金币,在各范围里图标不同,这里标记不同范围的金币的范围
int dropCoinIcons[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的金币在dropCoinCount范围里的图标的id
// int dropYuanBaoCounts[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的元宝,在各范围里图标不同,这里标记不同范围的元宝的范围
// int dropYuanBaoIcons[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的元宝在dropYuanBaoCount范围里的图标的id
int dropBindCoinCounts[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的绑定金币,在各范围里图标不同,这里标记不同范围的绑定金币的范围
int dropBindCoinIcons[MAX_DROP_COIN_ICON_COUNT]; // 掉落在地上的绑定金币在dropBindCoinCounts范围里的图标的id
int nMonsterMaxCoinOneDrop; // 怪物掉落的金币,每堆的最大值
int nMonsterMaxBindCoinOneDrop; // 怪物掉落的绑定金币,每堆的最大值
int nDropItemNeedTime; // 掉落在地上的物品需要时间才能拾取
int nDropPetLootDistance;//宠物捡取最大格数
}DROPITEMCONFIG, *PDROPITEMCONFIG;
typedef struct tagDeathDropConfig
{
int nWriteNameBagDropRate = 0;//白名背包掉落
int nWriteNameEquipDropRate = 0;//白名装备掉落
int nRedNameBagDropRate = 0;//红名背包掉落
int nRedNameEqiupRate = 0;//红名装备掉落
int nMaxEquipDropNum = 1;//红名装备掉落
} DEATHDROPCONFIG, *PDEATHDROPCONFIG;
typedef struct tagBagRemainConfig
{
//背包格数判定
std::map<int, std::vector<int> > m_nBagRemain;
} BAGREMAINCONFIG, *PBAGREMAINCONFIG;
typedef struct tagHookExp
{
int nBasePdValue = 0;//固定经验
int nPdPercent = 0; //加成系数 万分比
} tagHookExp, *PtagHookExp;
//泡点
typedef struct tagHookExpConfig
{
std::map<int, tagHookExp> m_HookMaps;
} HookExpConfig, *PHookExpConfig;
typedef struct tagPropertyConfig
{
LEVELUPEXPTABLE expTable; ///< 经验升级表
KILLMONSTEREXPTABLE killMonsterExpTable; ///< 杀怪经验衰减表
TEAMKILLMONSTEREXP teamKillMonsterExp; ///< 队伍杀怪的经验
GLOBALCONFIG globalConfig;
CHATSYSTEMCONFIG chatConfig; ///聊天const配置
DROPITEMCONFIG dropItemConfig; ///掉落道具const配置
DEATHDROPCONFIG deathDropCfg; //死亡掉落概率
BAGREMAINCONFIG bagRemain; //背包格数判定
HookExpConfig hookExpCfg;//泡点数据
} PROPERTYCONFIG, *PPROPERTYCONFIG;
/// 各等级能够获得的最大的修为
typedef struct tagRenownLimits
{
int remowns[ACTOR_MAX_LEVEL];
int nMaxConfigCount;
int GetMaxRemown(int nLevel)
{
if(nLevel > nMaxConfigCount || nLevel > ACTOR_MAX_LEVEL )
{
nLevel = nMaxConfigCount;
}
if(nLevel <= 0)
{
nLevel = 1;
}
return remowns[nLevel - 1];
}
tagRenownLimits()
{
memset(this,0,sizeof(*this));
}
}RENOWNLIMIT,*PRENOWNLIMIT;