一、学习案例

(一)TPL模版.md中的案例

这是一个技能模板的链式调用定义,创建了一个名为"技能例子"的无目标技能,并设置了冷却时间、魔法消耗等属性,还定义了技能生效时触发的回调函数。

技能模板定义部分

TPL_ABILITY.DEMO = AbilityTpl()
    :name("技能例子")  // 设置技能名称
    :targetType(ability.targetType.none)  // 设置目标类型为无目标
    :icon("black")  // 设置技能图标
    :coolDownAdv(10, 0)  // 设置基础冷却时间10秒,成长值0
    :mpCostAdv(100, 0)  // 设置基础魔法消耗100,成长值0
    :onEvent(EVENT.Ability.Effective,  // 绑定技能生效事件
    function(effectiveData)
        echo("技能释放", effectiveData.triggerUnit:owner())  // 事件触发时打印信息
    end)

技能添加到单位部分

local slot = (whichUnit):abilitySlot()  // 获取单位的技能栏
// 三种添加技能的方式:
slot:push(Ability(TPL_ABILITY.DEMO))  // 方式1: 通过Ability对象添加到最后可用格子
slot:push(TPL_ABILITY.DEMO)  // 方式2: 直接通过模板添加到最后一个可用格子
slot:push(TPL_ABILITY.DEMO, 3)  // 方式3: 添加到指定序号(3)的格子

这部分展示了三种将技能添加到单位技能栏的方法,可以灵活地通过技能对象或直接通过模板添加,还能指定添加到特定格子位置。

整个代码段展示了TPL系统的两个核心功能:

  1. 通过模板定义可复用的技能配置
  2. 灵活地将技能应用到单位上

(二)demo.lua中的案例

这个例子位于projects\mylua\scripts\globals\tpl\ability\demo.lua

-- 技能模板定义 - Ability Template Definition
---@param abData eventOnAbilityGet 技能获取事件数据
TPL_ABILITY.DEMO = AbilityTpl()  -- 创建新的技能模板
    :name("剑之勇气")  -- 技能名称
    :description(  -- 技能描述
    {
        "越战越勇,每减少10%的HP则会增加10点攻击力",  -- 基础效果说明
        "效果最多叠加9层,最大90点攻击力",  -- 效果上限说明
    })
    :targetType(ability.targetType.pas)  -- 目标类型:被动技能
    :icon("ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp")  -- 技能图标路径
    :onEvent(eventKind.abilityGet,  -- 技能获取事件
    function(abData)
        local ak = abData.triggerAbility:id()  -- 获取技能唯一ID
        ---@param evtData eventOnClassAfterChange HP变化事件数据
        event.syncRegister(abData.triggerUnit, eventKind.classAfterChange .. "hpCur", ak, function(evtData)
            local u = evtData.triggerUnit  -- 获取触发单位
            BuffClear(u, { key = "剑之勇气" .. ak })  -- 清除旧buff
            local cur = evtData.new  -- 当前HP值
            if (cur > 0) then  -- 检查单位是否存活
                local hp = u:hp()  -- 最大HP值
                local n = math.floor((hp - cur) / hp * 10)  -- 计算buff层数(每损失10%HP为1层)
                if (n > 0) then  -- 检查是否需要应用buff
                    local atk = 10 * n  -- 计算攻击力加成(每层+10)
                    Buff({  -- 创建buff效果
                        object = u,  -- 作用目标
                        key = "剑之勇气" .. ak,  -- buff唯一标识
                        name = "剑之勇气" .. n .. "层",  -- buff显示名称
                        signal = buffSignal.up,  -- 增益型buff
                        icon = "ReplaceableTextures\\CommandButtons\\BTNArcaniteMelee.blp",  -- buff图标
                        text = colour.hex(colour.gold, n),  -- 显示文本(金色层数)
                        description = {  -- buff详细描述
                            colour.hex(colour.gold, n .. "层") .. "剑之勇气",  -- 层数显示
                            colour.hex(colour.lawngreen, "攻击:+" .. atk),  -- 攻击加成显示
                        },
                        ---@param buffObj Unit
                        purpose = function(buffObj)  -- buff生效逻辑
                            buffObj:attack("+=" .. atk)  -- 增加攻击力
                            effector.attach(buffObj, "SmallBuildingFire0", "origin")  -- 附加特效
                        end,
                        ---@param buffObj Unit
                        rollback = function(buffObj)  -- buff失效逻辑
                            buffObj:attack("-=" .. atk)  -- 移除攻击加成
                            effector.detach(buffObj, "SmallBuildingFire0", "origin")  -- 移除特效
                        end
                    })
                end
            end
        end)
    end)
    :onEvent(eventKind.abilityLose,  -- 技能失去事件
    function(abData)
        local ak = abData.triggerAbility:id()  -- 获取技能ID
        event.syncUnregister(abData.triggerUnit, eventKind.classAfterChange .. "hpCur", ak)  -- 取消事件监听
        BuffClear(abData.triggerUnit, { key = "剑之勇气" .. ak })  -- 清除buff

(三)demo2.lua中的案例

这个例子位于projects\mylua\scripts\globals\tpl\ability\demo2.lua

-- 技能模板定义 - 盾之结晶
---@param abData eventOnAbilityGet 技能获取事件数据
TPL_ABILITY.DEMO2 = AbilityTpl()  -- 创建新的技能模板
    :name("盾之结晶")  -- 技能名称
    :description(  -- 技能描述
    {
        "越战越勇,每减少10%的HP则会增加1点防御力",  -- 基础效果说明
        "效果最多叠加9层,最大9点防御力",  -- 效果上限说明
    })
    :targetType(ability.targetType.pas)  -- 目标类型:被动技能
    :icon("ReplaceableTextures\\CommandButtons\\BTNAdvancedUnholyArmor.blp")  -- 技能图标路径(高级邪恶护甲)
    :onEvent(eventKind.abilityGet,  -- 技能获取事件
    function(abData)
        local ak = abData.triggerAbility:id()  -- 获取技能唯一ID
        ---@param evtData eventOnClassAfterChange HP变化事件数据
        event.syncRegister(abData.triggerUnit, eventKind.classAfterChange .. "hpCur", ak, function(evtData)
            local u = evtData.triggerUnit  -- 获取触发单位
            BuffClear(u, { key = "盾之结晶" .. ak })  -- 清除旧buff
            local cur = evtData.new  -- 当前HP值
            if (cur > 0) then  -- 检查单位是否存活
                local hp = u:hp()  -- 最大HP值
                local n = math.floor((hp - cur) / hp * 10)  -- 计算buff层数(每损失10%HP为1层)
                if (n > 0) then  -- 检查是否需要应用buff
                    local def = n  -- 计算防御力加成(每层+1)
                    Buff({  -- 创建buff效果
                        object = u,  -- 作用目标
                        key = "盾之结晶" .. ak,  -- buff唯一标识
                        name = "盾之结晶" .. n .. "层",  -- buff显示名称
                        signal = buffSignal.up,  -- 增益型buff
                        icon = "ReplaceableTextures\\CommandButtons\\BTNAdvancedUnholyArmor.blp",  -- buff图标
                        text = colour.hex(colour.gold, n),  -- 显示文本(金色层数)
                        description = {  -- buff详细描述
                            colour.hex(colour.gold, n .. "层") .. "盾之结晶",  -- 层数显示
                            colour.hex(colour.lawngreen, "防御:+" .. def),  -- 防御加成显示
                        },
                        ---@param buffObj Unit
                        purpose = function(buffObj)  -- buff生效逻辑
                            buffObj:defend("+=" .. def)  -- 增加防御力
                            effector.attach(buffObj, "AIdaTarget", "overhead")  -- 附加头顶特效
                        end,
                        ---@param buffObj Unit
                        rollback = function(buffObj)  -- buff失效逻辑
                            buffObj:defend("-=" .. def)  -- 移除防御加成
                            effector.detach(buffObj, "AIdaTarget", "overhead")  -- 移除头顶特效
                        end
                    })
                end
            end
        end)
    end)
    :onEvent(eventKind.abilityLose,  -- 技能失去事件
    function(abData)
        local ak = abData.triggerAbility:id()  -- 获取技能ID
        event.syncUnregister(abData.triggerUnit, eventKind.classAfterChange .. "hpCur", ak)  -- 取消事件监听
        BuffClear(abData.triggerUnit, { key = "盾之结晶" .. ak })  -- 清除buff
    end)

整体结构:

两个文件都使用AbilityTpl()创建技能模板

都设置了技能名称(name)、描述(description)、目标类型(targetType)和图标(icon)

都实现了两个事件处理:

abilityGet: 当单位获得该技能时触发

abilityLose: 当单位失去该技能时触发

事件处理机制:

在abilityGet事件中,都注册了一个监听单位HP变化的同步事件(event.syncRegister)

当HP变化时,会根据当前HP百分比计算buff层数

都使用Buff系统来管理技能效果

在abilityLose事件中,都会取消事件监听并清除buff

技能效果对比:

demo.lua - "剑之勇气":

效果:每减少10%HP增加10点攻击力,最多叠加9层(共90点攻击力)

视觉:附加"SmallBuildingFire0"特效到单位原点(origin)

文本:显示当前层数和增加的攻击力数值

demo2.lua - "盾之结晶":

效果:每减少10%HP增加1点防御力,最多叠加9层(共9点防御力)

视觉:附加"AIdaTarget"特效到单位头顶(overhead)

文本:显示当前层数和增加的防御力数值


二、学习输出

(一)War3原生技能图标数据表

NameArtUbertip
收费ReplaceableTextures\CommandButtons\BTNReturnGoods.blp向某个玩家收取固定数额的金子和木材。
命令光环ReplaceableTextures\PassiveButtons\PASBTNGnollCommandAura.blp增加附近单位的攻击力。
操纵死尸ReplaceableTextures\CommandButtons\BTNAnimateDead.blp复活<ACad,DataA1>个阵亡单位。持续时间为<ACad,Dur1>秒。
荆棘光环ReplaceableTextures\PassiveButtons\PASBTNThorns.blp给周围单位提供荆棘光环的保护,如果近战型的敌人来攻击它们就会受到每次相当于自身<ACah,DataA1,%>%攻击力的伤害。
反魔法外壳ReplaceableTextures\CommandButtons\BTNAntiMagicShell.blp使目标单位对所有魔法免疫。n持续<ACam,Dur1>秒。
强击光环ReplaceableTextures\PassiveButtons\PASBTNTrueShot.blp提高周围友军单位<ACat,DataA1,%>%的远程攻击力。
专注光环ReplaceableTextures\PassiveButtons\PASBTNDevotion.blp提高周围单位<ACav,DataA1>点的护甲。
辉煌光环ReplaceableTextures\PassiveButtons\PASBTNBrilliance.blp增加周围单位每秒<ACba,DataA1>点的魔法恢复速度。
嗜血术ReplaceableTextures\CommandButtons\BTNBloodLustOn.blp在<ACbb,Dur1>秒内增加目标单位<ACbb,DataA1,%>%的攻击速度和<ACbb,DataB1,%>%的移动速度。
火焰呼吸ReplaceableTextures\CommandButtons\BTNFireForTheCannon.blp对敌人呼出带有攻击力的火焰,造成<ACbc,DataA1>点伤害力。

(二)ItemTpl物品模板属性表

分类属性/方法参数类型可选值/范围示例说明
基础属性levelMaxnumber1-game.expParams.ability.maxLv技能最大等级
levelnumber1-levelMax当前技能等级
expnumber0-game.abilityExpNeeds(maxLv)当前经验值
levelUpNeedPointnumber≥0升级所需技能点
目标设置targetTypestringability.target中的类型技能目标类型
targetFilterfunction(self:Ability,targetUnit:Unit):boolean目标过滤函数
动画设置spellAnimationstring动画名称施法动作
castKeepAnimationstring动画名称持续施法动作

以上2张表格资源回复可见下载地址:

此处内容已隐藏,回复后(需要填写邮箱)可见