skill

1. skill系统

1.1. 指向性skill

1.2. 范围性skill

1.3. 无锁定skill

skill系统由多个skill_effect 配合条件与节奏控制实现

2. skill_effect

职责

3. buff系统

3.1. buff由一个或者多个buff_effect实现

3.2. buff由枚举及参数 调用其他模块提供功能 例如 物品, 召唤系统

3.3. buff参数构成

4. buff_effect

buff_effect分为三类 控制类, 增益类, 减益类, 其他

5. Operation

原子操作,技能,buff都可以调用,每个操作传入参数的意义不同 操作方式:增加,减少,直接修改,按百分比,按数值

添加buff,参数是buff模板id,buff持续时间,层数 增减hp,mp等等 添加某个状态,在buff消失时要移除该状态 临时增加或者减少某个属性 根据属性枚举,可以修改任何属性 驱散buff 驱散方式传入参数 按大类,按小类,按id等 召唤陷阱,怪物等等 使技能进入cd 取消技能cd 打断技能释放 等等

状态 存储时按位: 束缚 沉默 昏迷 昏睡 位移过程中

必然闪避 必然暴击 必然命中 等等

免疫 免疫控制 在添加控制类buff时判定 免疫debuff 添加debuff时判定 免疫减速 免疫物理攻击 免疫魔法攻击 等等

6. Buff

BuffTemplate表 buff基础信息,大类,小类,最大层数,持续时间,触发次数,跳场景是否保留,下线是否保留,死亡是否保留,是否可以被手动移除等等

分类: 增益类 减益类 控制类 每个大类再分小类

7. BuffEffect buff效果表,描述怎样调用operation 效果的生效对象,触发条件,是否生效判定(当释放者身上有某类buff或者拥有者身上有某类buff,生效概率等等),传给operation的参数

效果调用时机: 开始生效 周期性生效
结束时生效 时间耗尽 死亡 被驱散 触发次数消耗尽 手动取消 无条件(只要结束就生效) 根据结束方式判断是否生效 触发生效 有条件触发(当血量低于多少百分比时触发等),无条件触发(被控制时触发等) 层数叠满时生效

效果生效对象: Buff拥有者,buff释放者,效果触发者或者aoe方法pick到的对象

Buff可以直接调用伤害公式进行伤害,跟技能一样,在buff产生时会初始化buff释放者的伤害计算相关数据

Buff添加 判断免疫 判断层数 Buff替换规则,高等级替换低等级,多buff共存等等 调用开始时生效的效果 添加buff触发生效条件,在程序各处添加触发接口,使用技能时触发,被控制时触发,收到伤害时触发,使用某个技能时触发(带参数 技能id)等等

Buff update 调用buff周期生效效果

buff被触发 调用触发effect,根据配置决定对buff释放者,buff拥有者或者buff触发者使用效果

Buff 结束 调用结束生效效果,根据buff结束方式调用对应的生效效果,结束方式有:时间耗尽结束,触发次数被耗尽,被驱散,玩家主动点击取消 等

Skill Skillconfig表通用信息 主动技能,被动技能(由buff实现) 触发类技能,在自身或者选中对象在某种状态下时可以释放的主动技能

吟唱 void OnSkillIntonate(const CS_SKILL_INTONATE_REQ* pData);

技能吟唱使用的动作,吟唱时间,显示的文字,都可以配置,配置在Intonate表中

状态判断,技能在某些状态下才可以释放或者在某些状态下不能释放 释放者,目标都需要判断 释放消耗判断 释放距离 释放对象判断 敌军,友军等 释放位置合法性等

开始吟唱时需要判断此时是否有其他效果需要调用 比如给自己加个buff

特殊处理 瞬发技能不需要吟唱直接释放 在吟唱完成准备释放时,大部分条件都需要再判断一次 比如技能,状态限制,敌对关系等可能发生变化的条件 地图传送技能,直接打断当前技能,然后执行传送技能 使用物品的技能,某些物品直接出效果,避免战斗过程中无法使用物品,物品走自己的cd,不走技能cd,某些带使用动作的物品,物品自己决定使用哪个Intonateid的效果

释放技能 扣除消耗 开始施法时判断是否有效果调用,跟开始吟唱时一样 通知客户端开始释放技能 如果该技能有主动位移,在开始释放包内带上计算好的终点给到客户端,并启动定时器,强制设定客户端位置。每个hit点都可能会有位移,如果开始位置一致,后面客户端和服务端计算得到的位置肯定一致,所以客户端可以先行计算,但是最终位置服务端将会判断

开始计算hit点 一个技能可能存在多个hit点 在每个hit点都可以计算伤害和效果 void OnSkillHit(const CS_SKILL_HIT_REQ* pData);

hit点时间到时,客户端拾取目标发送到服务端,并且先表现受击动画和受击特效,服务端进行伤害计算,效果计算,如果该技能需要服务端拾取,则服务端会自己拾取攻击目标并进行伤害计算和效果计算

每个hit点的伤害计算方式由damage表决定,效果则由skilleffect表决定,每个hit点可以不一样

拾取目标的方式由pick表决定

延迟伤害,先下发,客户端攻击到后通知服务端扣血,服务端也会设一个最大延迟时间

位移技能 1 无吟唱直接位移,客户端先行,计算出终点位置,服务端检验,不通过直接强拉 2 吟唱后位移,等服务端下发终点位置

对于有吟唱的技能,服务器可以完全控制技能的节奏 对于没有吟唱的技能,因为是客户端先行,服务器无法控制节奏,因为会出现网络波动 释放技能的消息和hit点消息可能同时到来。也可以改成服务端计算hit直接下发的方式

增加正在释放技能状态 此状态下,无法移动,无法释放其他技能

结束技能 可以提前结束 void CBattleSkill::OnSkillStop(const CS_SKILL_STOP_REQ* pData) 或者服务端的总时间到了,也会自动结束

8. 案例

以技能北斗七星阵为例

北斗是由天枢、天璇、天玑、天权、玉衡、开阳、瑶光七星组成

范围型技能

创建北斗七星对象及一个阵法对象

瑶光, 开阳, 对范围内敌人 造成三次 40%法术伤害 命中对象 降低50点怒气 基础伤害功能+基础debuff功能 玉衡, 天权, 对范围内敌人 造成三次 40%物理伤害 恢复所造成伤害300% 基础伤害功能+脚本追加功能 天玑, 天璇, 天枢 对范围内敌人 造成一次 120%法术伤害 基础伤害功能 并为范围内己方添加 时光回溯 状态 持续3秒. 该状态记录当前生命值及怒气值 基础buff功能+脚本追加功能 如果当前不处于禁疗状态, 若己方血量低于记录值的60% 则恢复至60%, 高于则不变化 基础buff功能+脚本条件判断功能+脚本追加功能 如果当前不处于禁怒状态, 那么己方怒气低于记录值的40% 则恢复至40%, 高于则不变化 基础buff功能+脚本条件判断功能+脚本追加功能

北斗七星阵法对象 对范围内敌人 造成3次 50%法术伤害 并额外造成当前生命20%的伤害. 最大值为法攻(200%). 基础伤害功能+脚本追加功能 免疫中断 基础buff功能