Inhaltsverzeichnis
Einleitung
Einige Einheiten in Siedler5 (wie z.B. Leibeigene und Kanonen) haben keine Selbstheilungskraft, so dass ihre Verletzungen nur mit Salims Spezialfähigkeit geheilt werden können.
Nun ist Salim aber nicht in jeder Karte verfügbar. Und es ist doch auch blöd, Kanonen halb tot wieder in die Schlacht zu schicken, genauso wie es Verschwendung wäre, sie deswegen direkt zu entlassen.
Heiler erstellen
Dafür gibt es jetzt Heiler. Ein Heiler kann theoretisch jede beliebige Entität sein, und heilt automatisch…
- alle 15 Sekunden…
- bis zu 15 Verbündete Einheiten…
- im Umkreis von 800…
- um 20%.
Er kann ein arg zerschundenes Heer wieder auf Trab bringen, oder es auch während der Schlacht etwas unterstützen.
Eine Entität kann mit der folgenden Skriptzeile in einen Heiler verwandelt werden:
CreateHealer( _name, _playerID )
Wobei _name der Skriptname der Entität ist.
Die Angabe der _playerID ist optional und nur nötig, wenn der Heiler Einheiten einer anderen Partei (und deren Verbündete) heilen soll, anstatt die seiner eigenen ID (und deren Verbündete).
Auf diese Weise können auch völlig neutrale Doodads in Heiler verwandelt werden. Eine Heilpflanze oder ein heilender Wasserfall wären doch nicht schlecht…
Heiler-Code
Damit der Heiler funktioniert, muss der folgende Code irgendwo ins Skript kopiert werden:
function CreateHealer( _name, _playerID ) --Funktion zum Erstellen von Heiler-Eigenschaften für die angegebene Entität assert( type( _name ) == "string", "Healer ERROR: wrong Input!" ); --Ein globaler Heiler-table wird erstellt gvHealer = gvHealer or { HealerJobID = StartSimpleJob("HealerJob") }; --Wenn keine PlayerID übergeben wurde, nimm die ID des Heilers selbst... if not type( _playerID ) == "number" then _playerID = GetPlayer( _name ); end --Fülle den gvHealer-table mit den Werten des neuen Heilers table.insert( gvHealer, { name = _name, player = _playerID, counter = 15 } ); end function HealerJob() --Funktion zur Verwaltung des gvHealer-tables und der Heileffekte --Gehe den gesamten gvHealer-table durch... for i = table.getn( gvHealer ),1,-1 do --...und speichere den jeweiligen Heiler als "healer" local healer = gvHealer[i]; --Zähle den counter des Heilers herunter if healer.counter > 0 then healer.counter = healer.counter-1 end --Speichere die Position des Heilers in "pos" local pos = GetPosition( healer.name ); --Deaktiviere die Heilereigenschaften, falls der Heiler nicht mehr existiert if not IsExisting( healer.name ) then DestroyHealer( healer.name ); --Wenn der aktuelle Heiler noch existiert,... else --...erstelle visuelle Effekte, um ihn zu kennzeichnen for i = 1,2 do Logic.CreateEffect( GGL_Effects.FXSalimHeal, pos.X, pos.Y, 0 ); end --...und wenn der counter des Heilers = Null ist,... if healer.counter == 0 then --...setze ihn wieder auf 15 (Sekunden) healer.counter = 15 --...und gehe alle Spieler-Slots durch for j = 1,8 do --Wenn der aktuelle Spieler-Slot der des angegebenen Spielers oder ein Verbündeter dieses Spielers ist,... if j == healer.player or Logic.GetDiplomacyState( healer.player, j ) == Diplomacy.Friendly then --...speichere die IDs von bis zu 15 Entitäten des jeweiligen Spielers im Umkreis von 800 scm in "data" local data = {Logic.GetPlayerEntitiesInArea( j, 0, pos.X, pos.Y, 800, 15 )}; --Gehe "data" durch, und... for k = 2, data[1] + 1 do --...wenn die aktuelle Entität kein Gebäude ist,... if Logic.IsBuilding( data[k] ) == 0 then --...erhöhe ihre Health (Gesundheit) um 20%... SetHealth( data[k], GetHealth( data[k])+20 ); --...und erstelle einen visuellen Effekt zur Veranschaulichung local target_pos = GetPosition( data[k] ); Logic.CreateEffect( GGL_Effects.FXSalimHeal, target_pos.X, target_pos.Y, 0 ); end end end end end end end end function DestroyHealer( _name ) --Funktion zum Deaktivieren von Heiler-Eigenschaften für die angegebene Entität --Gehe den gesamten gvHealer-table durch... for i = 1,table.getn( gvHealer ) do --...und speichere den jeweiligen Heiler als "healer" local healer = gvHealer[i]; --Wenn der Name des Heilers mit dem angegebenen Namen übereinstimmt,... if healer.name == _name then --...entferne den Heiler aus dem gvHealer-table. table.remove( gvHealer, i ); return true; end end end
Zusätzlich benötigter Code:
Um die GetHealth-Funktion nutzen zu können, muss dieser Code einmal in eurem Skript vorhanden sein:
--------------------------------------------------------------------------------------------------------------------------------- -- Comfort function zum Abfragen der Health einer Entity by Chromix --------------------------------------------------------------------------------------------------------------------------------- function GetHealth( _entity ) local entityID = GetEntityId( _entity ); if not Tools.IsEntityAlive( entityID ) then return 0; end local MaxHealth = Logic.GetEntityMaxHealth( entityID ); local Health = Logic.GetEntityHealth( entityID ); return ( Health / MaxHealth ) * 100; end