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

378 lines
14 KiB
C
Raw 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
//技能配置表
#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; //是否删除
};