Files
mir_server/server/LogicServer/config/PropertyConfig.h

471 lines
17 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#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:212
* @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;