- 1. skill系统
- 2. skill_effect
- 3. buff系统
- 4. buff_effect
- 5. Operation
- 6. Buff
- 7. BuffEffect buff效果表,描述怎样调用operation 效果的生效对象,触发条件,是否生效判定(当释放者身上有某类buff或者拥有者身上有某类buff,生效概率等等),传给operation的参数
- 8. 案例
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功能