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

378 lines
14 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
//技能配置表
#define MAX_SECRET_SAUCE_COUNT_ONE_SKILL 4 //一个技能最大的秘笈数量
#define MAX_SKILL_LEVEL 20 //技能的最大的等级
#define SKILLCON_PARAM 5 //技能筛选6970参数
//技能的中心点的类型
enum enSkillCerterPosType
{
stSkillTargetCenter = 0, //以目标为中心
stSkillActorCenter = 1, //以主角为中心
stSkillSpellPointCenter = 2, //以施法点为中心
stSkillActorCenterDir = 3, //以主角瞬时坐标方向为中心
};
//范围的分类
enum enSkillRangeType
{
stSkillRangeSingle, //无范围,仅针对目标的单体技能(单体)
stSkillRangeRotationSingle, //线性旋转(单体)
stSkillRangeRotationGroup, //线性范围(群体)
stSkillRangeGroup, //范围(群体)
stSkillRangeAccurateRotation, //矢量精确旋转,以中心点与鼠标的位置的连线作为旋转轴旋转,比线性旋转更精确,用于法师的火球术
stSkillRangePointCenter, //施法点中心范围(群体), 与范围(群体)不同的是传递给PointSkillResult的是施法点中心坐标
stSkillRangeNoTarget, //无目标的
};
enum enSkillType
{
stPassiveSkill = 0, //被动技能
stPhysicAttackSkill = 1, //物理攻击技能
stMagicAttackSkill = 2, //魔法攻击技能
stTransferSkill = 3, //传送技能
stLifeSkill = 4, //生活技能
stOtherSpecialSkill = 5, //其他特殊的技能比如队伍buff通过技能实现的
};
enum enSkillClass
{
scSkillClassVocBasic = 1, //职业基本技能
scSkillClassMonster = 2, //怪物技能
scSkillCriticalBlow = 3, //必杀
scSkillDig = 4, //挖矿技能 TO DELETE
scSkillHideAttach = 5, //隐藏的附加技能(烈火剑法,逐日剑法,不检查)
scSkillRide = 6, //座驾技能
scSkillClassGuild = 11, //行会技能,展示在行会面板上的技能(保存于人物的技能列表中)
};
//技能的释放结果的ID
enum enSkillResultID
{
srSkillResultError = 0, //占位
srSkillResultPhysicAttack = 1, //物理攻击
srSkillResultMagicAttack = 2, //法术攻击
srSkillResulWizardAttack = 3, //道术攻击
srSkillResultAddBuff = 4, //增加buff
srSkillResultDelBuff = 5, //删除buff
srSkillCatchMonster = 6, //抓怪
srSkillResultBeatBack = 7, //击退
srSkillResultMobFire = 8, //召唤火墙
srSkillResultMobPet = 9, //召唤宠物
srSkillResultGoAhead = 10, //往前跑若干格
srSkillResultGoBack = 11, //向后退若干格
srSkillResultLastSafeAreaRTransfer = 12, //上一个安全区随机传送
srSkillResultChangeProperty = 13, //被动技能
srSkillResultCure = 14, //瞬间治疗
srSkillResultHolyAttack = 15, //神圣攻击
srSkillResultMoveToTarget = 16, //瞬移到目标旁
srSkillResultMoveBackHome = 17, //瞬移回巢
srSkillResultTransfer = 18, //指定场景地点传送
srSkillResultSceneTransfer = 19, //本场景随机传送
srSkillResultLastSafeAreaTransfer = 20, //上一个安全区传送
srSkillResultDeleteEffect = 21, //删除特效
srSkillResulIgnoreDefence = 22, //忽视目标的防御
srSkillResulCatchTarget = 23, //把目标抓到自己身边
srSkillResultSetAttackTarget = 24, //设置攻击目标
srSkillResultMobEntity = 25, //刷怪
srSkillResultChargeAttack = 26, //冲锋
srSkillResultSelfHpCureTarget = 27, //自身的HP的百分比治疗目标
srSkillResultLostTarget = 28, //丢弃目标
srSkillResultChangEquipDua = 29, //改变装备的耐久
srSkillResultDropMonsterItem = 30, //按怪物的掉率掉落东西
srSkillResultScreenShake = 15, //振屏
srSkillResultChangeFubenProgress = 32, //改变副本进度
srSkillResultChangeModel = 33, //改变外形
srSkillResultRateChangeProperty = 34, //百分比改属性
srSkillResultDeleteSkillCd = 35, //删除技能的CD
srSkillResultGiveAward = 36, //给奖励
srSkillResultBeatFly = 37, //击飞
srSkillResultPlayGuide = 38, //客户端播放引导性特
srSkillResultIgnoreMaxDropHp = 39, //忽略每次最大伤害限制
srSkillResultPointMove = 40, //把目标移动到地图一个点
srSkillResultSelfPointMove = 41, //自己移动到范围内的鼠标指定的点
srSkillResultTargetRapidMove = 42, //向某目标冲撞
srSkillResultRemovePet = 43, //删除宠物
srSkillResultChangeMonsterAttacked = 44, //改变怪物是否能被攻击
srSkillResultFastSelfCurHp = 45, //瞬回血
srSkillResultTargetPointMove = 46, //把目标移动到范围内的鼠标指定的点
};
//技能的训练或者释放条件ID
enum enSkillTrainCondition
{
/// 释放条件
scSkillConditonHP =1, //消耗命
scSkillConditonMP =2, //消耗蓝
scSkillConditionWithoutBuff =3, //不存在buff
scSkillConditionTargetDistance =4,//和目标的距离
/// 旧的
scSkillConditonLevel =1, //等级必须大于等于一定的级别
scSkillConditonMoney =2, //金钱
scSkillConditonItem =3, //物品
scSkillConditonExp =4, //经验
scSkillConditonXiuwei =5, //修为
scSkillConditonVocation =6, //职业需求
//scSkillConditonHP =7, //消耗命
//scSkillConditonMP =8, //消耗蓝
scSkillConditionTargetExist =9, //目标存在
scSkillConditionPetCount =10, //存在宠物的数量
scSkillConditionWithBuff =11, //存在buff
//scSkillConditionWithoutBuff =12,// 身上必须没有指定类型的buff
//scSkillConditionTargetDistance =13,//和目标的距离
scSkillConditionTargetOverLap =14,//和目标重叠
scSkillConditionFaceTarget =15, ////需要面向目标
scSkillConditionOneDirTarget =16,//需要和目标的方向
scSkillConditionMountExpLimited=17,//坐骑经验不够
scSkillConditionHpRateBelow=18,//自身的血的百分比必须低于一定的值
scSkillConditionSpecialTarget =19, //需要特定的目标
scSkillConditionTargetCanAttack =20, //目标可攻击
scSkillConditionEfficiency = 21, //需要生活技能的熟练度
scSkillConditionJumpPoweer =22, //轻功不够
scSkillConditinBindCoin =23, //绑定银两的消耗
scSkillConditinCampTitle =24, //阵营的职位的条件
scSkillConditionBrotherCount =25, //结拜的数目
scSkillConditionTargetDis =26, //需要目标并且和目标的y轴的绝对距离少于等于value
scSkillConditioOnlineBrotherCount =27, //队伍里的在线的结拜好友的数量 >= value不包括自己
scSkillConditionBaseMpRate =28, //消耗基础蓝的万分比 value表示基础蓝的万分比比如8500表示85%玩家的基础蓝表示等级带来的MaxMp,不包括buff装备等附加的
scSkillConditionBaseHpRate=29, //消耗基础血的万分比 value表示基础血的万分比比如8500表示85%玩家的基础血表示等级带来的MaxHp,不包括buff装备等附加的
scSkillConditionBattleState =30, //在与玩家的战斗状态,value 1表示是 0表示否
scSkillConditionGuildCont=31,
scSkillConditionSkillLevel =32,
scSkillConditionXpValue=33,
scSkillConditionMetiralDura =34, //装备材料的耐久消耗
scSkillConditionTargetLine =35, //和目标一条直线上
scSkillConditionDigTool =36, //挖矿工具
scSkillConditionAnger =37, //怒气值
scSkillConditionArea = 38, //需要特定的区域类型,value表示区域的属性类型
scSkillConditionCircle =39, //转数的限制
};
//技能的效果类型
enum enSkillEffectType
{
stSkillEffectTypeNone = 0, //无效果
stSkillEffectTypeSwing = 1, //挥洒
stSkillEffectTypeCast = 2, //投掷与爆炸一样(暂时未用)
stSkillEffectTypeFly = 3, //飞行
stSkillEffectTypeExplode = 4, //爆炸 与投掷一样 上层
stSkillEffectTypeFootAlways = 5, //脚下持续
stSkillEffectTypeAlways = 6, //持续 只能人物使用
stSkillEffectDirByActor = 7, //只能人物使用,按方向
stSkillEffectTypeExplodeFloor = 8, //爆炸 下层
};
enum enSkillPropertyValueType
{
ptValueTypeInt=0, //属性的数值类型是整数
ptValueTypeFloat =1,//属性的数值类型是浮点数
ptValueTypeBuffRate = 2,//被动技能触发添加buff的概率
ptValueTypeBuffId =3,//被动技能触发添加buff的Id
ptValueTypeSkillAddBuff =4,//学习/遗忘技能时添加/删除buff
};
//技能在特殊的buff下是否能用包括封、断、晕眩
enum enSkillSpecialBuffCondition
{
stSkillSpecialBuffNone =0, //都不能用
stSkillSpecialBuffFengDuan, //在封断的时候能够使用
stSkillSpecialBuffDizzy, //在晕眩的时候可以使用
stSkillSpecialBuffAll, //在封断的时候都能够使用
};
//伤害类型,用于技能命中和一些攻击、防御时判定
enum enSkillHitType
{
htDefault = 0, //默认
htFire, //火墙
htBuff, //buf伤害
};
//技能升级或者释放的条件分表表示条件的ID,value是否消耗用在条件的判断上
typedef struct tagSkillTrainSpellCondition
{
BYTE nConditionID; //条件ID
BYTE bConsumed; //是否要消耗
BYTE bReserve; //保留
int nCount; //数量
INT64 nValue; //值
} SKILLTRAINSPELLCONDITION,*PSKILLTRAINSPELLCONDITION;
//技能的秘籍数据
typedef struct tagSkillMiji
{
WORD nMijiId; //秘籍的ID
WORD nMinLevel; //可以学习该秘籍的最低的技能等级
}SKILLMIJI,*PSKILLMIJI;
//Buff条件需要单独判断
/*
typedef struct tagBuffCondition
{
BYTE nType; // buff的类型
BYTE nCount; //数量
WORD nID; // buff的id
} BUFFCONDITION, *PBUFFCONDITION;
*/
//技能目标选择的筛选条件
typedef struct tagTargetSelCondition
{
int nKey; //条件ID
GAMEATTRVALUE value; //条件的值
}TARGETSELCONDITION,*PTARGETSELCONDITION;
//特效的配置
typedef struct tagSpecialEffect
{
BYTE nType; //特效的类型
BYTE nAlways; //是否总是生效
int nID; //特效的ID
int nKeepTime;//持续时间
int nDelayTime; //延迟生效时间
BYTE nSceneEffect;
int nTotalCount;//特效总帧数
int nTotalDirCount;//总方向数
} SPECIALEFFECT,*PSPECIALEFFECT;
//技能的释放结果
typedef struct tagSkillResult
{
int nId;
int nValue;
int nDelay;
int nParam1;
int nParam2;
int nParam3;
int nParam4;
int nParam5;
int nParam6;
int nResultType;
BYTE btHitType;
BYTE ignoreTargetDis; //忽视和目标的距离(例如:道士技能:虚空黑洞)
BYTE bBuffType; //bufftype
/*
BYTE nResultType; //效果的类型ID
BYTE bVt; //值的类型 (浮点等)
WORD wMjID; //秘笈的ID如果是0表示是一个普通的技能效果
BYTE bLevel; //使用技能的等级(用于特殊技能)
BYTE alwaysTakeEffect; //就算施法者下线了也要生效
BYTE bRateType; //属性比例是相对于哪个数值,0表示物理攻击1表示法术攻击2表示道术攻击。。。后面可以扩展
BYTE timeAddType; //时间是基于哪个属性的比例提高,0表示物理攻击1表示魔法攻击2表示道术攻击3表示等级其他可以增加
BYTE intervalAddType; //buff的时间间隔是基于哪个属性的比例提高,0表示物理攻击1表示魔法攻击2表示道术攻击3表示等级其他可以增加
int nId;
int nInterval;
int nDelay; //延迟,单位是毫秒
int nTimes; //作用的次数
int nValue; //值
int valueRate; //值的万分比
int timeRate; //时间的万分比
int intervalRate; // buff的时间的万分比
WORD maxTime; //buff最大的作用次数
WORD maxDur; //buff最大的作用间隔
int nEffectId; //特效的ID
int nEffectType; //特效的类型
int nAiId; //召唤宝宝的aiId
int nColorPriority; //添加buff的时候的优先级从1开始优先级高的将顶替优先级低的
int nColor; //添加buff的时候给添加的颜色主要是道士的毒麻痹的毒
BYTE ignoreTargetDis; //忽视和目标的距离,用于野蛮冲撞这样的技能,撞开的时候依然有效
BYTE btHitType; //伤害类型,用于技能命中伤害时判定 1:火墙
byte nParam;
*/
tagSkillResult()
{
memset(this,0,sizeof(*this) );
}
}SKILLRESULT,*PSKILLRESULT;
//技能的等级信息
typedef struct tagSkillAction
{
int nTargetType ; //目标的类型
DataList<SKILLRESULT> skillResults; //技能释放结果
DataList<SPECIALEFFECT> specialEffect; //升级的特效
DataList<TARGETSELCONDITION> targetConditions; //目标选择的条件
}SKILLACTION ,*PSKILLACTION;
//在一个特定范围里的技能的效果
typedef struct tagSkillOneRange
{
int nStartX; //x左边的点
int nEndX; //x右边的点
int nStartY; //y上面的点
int nEndY; //y下面的点
int rangeType; // 范围的类型
int rangeCenter; //范围的中心
int nDelay; //延迟目标选择
int nForceHitTargetDis;//非指向的群体技能可以强制打中已选目标的距离(主要是处理跑动的目标打不中的问题)
DataList<SKILLRESULT> skillResults; //技能释放结果
DataList<TARGETSELCONDITION> targetConditions; //目标选择的条件
//DataList<SKILLACTION> actions; //技能在这个范围内的效果
}SKILLONERANGE,*PSKILLONERANGE;
typedef struct tagSkillOneLevel
{
unsigned int nLevel;
//DataList<SKILLONERANGE> ranges; //技能在每一个范围里的效果
DataList<PSKILLONERANGE> pranges; //技能在每一个范围里的效果
DataList<SKILLTRAINSPELLCONDITION> trainConditions; //训练条件
DataList<SKILLTRAINSPELLCONDITION> spellConditions;//技能的使用需求
unsigned int nSingTime; //吟唱时间
unsigned int nCooldownTimes; //CD时间
int nAttrIdx;
int nHitId;
int nMaxPet;
bool isSceneEffect = false;
}SKILLONELEVEL,*PSKILLONELEVEL;
/*一个技能的数据*/
struct OneSkillData
{
char sSkillName[60]; //技能名字
WORD nSkillID; //技能ID
BYTE nSkillType; //技能的类型,近身攻击之类
BYTE bSpecialBuffCond; //技能在封断、晕眩的时候是否能够使用
BYTE bSkillClass; //技能的分类0职业被动技能,1职业主动技能2阵营技能,3结拜技能,4侠侣技能5职业绝学6江湖绝学7通用技能,8其他技能
BYTE bIsSwitch; //是否手动开关
BYTE bPriority; //技能的优先级
bool bIsAutoLearn;//是否自动学
BYTE bVocation; //职业
bool bBeedCalPassiveProperty; //是否需要计算被动属性,某些主动技能也需要按被动技能计算属性
bool bSingleEmptyEffect;
int nCommonCdTime; //技能使用的时候公共cd时间
int nAutoLearnSkillLvl; //自动学习技能的等级
DataList<SKILLONELEVEL> levels ; // 技能的等级
BYTE btClientDir; //使用客户端方向
WORD wAttrId; //对应的属性id
bool boIsDelete; //是否删除
};