## buff系统介绍 buff系统为一定时间内为玩家以及怪物提供一定的增益 或者 减益效果。 ## buff 系统分类 buff系统根据实际作用效果可分为三大类。 ### 1.属性类Buff 玩家或怪物获得此类Buff 可增加或者减少其某些属性的数值。 ### 2.状态类Buff 玩家或怪物获得此类Buff 可增加 对应的状态 , 例如 禁止移动、 无敌 、 隐身、禁止使用某些技能以及物品等。 ### 3.间隔作用类Buff 玩家或怪物获得此类Buff 将在持续时间内以间隔时间为单位产生作用。 例如 持续10秒 每2秒减少100点HP。 ## Buff系统对应接口说明 ### 1.添加属性类Buff ``` TActor.AddAbilityBuff(GroupID:Integer;AbilityType:TBuffAbilityType;DuraMs:Cardinal;AblityValue:Int64;ValueIsRate:Boolean):TBuff; ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | GroupID | Integer | 分组ID(同组ID只能存在一个Buff 若重复在添加的时候会先移除掉之前的Buff) | | AbilityType | TBuffAblityType | 属性类型(具体类型见此页TBuffAblityType对照表) | | DuraMs | Cardinal | 持续时间(单位毫秒) | | AblityValue | Int64 | 增加的属性数值,根据ValueIsRate来确定增加的属性是万分比值还是具体数值 | | ValueIsRate | Boolean | 此字段若为true则表示添加的属性AblityValue使用万分比类型,否则为具体实际数值。 | ### 2.添加状态类Buff ``` TActor.AddStatusBuff(GroupID:Integer;StatusType:TBuffStatusType;DuraMs:Cardinal;  Args1:Int64 = 0; Args2:Int64 = 0):TBuff; ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | GroupID | Integer | 分组ID(同组ID只能存在一个Buff 若重复在添加的时候会先移除掉之前的Buff) | | StatusType | TBuffStatusType | 状态Buff类型 (具体类型见此页TBuffStatusType 对照表) | | DuraMs | Cardinal | 持续时间(单位毫秒) | | Args1 | Int64 | 可选参数1 对于某些特定类型的Buff才有意义(具体类型见此页 TBuffStatusType 对照表) | | Args2 | Int64 | 可选参数2 对于某些特定类型的Buff才有意义(具体类型见此页 TBuffStatusType 对照表) | ### 3.添加间隔作用类Buff ``` TActor.AddIntervalBuff(GroupID:Integer;IntervalType:TBuffIntervalType;  DuraMs:Cardinal;Interval:Cardinal;Args1:Int64 = 0; Args2:Int64 = 0):TBuff; ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | GroupID | Integer | 分组ID(同组ID只能存在一个Buff 若重复在添加的时候会先移除掉之前的Buff) | | IntervalType | TBuffIntervalType | 属性类型 参照具体类型见此页 TBuffIntervalType 对照表 | | DuraMs | Cardinal | 持续时间(单位毫秒) | | Interval | Cardinal | 间隔作用时间(单位毫秒) | | Args1 | Int64 | 可选参数1 对于某些特定类型的Buff才有意义 具体类型见此页 TBuffIntervalType 对照表 | | Args2 | Int64 | 可选参数2 对于某些特定类型的Buff才有意义 具体类型见此页 TBuffIntervalType 对照表 | ### 4.设置Buff客户端图标以及提示消息 Buff添加完毕就会立即生效。如果需要在客户端Buff作用区域显示Buff图标,在添加Buff后立即调用TPlayObject.SetBuffIcon即可。 ``` TPlayObject.SetBuffIcon(BuffHandle:Integer;ImageLibFile:String; ImageIndex:Integer;  HoverImageIndex;ShowMessage:String;DisappearMessage:String;HintMessage:String;FlashOnDisappear:Boolean;ShowTimeStr:Boolean); ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | BuffHandle | Integer | 添加Buff成功后返回的Buff对象的Handle值。 | | ImageLibFile | String | 图片库文件 如果为空 则默认使用 icons.data | | ImageIndex | Word | 正常图标显示的序号 | | HoverImageIndex | Word | 鼠标选中状态的图标序号。 | | ShowMessage | String | Buff添加时候发送到聊天栏的文字消息。(仅自己可见) | | DisappearMessage | String | Buff 从身上移除时候发送到聊天栏的文字消息。(仅自己可见) | | HintMessage | String | 鼠标选中图标时候的提示信息(支持文字排版) | | FlashOnDisappear | Boolean | 是否在消失前3秒图标闪动 | | ShowTimeStr | Boolean | 是否在图标底部显示剩余时间 | 说明: <table style="BORDER-RIGHT-WIDTH: 0px; BORDER-TOP-COLOR: rgb(79,129,189); WIDTH: 99%; BORDER-TOP-WIDTH: 1px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-COLOR: rgb(79,129,189); BORDER-LEFT-WIDTH: 1px" border="1" cellspacing="0" cellpadding="3" _ewebeditor_tabletemplate="template32"> <tbody> <tr> <td style="BORDER-BOTTOM: rgb(79,129,189) 3px solid; TEXT-ALIGN: center; BORDER-TOP-WIDTH: 0px; HEIGHT: 17px; BORDER-LEFT-WIDTH: 0px; FONT-WEIGHT: bold; BORDER-RIGHT: rgb(79,129,189) 1px solid" colspan="2">ShowMessage、DisappearMessage、HintMessage三个字符串参数 可用以下标签<br> </td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$属性值$</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid">&nbsp;</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$属性值比率$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">buff值 百分比小数 保留两位小数</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$Args1$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">参数1值</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$Args2$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">参数2值</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$Args1比率$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">百分比小数 保留两位小数</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$Args2比率$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">百分比小数 保留两位小数</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$持续时间$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">总持续时间 单位秒</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$剩余时间$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">剩余时间 单位秒</td> </tr> <tr height="18"> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">$作用间隔$&nbsp;</td> <td style="BORDER-BOTTOM: rgb(79,129,189) 1px solid; BACKGROUND-COLOR: rgb(211,223,238); BORDER-TOP-WIDTH: 0px; HEIGHT: 15px; BORDER-LEFT-WIDTH: 0px; BORDER-RIGHT: rgb(79,129,189) 1px solid" x:str="">BUFF触发间隔 对于 持续间隔作用类BUFF有效。 单位秒 进行格式化</td> </tr> </tbody> </table> ### 5.使用预定义配置添加Buff 在版本管理器如下位置可以对Buff做一个预定义设置。![](5b084cee4c0047a69fca199e702db7e4.files/yy1dnum201805260914470.png) ![](https://img.kancloud.cn/f3/17/f317033e09c14438b410a0160425d172_860x503.png) 设置之后可以使用以下命令对BUFF进行添加 ``` //使用预定义BuffID 添加Buff   TActor.AddBuffByID(BuffID:Integer;GroupID:Integer = -1):TBuff;   //使用预定义Buff名称 添加Buff   TActor.AddBuffByName(BuffName:String;GroupID:Integer = -1):TBuff; ``` >[danger] 注意: 当参数GroupID留空或者为-1时候表示 不修改配置中的分组ID 当GroupID >=0 表示动态修改为对应的分组ID ,根据分组ID使用预定义配置添加的Buff 在流量带宽上有更好的表现。频繁添加的Buff 建议使用预定义配置进行添加。并且在添加了预定义buff后 无需再执行SetBuffIcon对 Buff进行图标设置。 ### 6.移除Buff ``` TActor.DeleteBuff(BuffHandle:Integer):Boolean; ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | BuffHandle | Integer | Buff添加返回得到的Handle | ### 7.根据Buff分组移除Buff ``` TActor.DeleteBuffByGroupID(MinGroupID:Integer;MaxGroupID:Integer):Integer; ``` | 参数名称 | 参数类型 | 说明 | | --- | --- | --- | | MinGroupID | Integer | 最小的作用组 | | MaxGroupID | Integer | 最大的作用组 | >[danger] 说明: 其中参数使用的是闭区间 即包含最小组和最大组 , 返回值为移除的Buff 数量。 ### 8.遍历玩家或者怪物身上拥有的Buff示例 ``` for i := Actor.BuffCount -1 downto 0 do begin   Buff := Actor.Buff[i] end; ``` ## Buff系统脚本触发 ### 1.添加Buff时触发 当对玩家或者怪物添加Buff时会引擎会触发QFunction内的OnAddBuff函数 通过修改 Accept := False 可以禁止此Buff添加到怪物或者玩家身上。 函数示例: ``` procedure OnAddBuff(Actor:TActor;Buff:TBuff;var Accept:Boolean) ``` ### 2.移除Buff时触发 当Buff从玩家或者怪物身上移除的时候引擎会触发QFunction内的OnRemoveBuff函数 ``` procedure OnRemoveBuff(Actor:TActor;Buff:TBuff) ``` ### 3.自定义间隔作用类Buff触发。 当添加自定义间隔作用类Buff之后 在间隔设定时间后。引擎将调用QFunction中OnCustomBuffAffect函数 ``` procedure OnCustomBuffAffect(Actor:TActor;Buff:TBuff) ``` ## Buff对象字段说明 ### TBuff 对象说明 | 字段 | 参数类型 | 只读 | 说明 | | --- | --- | --- | --- | | Handle | Integer | √ | Buff的运行唯一标记通过此Handle 可对Buff进行一些操作。 | | Tag | Integer | × | Buff标志值用于提供给脚本对buff进行特殊标记 | | GroupID | Integer | √ | Buff创建时候的分组ID (同组所有的Buff只能存在一个) | | Category | TBuffCategory | √ | Buff分类。 TBuffCategory 对照表 | | AbilityType | TBuffAbilityType | √ | 属性类型,仅当Buff类型为属性类Buff时有效 | | AbilityValue | Int64 | √ | Buff增加的属性数值,仅当Buff类型为属性类Buff时有效 | | ValueIsRate | Boolean | √ | Buff作用值是否为万分比(仅Buff为属性类Buff时有意义) | | StatusType | TBuffStatusType | √ | 状态类型,仅当Buff类型为状态类Buff时有效 TBuffStatusType 对照表 | | IntervalType | TBuffIntervalType | √ | 间隔作用类型,仅当Buff类型为状态类Buff时有效 TBuffIntervalType 对照表 | | Args1 | Int64 | √ | 参数1,对不同的Buff类型有不同的意义 | | Args2 | Int64 | √ | 参数2,对不同的Buff类型有不同的意义 | | CustomInt | Array\[0..3\] of Int64 | × | 自定义数据,提供给脚本中进行实现自定义数据标记。 | | CustomStr | String | × | 自定义数据,提供给脚本中进行实现自定义数据标记。 | | Actor | Tactor | √ | 记录BUFF释放者,可用于避免受buff持续伤害死亡无攻击者的情况 | ## Buff系统类型定义参考表 ### 1.Buff分类对照表 TBuffCategory | 类型 | 说明 | | --- | --- | | bcNone | 无效 | | bcAbility | 属性类buff | | bcStatus | 状态类buff | | bcInterval | 间隔作用类buff | ### 2.属性类Buff类型对照表。 TBuffAbilityType | 类型 | 说明 | | --- | --- | | atNone | 无效 | | atMaxHP | 最大HP | | atMaxMP | 最大MP | | atDC | 物理攻击下限 | | atDCMax | 物理攻击上限 | | atMC | 魔法攻击下限 | | atMCMax | 魔法攻击上限 | | atSC | 道术下限 | | atSCMax | 道术上限 | | atPC | 刺术下限 | | atPCMax | 刺术上限 | | atTC | 箭术下限 | | atTCMax | 箭术上限 | | atWC | 武术下限 | | atWCMax | 武术上限 | | atAC | 物理防御下限 | | atACMax | 物理防御上限 | | atMAC | 魔法防御下限 | | atMacMax | 魔法防御上限 | | atHitPoint | 准确 | | atHitSpeed | 攻击速度 | | atSpeedPoint | 敏捷 | | atLucky | 幸运 | | atHealthRecover | HP恢复 | | atSpellRecover | MP恢复 | | atAntiMagic | 魔法躲避 | | atAntiPoison | 毒物躲避 | | atPoisonRecover | 中毒恢复 | | atAbsorbing | 伤害吸收 | | atRebound | 伤害反弹 | | atAttackAdd | 附加伤害 | | atPunchHit | 致命一击 | | atCriticalHit | 会心一击 | | atPunchHitDef | 致命一击抵抗 | | atCriticalHitDef | 会心一击抵抗 | ### 3.状态类Buff类型对照表 TBuffStatusType | 类型 | 说明 | | --- | --- | | stNone | 无效 | | stStone | 石化 | | stDenyMove | 禁止移动(跑步和走路以及骑马都不行) | | stDenyWalk | 禁止行走 | | stDenyRun | 禁止跑步 | | stDenyHorse | 禁止骑马 | | stSuperMan | 无敌 | | stSuperManForMon | 只对怪物无敌 | | stRelive | 复活(此Buff时Args1为复活生效次数,达到次数将自动删除buff, 0 表示无限) | | stUnRelive | 防复活 | | stObserver | 隐身 | | stObserverForMon | 隐身只对怪物 | | stDenyUseMagic | 禁止使用技能(Args1为技能ID, -1表示禁止所有技能) | | stDenyUseItem | 禁止使用物品(Args1为物品ID,-1表示禁止所有物品) | ### 4.间隔作用类Buff类型对照表 TBuffIntervalType | 类型 | 说明 | | --- | --- | | biNone | 无效 | | biCustom | 自定义 | | biHP | 减少或增加HP(Args1 为数量 , Args2为万分比例) | | biMP | 减少或增加MP(Args1 为数量 , Args2为万分比例) | | biExp | 减少或增加经验值(Args1 为数量 , Args2为万分比例) |