Inhaltsverzeichnis

Übergabe von Einheiten, Gebäuden etc.

Übergabe von Roshtoffen

Einem Spieler Rohstoffe zu geben funktioniert so:

-- Diese Funktion gibt dem menschlichen Spieler 1000 Taler
AddGold(1000)
 
-- Diese Funktion gibt dem Spieler 500 Eisen
AddIron(500)
 
-- Und diese Funktion gibt dem Spieler 2 600 Schwefel
-- Wie man sieht, muss man hier auch die ID des Spielers angeben, denn sonst würde es ja der menschliche Spieler bekommen
AddSulfur(2, 600)

Siehe auch

AddGold, AddClay, AddWood, AddStone, AddIron, AddSulfur

Übergabe von bestimmten Einheiten/Gebäuden

Um Spielercharaktere oder Gebäude einem anderen Spieler zu übergeben, brauchen diese Entities einen Scriptnamen. Dann kann man die Funktion ChangePlayer() verwenden. Als Parameter muss man den Scriptnamen und die neue Spieler ID übergeben.

-- Den Helden "Erec" an den menschlichen Spieler übergeben
ChangePlayer("Erec", 1)
 
-- Das Hauptquartier "HQ" übergeben
ChangePlayer("HQ", 1)

Truppen (Hauptmänner) können ebenfalls mit ChangePlayer() übergeben werden, allerdings haben diese meistens keine Scriptnamen, sondern IDs.

local troopDescription = {
    minNumberOfSoldiers = 0,
    maxNumberOfSoldiers = 3,
    experiencePoints = VERYHIGH_EXPERIENCE,
    leaderType = Entities.PU_LeaderHeavyCavalry2,
    position = GetPosition("support"),
}
local army = {}
troop1 = CreateTroop(army, troopDescription)
troop2 = CreateTroop(army, troopDescription)

In „troop1“ bzw. „troop2“ ist jetzt die ID gespeichert. Jetzt kann man wieder ChangePlayer() benutzen:

-- Diese Truppen Spieler zwei geben
ChangePlayer(troop1, 2)
ChangePlayer(troop2, 2)

Siehe auch

ChangePlayer

Übergabe von sehr vielen Einheiten

Wenn man irgendwann sehr viele Einheiten oder Gebäude übergeben will, macht man sich viel Arbeit ChangePlayer() 20 mal untereinander zu schreiben. Wenn man dann noch später ein Gebäude hinzufügt, muss man erstmal wieder eine neue Zeile einfügen. Das geht auch einfacher mit einer Schleife und einer einheitlichen Wahl der Scriptnamen.

Wenn man also viele Gebäude übergeben will, dann sollte das erste Haus z.B. „Haus1“, das zweite „Haus2“, das dritte „Haus3“ usw. heißen. Es sollte immer mit 1 anfangen und es darf keine Zahl ausgelassen werden.

local i = 1                        -- Index für die Gebäudenummern
while IsExisting("Haus" .. i) do   -- Die Schleife läuft so lange, bis kein Haus mehr mit dem entsprechenden Index gefunden wird
    ChangePlayer("Haus" .. i)      -- Spieler ID wechseln
    i = i + 1                      -- Index erhöhen
end

Jetzt auch mit Sprüngen in der Nummerierung

Ich habe eine kleine Funktion gebastelt mit der man auch Zahlen auslassen darf, allerdings eine Obergrenze festlegen muss, da das Spiel die Schleife ansonsten unendlich oft wiederholen würde.

Die eigentliche Schleife:

function ChangeHouses()
    for i = 1, 50 do -- solange i kleiner als 50 ist die Schleife ausführen
        if IsExisting("Haus" .. i) then 
            ChangePlayer("Haus" .. i, 1)      -- Spieler ID wechseln
        end
    end
end

Siehe auch

Schleifen, IsExisting, changeallentitiesplayerid

Übergabe von Gebäuden, die gerade erst gebaut wurden

Für Fortgeschrittene:
In einem Briefing kann man eine Angabe „pointer“ machen, einen Pfeil der auf den Boden zeigt und in der Tutorial Mission verwendet wurde, um anzuzeigen, dass dort ein Gebäude gebaut werden soll. Das kann man natürlich auch selbst machen, wenn man z.B. einen Quest hat, bei dem der Spieler für einen NPC ein Haus bauen soll. Ideal wäre natürlich, dieses Haus nach Fertigstellung auch dem NPC zu übergeben. Das funktioniert auch und zwar so:

local quest = {
    AreaPos     = "NPC_Haus",                -- Die Stelle an der das Gebäude gebaut werden soll
    AreaSize    = 1000,                      -- Ein Toleranzwert um die Stelle, denn genau wird man es nicht darauf bauen können
    EntityTypes = {
        {Entities.PB_Residence1, 1}          -- Ein einfaches Haus soll gebaut werden
    },
    Callback    = function(_quest)                 -- Diese Funktion wird aufgerufen, wenn der Turm gebaut wurde
        -- Hiermit bekommen wir jetzt die Entity ID des Wetterturms, damit wir die Spieler ID ändern können
        -- Die Funktion GetEntityIdInArea() müssen wir aber noch zusätzlich in das Script kopieren (siehe unten)
        local entityID = GetEntityIdInArea(1, _quest.EntityTypes[1][1], _quest.AreaPos, _quest.AreaSize)
 
        -- Jetzt können wir die ID des Hauses ändern
        ChangePlayer(entityID, 4)
    end,
}
-- Quest starten
SetupEstablish(quest)

Benötigter Code

Die Funktion GetEntityIdInArea() liefert eine ID einer bestimmten Entity, welche in dem Radius _range um _position liegt und sieht so aus:

function GetEntityIdInArea(_playerID, _entity, _position, _range)
    local data = {Logic.GetPlayerEntitiesInArea(_playerID, _entity, _position.X, _position.Y, _range, 1)}
 
    if Logic.IsBuilding(data[2]) then
        if Logic.IsConstructionComplete(data[2]) == 1 then
            return data[2]
        else
            return false
        end
    end
 
    return data[2]
end

FIXME Wer möchte, kann die Funktion ja noch etwas umbauen, mit Fehlerüberprüfung und/oder Parametercheck FIXME

Siehe auch

SetupEstablish

Zur Tutorial-Übersicht