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)
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)
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
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
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)
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
Wer möchte, kann die Funktion ja noch etwas umbauen, mit Fehlerüberprüfung und/oder Parametercheck