[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== 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 [[utilfunctions:gethealth|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