Inhaltsverzeichnis

UseHeroAbility

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).

Einschränkungen

Tabelle der Fähigkeiten

Nur fett gedruckte Fähigkeiten können eingesetzt werden

Name des HeldenFähigkeit 1Fähigkeit 2Fähigkeit 3
DarioAbilityInflictFearAbilitySendHawk-
ErecAbilityRangedEffectAbilityCircularAttack-
PilgrimAbilityPlaceBombAbilityBuildCannon-
AriAbilityCamouflageAbilitySummon-
SalimAbilityRangedEffectAbilityBuildCannon-
HeliasAbilityRangedEffectAbilityConvertSettlers-
VargAbilityRangedEffectAbilitySummon-
KerberosAbilityRangedEffectAbilityInflictFear-
MaryAbilityRangedEffectAbilityCircularAttack-
DrakeAbilityRangedEffectAbilitySniper-
YukiAbilityInflictFearAbilityMotivateWorkersAbilityShuriken
KalaAbilityRangedEffectAbilityShuriken-

Beispiel

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

Code

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