[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== GetAllLeader ======
Diese Funktion gibt zwei Table zurück. Das erste Table enthält (falls welche vorhanden sind) alle Leader-Ids eines Players **//(inkl. Kanonen!)//**. Das zweite Table beinhaltet (falls vorhanden) alle Ids der Kanonen des Players. Sie hat den Vorteil, dass gegenüber den xyInArea-Funktionen zuverlässig alle Leader auf der gesamten Map erfasst werden.
Die Funktion benötigt beim Aufruf nur einen einzigen Parameter, nämlich die Player-Id. Und da es sich quasi um eine Art Hilfsfunktion handelt, die alleine wenig Sinn macht, muss sie aus anderen Funktionen heraus aufgerufen werden.
Bedenke: Die Leader können sich sehr schnell verändern (neue rekrutiert, im Kampf gefallen, etc.)! Von daher sollte die Funktion jedesmal, und unmittelbar bevor man auf die Leader-Ids zugreifen möchte, aufgerufen werden!
Der Aufruf erfolgt dann so (z.B. für Player 3):
local leaders, cannons = GetAllLeader( 3 )
und muss immer aus einer anderen Funktion heraus erfolgen!\\
Zur Verdeutlichung noch ein komplettes (wenn auch wenig sinniges) Beispiel:
function Army_Leader_Player3()
local leaders, cannons = GetAllLeader( 3 )
for i=1,table.getn(leaders) do
Message("Leader-Id: "..leaders[i].." Army-Id: "..AI.Entity_GetConnectedArmy(leaders[i]))
end
for j=1,table.getn(cannons) do
Message("Cannon-Id: "..cannons[j].." Army-Id: "..AI.Entity_GetConnectedArmy(cannons[j]))
end
end
===== Code =====
irgendwo an eine freie Stelle (nicht innerhalb anderer Funktionen!) ins Script kopieren:
function GetAllLeader(_player)
local leaderIds = {}
local cannonIds = {}
local numberOfLeaders = Logic.GetNumberOfLeader(_player)
local cannonCount = 0
local prevLeaderId = 0
local existing = {}
for i=1,numberOfLeaders do
local nextLeaderId = Logic.GetNextLeader( _player, prevLeaderId )
if existing[nextLeaderId] then
cannonCount = cannonCount + 1
else
existing[nextLeaderId] = true;
table.insert(leaderIds,nextLeaderId)
end
prevLeaderId = nextLeaderId
end
if cannonCount > 0 then
local tempCannonIds = {}
for i=1,4 do
local counter = 0
counter = Logic.GetNumberOfEntitiesOfTypeOfPlayer(_player, Entities["PV_Cannon"..i])
if counter > 0 then
tempCannonIds = {Logic.GetPlayerEntities(_player, Entities["PV_Cannon"..i], counter)}
table.remove(tempCannonIds,1)
for j=1,table.getn(tempCannonIds) do
table.insert(leaderIds,tempCannonIds[j])
table.insert(cannonIds,tempCannonIds[j])
end
end
end
end
return leaderIds, cannonIds
end