[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== 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 =====
* Diese Funktion automatisiert den Einsatz der Fähigkeiten nicht. Man braucht einen Job um den Helden zu steuern und seine Fähigkeiten einzusetzen (siehe Beispiel).
* Bestimmte Fähigkeiten können nicht eingesetzt werden. Dazu gehören alle diejenigen Fähigkeiten, die ein Ziel benötigen, wie etwa das Aufstellen von Pilgrims Kanone oder Salims Fallen, der Zielschuss von Drake usw.
* Die Helden können natürlich auch nur die Fähigkeiten einsetzen, die sie tatsächlich können (Ari kann zum Beispiel keinen Rundschlag einsetzen).
===== Tabelle der Fähigkeiten =====
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|-|
===== 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: [[utilfunctions:index|Nützliche Funktionen]]