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…

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