NPC-Helden benutzen normalerweise keine ihrer Spezialfähigkeiten obwohl das manchmal wünschenswert wäre. Mit dieser Funktion kann man eine Heldenfähigkeit einsetzen und zwar unabhängig davon, ob die Fähigkeit bereits voll aufgeladen ist oder nicht (es funktioniert immer).
Nur fett gedruckte Fähigkeiten können eingesetzt werden
Name des Helden | Fähigkeit 1 | Fähigkeit 2 | Fähigkeit 3 |
---|---|---|---|
Dario | AbilityInflictFear | AbilitySendHawk | - |
Erec | AbilityRangedEffect | AbilityCircularAttack | - |
Pilgrim | AbilityPlaceBomb | AbilityBuildCannon | - |
Ari | AbilityCamouflage | AbilitySummon | - |
Salim | AbilityRangedEffect | AbilityBuildCannon | - |
Helias | AbilityRangedEffect | AbilityConvertSettlers | - |
Varg | AbilityRangedEffect | AbilitySummon | - |
Kerberos | AbilityRangedEffect | AbilityInflictFear | - |
Mary | AbilityRangedEffect | AbilityCircularAttack | - |
Drake | AbilityRangedEffect | AbilitySniper | - |
Yuki | AbilityInflictFear | AbilityMotivateWorkers | AbilityShuriken |
Kala | AbilityRangedEffect | AbilityShuriken | - |
Als Beispiel nehmen wir Erec (mit gleichnamigem Scriptnamen). Einige der verwendeten Funktionen findet man hier im Wiki, andere sind ausgedacht (können aber leicht implementiert werden).
function ControlErec() if Counter.Tick2("ControlErec", 5) then local Position = GetPosition("Erec") local PlayerID = GetPlayer("Erec") -- Wenn Feinde in der Nähe sind, soll Erecs Aura eingesetzt werden if AreEnemiesInArea(PlayerID, Position, 500) then -- Das "false" am Ende bedeutet, das der Cooldown der Fähigkeit -- abgewartet werden soll (ist die Fähigkeit noch nicht voll aufgeladen, -- passiert nichts) UseHeroAbility("Erec", Abilities.AbilityRangedEffect, false) end -- Wenn viele Gegner ganz nah um Erec stehen soll er mit 20% Wahrscheinlichkeit -- seinen Rundschlag einsetzen if GetNumberOfEnemiesInArea(PlayerID, Position, 200) >= 8 and Chance(20) then -- Und das ohne den Cooldown abzuwarten (dafür steht das true hinten) -- Er setzt sie also auf jeden Fall ein UseHeroAbility("Erec", Abilities.AbilityCircularAttack, true) end -- Das hier dient nur dazu Erec auf der Karte herumzuschicken if GetHealth("Erec") <= 30 then Move("ErecsBurg") else Attack("BurgVomFeind") end end end
function UseHeroAbility(_Hero, _Ability, _Definitely) -- Get hero ID local HeroID = GetEntityId(_Hero) -- Is ability supported? assert(Logic.HeroIsAbilitySupported(HeroID, _Ability) == 1, "Ability not supported") if _Definitely ~= nil and _Definitely then -- Make sure the ability is completely charged local NeededTime = Logic.HeroGetAbilityRechargeTime(HeroID, _Ability) Logic.HeroSetAbilityChargeSeconds(HeroID, _Ability, NeededTime) end -- Use Ability if _Ability == Abilities.AbilityRangedEffect then GUI.SettlerAffectUnitsInArea(HeroID) elseif _Ability == Abilities.AbilityCircularAttack then GUI.SettlerCircularAttack(HeroID) elseif _Ability == Abilities.AbilityInflictFear then GUI.SettlerInflictFear(HeroID) elseif _Ability == Abilities.AbilityCamouflage then GUI.SettlerCamouflage(HeroID) elseif _Ability == Abilities.AbilitySummon then GUI.SettlerSummon(HeroID) elseif _Ability == Abilities.AbilityMotivateWorkers then GUI.SettlerMotivateWorkers(HeroID) else -- Ability not allowed cause it needs a target assert(false, "Ability not allowed") end end
zurück zu: Nützliche Funktionen