[[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]]