搜索
发新帖

技能案例

时间:2012-2-16 17:35 0 2705 | 复制链接 |
译者的话:
这是一份有关魔兽争霸III对象编辑器当中小秘密的简介。有众所周知的,也有极为冷僻的。不过这些东西大部分并非我的个人发现,而是整个网站集体智慧的结晶。每个在Wc3c发帖的人都为这指南出了份力,我所做的仅仅是整理工作而已。
--------------
ANcl(引导):这个技能本身就是为了作为假技能而存在的,在游戏中没有任何实际效果,却可以引发技能事件。你可将其设定为单位目标、点目标、AOE、单位、点目标或者干脆无目标技能,是否显示图标以及是否显示AOE范围。此外另有还拥有物理技能终极技能单独施法三个选项。还能通过设置引导时间禁止其他技能这两项来改变整个引导行为,后者可令单位在引导时控制栏按钮暂时消失。你也可以改变施法者和目标身上的特效图像,唯一遗憾的是无法添加buff。另外,你还可以更改该技能的基础命令ID,这样就可以使该技能的多个的副本在同一个单位身上互不干扰地运作。当然,法术的实际效果还得靠你的触发来实现。

复制代码 jass

  • function Channel_Conditions takes nothing returns boolean
  •   return GetSpellAbilityId() == <你的自定义引导技能id>
  • endfunction
  • function Channel_Actions takes nothing returns nothing
  • endfunction
  • function Channel takes nothing returns nothing
  •   local trigger t = CreateTrigger()
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
  •   call TriggerAddCondition(t, Condition(function Channel_Conditions))
  •   call TriggerAddAction(t, function Channel_Actions)
  • endfunction


1.18版本以后,此技能在法术书中也能正确地生效,并能正常进行工程升级。唯一潜在的问题是该法术可被致昏技能打断。要想绕过此问题只有靠ANab(强酸炸弹)之类技能来模拟昏技。


Amrf(乌鸦形态):允许你改变地面单位的飞行高度

复制代码 jass

  • call UnitAddAbility(u, 'Amrf')
  • call UnitRemoveAbility(u, 'Amrf')


添加删除该技能后,你就能用SetUnitFlyHeight()来调整单位u的高度,即使它是个地面单位,但是对建筑无效。


Sca1(混乱):原文描述有误,so暂时pass


Aloc(蝗虫):拥有蝗虫技能的单位无法被选择、无法成为目标并忽略一切地形限制。这意味着你只能通过触发来控制它。它的头顶也不会显示生命条。就目前版本,靠UnitRemoveAbility(u, 'Aloc')是无法正确消除蝗虫效果的。如果你在添加蝗虫以后添加混乱技能,单位会变得无法选择却仍能成为目标并且遵守地形限制。一种消除蝗虫技能的方案是先隐藏单位再删除技能,然后再重新显示单位,不过这并不完美,存在的问题是你无法点选单位,而只能框选。

复制代码 jass

  • function UnitRemoveLocust takes unit u returns nothing
  •     local boolean backup = not IsUnitHidden(u)
  •     call ShowUnit(u, false)
  •     call UnitRemoveAbility(u, 'Aloc')
  •     call ShowUnit(u, backup)
  • endfunction



Amec(机械小动物):通过这个技能召唤的单位,在非控制者(包括非共享控制的盟友)看来就像是中立友善的单位。唯一的区别是,当敌人右键点击该单位时发布的是攻击命令。你无法更改此技能召唤的单位类型,因为它只会在当前地形的小动物中随机选择,不过你可以响应召唤事件,然后给它来个变身。

复制代码 jass

  • function Transform_Conditions takes nothing returns boolean
  •   return GetUnitTypeId(GetSummoningUnit()) == <unit type that can cast mechanical critter>
  • endfunction
  • function Transform_Actions takes nothing returns nothing
  •   call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl", GetUnitX(GetSummonedUnit()), GetUnitY(GetSummonedUnit())))
  •   call UnitAddAbility(GetSummonedUnit(), <chaos ability id>)
  • endfunction
  • function Transform takes nothing returns nothing
  •   local trigger t = CreateTrigger()
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SUMMON)
  •   call TriggerAddCondition(t, Condition(function Transform_Conditions))
  •   call TriggerAddAction(t, function Transform_Actions)
  • endfunction


当然你也可以更改单位的所属种族,然后将其加入当前地形的小动物列表,效果一样。

AId1, AItg, AIlf, AImb, AIsi, Aamk, AIsr, AIdd, AIas, AIms, Arel, AIrm, AIcs(护甲加成,攻击加成,生命加成,法力加成,视野加成,属性加成,符文护腕,物品防御,攻速加成,速度加成,生命恢复,法力恢复,物品暴击):这些技能可以改变单位的护甲、攻击、生命、法力、视野、敏捷、力量、智力、魔抗、反伤、免伤、攻速、移速、回血、回魔、暴击和闪避的加成数值。幸运的是这些技能的效果都能叠加,因此通过位标识技术,你就可以只靠有限几个技能副本来组合出任意加成值。具体可以参看Weaaddar和Blade两人的加成模板系统。所有的技能都能在负值下奏效,不过视野加成这技能有点例外,如果单位身上拥有能侦测隐形的技能,它就无法减小视野。'AIdd’和'Aegr'(艾露恩的赐福)这两个技能拥有相同的数据域:魔法抵抗伤害削减、和反弹,可它们的攻击速度因子移动速度因子两项没有实际效果。一个特殊的bug允许你不添加任何永久技能就能改变一个单位的生命和法力上限。方法很简单:做一个自定义的AIlf(生命加成)或AImb(法力加成)技能,然后将其级数设为1级以上,1级的加成值为0,而2级的加成值设为你目的值的负数。比方说你想加200就设为-200。现在,用UnitAddAbility()添加该技能,再用SetUnitAbilityLevel()将其等级设为2。这些技能存在bug,因此你会发现没有实际加成。然后你立刻用UnitRemoveAbility()删除这个技能。这次war3会试图一并取消这-200的加成(虽然因为bug的存在,这个值之前并没有加上),结果是,单位凭空增加了200的生命/法力上限。至此,你已成功地不添加任何永久技能就改变了单位的生命/法力值。


ANvc(火山):该技能是唯一可以创建可破坏物/装饰物的技能,也许会有点用途吧。


Absk, Adef, Amdf, ANms, AEim, AHds(狂暴,防御,魔法防御,法力盾,献祭,圣盾术):这些技能使用时不会打断施法者的当前命令。后五个可以切换打开和关闭状态(前提是在游戏常数中开启此功能).将它们的效果值设为0,并捕捉开启和关闭命令就可以简单地自定义他们。当然如果你不希望显示buff,那么捕捉到命令后记得用UnitRemoveAbility()删除之。不过,这些技能在被删除时会发布两次关闭命令,因此记得加上简单的规避措施来避免捕捉到这些事件。

复制代码 jass

  • function WasUnOrder takes nothing returns boolean
  •   return OrderId2String(GetIssuedOrderId()) == "undefend" or OrderId2String(GetIssuedOrderId()) == "magicundefend" or OrderId2String(GetIssuedOrderId()) == "unmanashield" or OrderId2String(GetIssuedOrderId()) == "unimmolation" or OrderId2String(GetIssuedOrderId()) == "undivineshield"
  • endfunction
  • function Defense_Condition takes nothing returns boolean
  •   return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "defend" or OrderId2String(GetIssuedOrderId()) == "undefend") and GetUnitAbilityLevel(GetOrderedUnit(), 'Adef') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
  • endfunction
  • function TriggerRegisterDefenseEvent takes trigger t returns triggercondition
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  •   return TriggerAddCondition(t, Condition(function Defense_Condition))
  • endfunction
  • function MagicDefense_Condition takes nothing returns boolean
  •   return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "magicdefend" or OrderId2String(GetIssuedOrderId()) == "magicundefend") and GetUnitAbilityLevel(GetOrderedUnit(), 'Amdf') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
  • endfunction
  • function TriggerRegisterMagicDefenseEvent takes trigger t returns triggercondition
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  •   return TriggerAddCondition(t, Condition(function MagicDefense_Condition))
  • endfunction
  • function ManaShield_Condition takes nothing returns boolean
  •   return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "manashield" or OrderId2String(GetIssuedOrderId()) == "unmanashield") and GetUnitAbilityLevel(GetOrderedUnit(), 'ANms') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
  • endfunction
  • function TriggerRegisterManaShieldEvent takes trigger t returns triggercondition
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  •   return TriggerAddCondition(t, Condition(function ManaShield_Condition))
  • endfunction
  • function Immolation_Condition takes nothing returns boolean
  •   return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "immolation" or OrderId2String(GetIssuedOrderId()) == "unimmolation") and GetUnitAbilityLevel(GetOrderedUnit(), 'AEim') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
  • endfunction
  • function TriggerRegisterImmolationEvent takes trigger t returns triggercondition
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  •   return TriggerAddCondition(t, Condition(function Immolation_Condition))
  • endfunction
  • function DivineShield_Condition takes nothing returns boolean
  •   return GetTriggerEventId() != EVENT_PLAYER_UNIT_ISSUED_ORDER or ((OrderId2String(GetIssuedOrderId()) == "divineshield" or OrderId2String(GetIssuedOrderId()) == "undivineshield") and GetUnitAbilityLevel(GetOrderedUnit(), 'AHds') > 0 and GetUnitState(GetOrderedUnit(), UNIT_STATE_LIFE) > 0)
  • endfunction
  • function TriggerRegisterDivineShieldEvent takes trigger t returns triggercondition
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ISSUED_ORDER)
  •   return TriggerAddCondition(t, Condition(function DivineShield_Condition))
  • endfunction


由于这里用到的判断条件所限,这些事件不能和其它无目标事件放在一起,但此外的事件可以。你也需要根据实际状况更改WasUnOrder()函数的内容。第一个技能'Absk'不用考虑这些情况,因为它本身就不存在关闭状态。如果你不在意施法动画的话,有一个简单的法子可以使几乎所有技能都不打断当前命令——将施法单位的图像 – 动画施放点图像 – 动画回复点都设为0,这样单位就会立即施法,然后继续执行之前的命令。

Arpl, Arpm, Arpb, Afzy, Apsh, Amel, Arai, AUcb (补充生命,补充法力,补充生命和法力,狂热,相位变换,尸控术,腐尸甲虫):这些技能都能自动施放,而且左键点击就能使用,无需指定目标。可以用于制作左键和右键点击效果不同的按钮。用技能施放命令可以捕捉左键点击,用开启和关闭自动施放命令可以捕捉右键点击。当然最好在自定义界面中去掉那个自动施法的金色边框。前三个技能的效果能简单地移除,将持续时间设为0.01也能将'Afzy'无效化。然而你无法实际消除'Apsh'的相位变换效果。后3个技能需要附近有尸体才能点击。你可以将绞肉车的创建和运载尸体技能放到一本隐藏的魔法书里添加给单位,这样就可以提供所需的尸体了。

Apit, Aneu, Aall, Asid(购买物品,选择英雄,盟友商店,出售物品):有机地组合这些技能能让你的商店像奥法宝库一样只对自己人出售物品。区别是AddItemToStock()函数依然会奏效。而RemoveItemFromStock()只对被AddItemToStock()添加的物品有效,因此你得在对象编辑器中清空你商店的制造物品和出售物品两栏,然后在地图初始化时用AddItemToStock()来实现添加物品。添加和删除所售单位的做法亦类似,把'Asid' 换成 'Asud'即可。删除'Aall'的话,商店就向所有玩家公开营业。顺便,'Asud'技能会让所有玩家(包括敌方)都看得到这个商店。有'Aneu'或'Aall'技能的单位可用于共享技能和物品,即使敌人也可以使用该单位的所有技能和物品(可以在该技能的允许目标中更改)。

Ablo(嗜血术):增大目标单位的体型。一般来说你可以用一个隐藏单位来施放这个技能。将该技能持续时间设为0会时体形变更效果永久化。用触发删除嗜血buff就可以恢复体形。

Apiv, Agho, Aeth(永久隐身,鬼魂,可见的鬼魂):这些技能会令单位隐身,拥有永久隐身的单位会在攻击和施法时暂时失去隐身效果。因此这个技能可被用来制作先知的三级幽魂狼之类的单位。而拥有鬼魂技能的单位在攻击和施法时仍能保持隐身,拥有2个永久隐形的话也有相同效果(原文有误)。另外,Aeye(侦查结界)技能会自动给召唤出来的单位带上永久隐形。

Abur, Abdt (潜地,潜地侦测):潜地的单位和隐身差不多,潜地侦测这个技能有个数据域理论上能区分地侦测隐身单位和潜地单位,但实际上没有区别,看来暴雪并没有真正区分过潜地和隐形的隐身效果差别。

Aasl(龙卷风减速光环):该光环是用来添加无实际效果的buff的绝好技能。只要把允许目标设为自身,然后将数据效果设为0.此技能还不显示技能图标。最妙的是,当单位身上拥有一个以上这种技能时,它们的buff图标会叠加。鉴于'Aasl'本质上是个负面光环,因此其buff的提示是红色的,不过你可以在它名字上加颜色代码来改变这一点。比方说|cffff0000我是个坏蛋红色Buff|r 或是 |cff00ff00我是绿色的好人Buff|r.如果你觉得这技能不合意,也可以用其它光环,将它们放进被禁用的魔法书里就能隐藏图标。

ANpi(永久献祭):关于这个技能,作者说了许多,大意是可以把它加到目标单位身上来做个持续耗费对方魔法和生命的debuff技能。不过作者没有考虑到伤害源的问题,因此整段pass.当然,实际上只有持续耗费生命的效果需要考虑伤害源问题。

ACnr(生命恢复光环):一个可令附加特效随单位一起改换玩家颜色的不错技能。将生命恢复量设0允许目标设为自身。然后然后将你想添加的效果模型放到图像 - 目标一栏。这样被附加的特效模型会自动带上所属单位的玩家颜色。在有变身技能的情况下也能正常使用。假如出现突发情况导致颜色还是出错,可以用下面的简单代码来修正:

复制代码 jass

  • call SetUnitColor(<unit>, GetPlayerColor(GetOwningPlayer(<unit>)))


Aspi(尖刺路障):一个可以给单位附加特效又没什么副作用的技能。比Asph(球体)来得可靠多了。

Atwa(龙卷风游荡者):有这个技能的单位能比一般单位更加贴身地跟随目标。你得将该技能的影响范围设到最大。这样,如果此单位没有攻击能力,就可以用右键指令命令它近距离跟随目标了。

AIbf(建造微型农场):允许单位建造建筑,建造者甚至可以没有修理技能(或者其他什么乱七八糟的技能)。你也可以在这个技能中设置建造所耗的时间。

Aher(英雄):这个技能的图像 – 施法者一栏指定了所有英雄升级时候的特效。当然该技能默认是看不到的,你需要改动AbilityData.slk来显示它(像DDWE这种扩展编辑器里就默认有了),做法是将文件中该技能的useInEditor标记为1.

Amov(移动):移动技能指定了所有单位进入传送门时显示的特效。(当然它本身也是单位能移动的必要条件,如果删除这个技能单位就无法移动。这个很奇怪地没提到。)

AImo(怪兽诱捕):这技能很有意思,会引诱指定范围内的野怪。你也可以设置它的引诱间隔。

ANeg(工程升级):工程升级的出现终于解决了触发所添加的技能无法学习的问题。它允许我们使用触发更改技能学习界面。想要达到这一效果,英雄需要拥有能被替换掉的替身技能。这种占位技能必须和所需添加的技能拥有相同的级数,因此你一般需要准备两个,一个用来替换一般技能,另一个用来替换终极技能。我一般拿Arpb(补充生命和法力)做占位技能的模板,不过你用其它的也无所谓。将占位技能级数设为3,跳级设为2然后重复地填进英雄的英雄技能一栏。当然记得要在地图初始化时禁用它们,免得他们被玩家看到了。然后你就能用工程升级来将他们替换成想要的技能,当工程升级被添加时,其数据 - 技能升级一栏所指定的技能会被依次逐一替换,而被删除时,就会反着换回来。因此如果你不想看到工程升级的图标的话,这里有一个取巧的手段。如果你想将技能A换成B,那么就在工程升级的数据栏中反过来填B,A.这样,当你添加这个工程升级的时候会毫无效果,因为B不存在,而当你删除的时候,A技能就会被换成B,这样你就可以不添加任何永久性技能来完成这个替换了。当技能被替换成功后,他们就可在学习界学习。注意这法子只能正确替换未被学过的技能。用在学过的技能或普通技能上的话,被替换掉的只有原技能的施法距离、作用范围、持续时间、图标、允许目标等等数据,而不会真正改变改技能的核心。比方说你把光环替换为治疗技能会改变它的图标、提示等值,但它终究还是个光环。如果被替换的技能处于禁用状态,结果只会更加古怪而不可预测。另外工程升级也只对英雄有效,擅自添加给普通单位会导致游戏崩溃。如果你只想工程升级一个技能,可以将其它3个技能升级数据域改成单位永远也不会有的技能。此外工程升级在级数大于3时无法正确应用<dataA5>之类的动态提示。而且其默认buff也无法替换,不过这不是什么问题,因为它根本不显示。

Aspb(魔法书):魔法书基本上就是一个容器,可以装下11种其它技能。它可以装主动技能、自动施放技能、被动技能以至英雄技能。第一点好处是即使它被禁用,其中的被动技能也能正常生效。因此它可以用来隐藏任何被动技能,帮你节省按钮栏位。另一好处是你可以在运行时添加和删除魔法书中的技能。方法是把想添加的技能放进另一本魔法书内添加给单位,然后将第二本魔法书禁用。只要两本魔法书的命令ID相同,后一本魔法书中的技能就会显示到前一本里。给每一个技能准备一本魔法书就能实现动态添加了。该技能还有一个优点是,里面的技能可以通过英雄的学习界面来升级。唯一的缺点是它们一开始就是1级而非0级。不过你可以在英雄学会第1级以后再添加魔法书给他。

复制代码 jass

  • function Learn_Actions takes nothing returns nothing
  •   if GetLearnedSkillLevel() == 1 and GetLearnedSkill() == <hero skill> then
  •     call UnitRemoveAbility(GetTriggerUnit(), GetLearnedSkill())
  •     call UnitAddAbility(GetLearningUnit(), <adder spellbook ability>)
  •     call MakeUnitAbilityPermanent(u, <adder spellbook ability>)
  •     call MakeUnitAbilityPermanent(u, <ability inside spellbook>)
  •   endif
  • endfunction
  • function Learn takes nothing returns nothing
  •   local trigger t = CreateTrigger()
  •   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_HERO_SKILL)
  •   call TriggerAddAction(t, function Learn_Actions)
  • endfunction


当然,用于添加技能的魔法书必须一开始就对玩家禁用。另外要将魔法书的最少技能数和最大技能数设为一样来避免bug。不过这里还是存在一些小问题。你似乎无法用触发来使用书中的主动技能。而且在运行时被添加的技能不够法力施放也不会使整本书图标变蓝。不过这都是些小瑕疵,没什么大不了的。

Abun(运送货物(兽人地洞)):这个技能添加给单位后会令其失去攻击能力,连攻击图标和快捷键都会消失。然后删除这个技能又会恢复其攻击能力。和宝珠类技能一起使用的话就能彻底地开关单位的可用攻击方式了。

AIdf, AIll, AIsb(黑箭物品,新闪电宝珠,减速宝珠):这些技能都带有数据 - 影响技能数据栏。可指定任何一个单位目标技能作为影响技能。单位的每次攻击都有可能在目标身上施加该影响技能,其几率可自行指定。如果将几率设为100%,那么每次攻击都会生效,而且攻击不会miss.不过这类技能一旦添加给单位,其对应的影响技能的图标会出现在单位的控制栏,而且像被动技能一样处于无法点击状态。可惜的是似乎没有什么好方法去除这个图标。你也可以放个无图标的引导技能来做影响技能,可这样就没有实际的效果了。如果你不想启用近战单位的对空能力,就把数据 – 允许攻击索引一项设为0.目前有一个bug,单位自动攻击时不会给目标施加影响技能,即使几率是100%,你可以通过触发器来解决此问题。宝珠类技能还可以用于附加特效、变更单位投射图像和启用攻击方式。至于说箭矢类技能,不管你怎么改,'ANia'(焚化箭矢)永远使用'ANic'(焚化)的默认值,因此一张地图上一般只能拥有一个这种技能了。

Aroc(弹幕):弹幕允许单位同时攻击多个目标,因此可以用作多重射击技能。每个目标都会受到单位的基础攻击伤害及该技能中设定的附加伤害。实际攻击的目标数为数据 - 最大目标数加1.投射图像数据域中填写的模型可以多于一种,这样就会覆盖单位自身的投射图像,而每次攻击时都会在此列表中随即选择一种投射图像。影响范围一项能改变附加攻击的范围,不过不会影响到主箭矢,只会影响到附加的箭矢。如果你不想限制伤害量,将数据 - 最大总伤害设为0即可。可惜的是,弹幕无法和其他攻击附加效果正确叠加。大部分此类技能都会将弹幕效果无效化,比如所有的自动施放箭矢,只有AHfa(灼热之箭)和一些宝珠技能是例外。宝珠类技能只有在其影响技能发动的时候才会令弹幕无效化。其他所有技能,像暴击、减速毒药、冰冻气息、闪电攻击、火油等等能和弹幕叠加,不过通常只对主箭矢的目标生效。而像攻击加成、攻速加成之类基础附魔效果却能对所有目标生效。AHfa(灼热之箭)尤其特别。它是唯一能和弹幕叠加的箭矢类技能,而且当它开启自动攻击时甚至会令一个不兼容的宝珠技能无效化,而重新激活弹幕效果,你可以用这特性来制作能开关的多重箭。

Apxf(凤凰之火):这个技能也可以给单位多重射击能力,不过伤害不基于单位的攻击力。它由自己的冷却时间、投射图像、伤害和持续伤害,而且会对范围内的敌人自动施放。其持续时间数据域决定了它持续伤害的持续时间和攻击同一个目标的间隔。如果有需要,你可以用物品来添加多个相同的凤凰之火技能,它们能同时生效。

ANcs(集束导弹):如果你想制作一个重复投掷箭矢的技能,尤其是AOE技能,可以用集束导弹,只要设好每波的导弹数和波数就好。

ANab, AEsh(强酸炸弹,暗影突袭):强酸炸弹极为通用,而且可能是最好的直接伤害技能模板。它拥有许多不错的特性,可以降低移动速度]攻击速度和护甲、还有直接伤害效果、持续伤害效果、buff、投射图像——而且如果有必要,所有这些效果都能简单地被移除。而且它不会给目标单位附加昏迷之类的麻烦效果。暗影突袭的数据域和强酸炸弹差不多,不过少了护甲削减一项,此外它的每次伤害会以飘字形式显示在目标的头顶。用一个空buff可以去除这个花哨效果。

AItg(攻击加成):一般来说你会需要将这技能的攻击加成设为-1然后添加给隐藏单位来无伤害地施放其攻击附加效果。方法是将施法者基本攻击力设为0,攻击色子数设1,色子面数设0,然后将你的自定义攻击加成技能添加给隐藏施法者。这样施法者不会造成任何伤害,但攻击附加技能依然会生效。这法子可以用于添加火油、冰冻气息、减速毒药之类技能的buff。顺便,负值的攻击力是无法治疗目标的(原文说反了)。

AOcr(暴击):如果你不知道单位的实际攻击力却希望将其攻击力变为0,那么将这个技能几率设为100,伤害倍率设为负数就能达到目的。而且由于每次伤害都是0,它甚至不会显示红色的伤害飘字。

AOcl, Amgl(闪电链,月刃):闪电链是个不错的带闪电效果的纯伤害技能模板,也可以用作导弹弹跳的技能。你可以调整闪电链的目标数量和伤害削减因子。至于月刃的作用方式则完全不同。月刃技能实际上除了提供一个被动图标外毫无效果。实际的弹射加成来自于科技。

Ahrl(食尸鬼伐木):可以用于判断某个可破坏物是否是树。

复制代码 jass

  • function IsDestructableTree takes destructable d returns boolean
  •   local boolean i = IsDestructableInvulnerable(d)
  •   local unit u = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), <invisible caster>,GetWidgetX(d), GetWidgetY(d), 0)
  •   local boolean result = false
  •   call UnitAddAbility(u, 'Ahrl')
  •   if i then
  •     call SetDestructableInvulnerable(d, false)
  •   endif
  •   set result = IssueTargetOrder(u, "harvest", d)
  •   call RemoveUnit(u)
  •   if i then
  •     call SetDestructableInvulnerable(d, true)
  •   endif
  •   return result
  • endfunction



AIgu, AIgf(夜视雕文,强固雕文):使用这两种技能书可以将指定升级应用于英雄所在玩家(下面一大段错误论断,pass了)

Acoa, Acoh, Adec(骑乘角鹰,分离):写在这里纯粹为了提醒您这个技能的存在。自然它可以用于融合2个单位,也可以单纯地作为某个需要一对不同类型的单位合力使用的技能的模板,只要捕捉技能施放事件然后打断之即可。

Awarp(传送门):传送门技能也可以在运行时被添加给单位。然后你就可以用WaygateSetDestination()函数和WaygateActivate()函数来设置传送属性。你也可以用路径阻断器来阻止比方说飞行单位使用传送门。想要更改传送特效你要改的是Amov(移动)技能。


复制代码 jass

  • function SetupWaygate takes unit u, unit target returns nothing
  • call UnitAddAbility(u, <waygate ability>)
  • call UnitAddAbility(u, 'Aivs')
  • call UnitAddAbility(u, 'Agho')
  • call UnitAddAbility(u, 'Aloc')
  • call SetUnitScale(u, 0.01, 0.01, 0.01)
  • call WaygateSetDestinationLocBJ(u, PolarProjectionBJ(GetUnitLoc(target), 96, AngleBetweenPoints(GetUnitLoc(u), GetUnitLoc(target))))
  • call WaygateActivate(u, true)
  • endfunction
  • function ConnectRects takes rect left, rect right returns nothing
  • local unit lu = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'ncop', GetRectCenterX(left), GetRectCenterY(left), 0)
  • local unit ru = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), 'ncop', GetRectCenterX(right), GetRectCenterY(right), 0)
  • call SetupWaygate(lu, ru)
  • call SetupWaygate(ru, lu)
  • endfunction


快速回复 返回列表 返回顶部