一、学习案例
(一)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系统的两个核心功能:
- 通过模板定义可复用的技能配置
- 灵活地将技能应用到单位上
(二)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原生技能图标数据表
Name | Art | Ubertip | |
---|---|---|---|
收费 | 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物品模板属性表
分类 | 属性/方法 | 参数类型 | 可选值/范围 | 示例说明 |
---|---|---|---|---|
基础属性 | levelMax | number | 1-game.expParams.ability.maxLv | 技能最大等级 |
level | number | 1-levelMax | 当前技能等级 | |
exp | number | 0-game.abilityExpNeeds(maxLv) | 当前经验值 | |
levelUpNeedPoint | number | ≥0 | 升级所需技能点 | |
目标设置 | targetType | string | ability.target中的类型 | 技能目标类型 |
targetFilter | function | (self:Ability,targetUnit:Unit):boolean | 目标过滤函数 | |
动画设置 | spellAnimation | string | 动画名称 | 施法动作 |
castKeepAnimation | string | 动画名称 | 持续施法动作 |
以上2张表格资源回复可见下载地址: