Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilfunctions:getallleader

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
utilfunctions/getallleader.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)