Zugriff auf ObjectType.getID()

Entwicklung und Vorstellung von LUA Skripten für ASC oder den Mapeditor

Moderator: Moderatoren2

Benutzeravatar
GDA
Hauptgefreiter
Hauptgefreiter
Beiträge: 98
Registriert: Mi 7. Mär 2012, 11:42
Einheitenset: Terraner

Zugriff auf ObjectType.getID()

Beitrag von GDA »

hallo,
wie schon im OT erwähnt, wollte ich mich in Lua einarbeiten.
Deshalb habe ich mir zuerst vorgenommen, das Skript unitcounting.lua dahingehend umzubauen, dass es die Anzahl der einzelnen Fahrzeuge auszugeben.

Dabei habe ich eine Problem:
Wie bekomme ich die ID?

Code: Alles auswählen

fld = map:getField(x,y)
		
		-- check if there is a unit on the field
		if fld:getVehicle() then
			
			-- check id of unit.
			i = 1
			while (not (i == fld.ObjectType.getID())) do
			end
funktioniert nicht:

Code: Alles auswählen

:23: attempt to index field 'ObjectType' (a nil value)
kann mir jemand weiterhelfen?

GDA
Benutzeravatar
fff
Stabsunteroffizier
Stabsunteroffizier
Beiträge: 435
Registriert: Mo 25. Jul 2011, 16:24

Re: Zugriff auf ObjectType.getID()

Beitrag von fff »

kannst du etwas mehr vom code posten?
Benutzeravatar
GDA
Hauptgefreiter
Hauptgefreiter
Beiträge: 98
Registriert: Mi 7. Mär 2012, 11:42
Einheitenset: Terraner

Re: Zugriff auf ObjectType.getID()

Beitrag von GDA »

Code: Alles auswählen

-- This script will count the number of each unit on the map
-- It does not count units that are loaded into transports or buildings
-- 
-- Available in: mapeditor


counter = 0
counterUnit = {} --array with one field per vehicle

-- get the active map
map = asc.getActiveMap()

-- iterate over all fields of the map
for y = 0,map:height()-1 do
	for x = 0,map:width()-1 do
		fld = map:getField(x,y)
		
		-- check if there is a unit on the field
		if fld:getVehicle() then
			
			-- check id of unit.
			i = 1
			while (not (i == fld.ObjectType.getID())) do
			end
			counterUnit[i] = counterUnit[i] + 1
			counter = counter + 1
		end
	end
end

asc.infoMessage(counter .. ' units on map')

asc.infoMessage(counterUnit[1] .. ' Blackout\n'
		--[=[counterUnit[2] .. ' Coma\n'
		counterUnit[3] .. ' Assault\n'
		counterUnit[4] .. ' Armadillo\n'
		counterunit[5] .. ' Hoovercraft\n'
		counterUnit[6] .. ' Weasel\n'
		counterUnit[7] .. ' Hornet\n'
		counterUnit[8] .. ' Hurry\n'
		counterUnit[9] .. ' Scope\n'
		counterUnit[10] .. ' Alguin\n'
		counterUnit[11] .. ' Ceti\n'
		counterUnit[12] .. ' Vesuvius\n'
		counterUnit[13] .. ' Cosinus\n'
		counterUnit[14] .. ' Wedge\n'
		counterUnit[15] .. ' Raven\n'
		counterUnit[16] .. ' Oracle\n'
		counterUnit[17] .. ' Shock Trooper\n'
		counterUnit[18] .. ' Swatter\n'
		counterUnit[19] .. ' Arrow\n'
		counterUnit[20] .. ' Bang\n'
		counterUnit[21] .. ' \n'
		counterUnit[22] .. ' \n'
		counterUnit[23] .. ' \n'
		]=]
)
Benutzeravatar
fff
Stabsunteroffizier
Stabsunteroffizier
Beiträge: 435
Registriert: Mo 25. Jul 2011, 16:24

Re: Zugriff auf ObjectType.getID()

Beitrag von fff »

danke. Vehicle und Building sind keine objects. "Roads, pipleines, trenches and woods are examples of objects."
Benutzeravatar
GDA
Hauptgefreiter
Hauptgefreiter
Beiträge: 98
Registriert: Mi 7. Mär 2012, 11:42
Einheitenset: Terraner

Re: Zugriff auf ObjectType.getID()

Beitrag von GDA »

Woher bekomme ich dann die ID von Vehicle?
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: Zugriff auf ObjectType.getID()

Beitrag von Hanni »

Funktion um ID einer Einheit zu extrahieren:

Code: Alles auswählen

function getUnitID(funit)
	local	vehicleType	= funit:getType()
	local	unitid		= vehicleType:getID()
	
	return unitid
end
Codeschnipsel um Einheit auf einem Feld auszulesen

Code: Alles auswählen

-- Pointer auf das aktuelle Feld laden
field	= map:getField(x,y)
		
-- Pointer auf die Einheit des aktuellen Feldes holen
unit	= field:getVehicle()
		
-- testen ob auf dem aktuellem Feld eine Einheit ist
if unit ~= nil then
			
	-- Einheiten ID holen und sichern
	id	= getUnitID ( unit )
end
Grüße
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GDA
Hauptgefreiter
Hauptgefreiter
Beiträge: 98
Registriert: Mi 7. Mär 2012, 11:42
Einheitenset: Terraner

Re: Zugriff auf ObjectType.getID()

Beitrag von GDA »

Code: Alles auswählen

for y = 0,map:height()-1 do
	for x = 0,map:width()-1 do
		fld = map:getField(x,y)
		
		-- check if there is a unit on the field
		if fld:getVehicle() then
			unit = fld:getVehicle()
			-- check id of unit.
			i = 1
			if unit ~=nil then
				while (not (i == getUnitID(unit))) do
				end
				counterUnit[i] = counterUnit[i] + 1
				counter = counter + 1
			end
		end
	end
end
Warum funktioniert das nicht?
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: Zugriff auf ObjectType.getID()

Beitrag von Hanni »

Es wäre hilfreich, wenn du deinen Code einmal selber kommentierst und darstellst, was du in welcher Zeile zu tun gedenkst.

Code: Alles auswählen

i = 1
         if unit ~=nil then
            while (not (i == getUnitID(unit))) do
            end
            counterUnit[i] = counterUnit[i] + 1
            counter = counter + 1
         end
Was passiert da?
Zuerst einmal wird einer Variable i ein Wert 1 zugewiesen.
Anschließend wird getestet, ob auf dem Feld eine Einheit steht.
Sollte auf den Feld eine Einheit stehen passiert dann das folgende (von innen nach außen):
  1. Prüfe ob die Einheit auf dem Feld die ID 1 hat,
  2. invertiere diese Aussage,
  3. Verweile in dieser Schleife, solange die invertierte Aussage wahr ist.
Da die Wahrscheinlichkeit, dass auf einer Karte nur Einheiten mit der ID 1 existieren quasi gegen Null geht, dürfte sich dieses Skript bei nahezu jedem Aufruf in einer Endlosschleife manövrieren.

Grüße
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
GDA
Hauptgefreiter
Hauptgefreiter
Beiträge: 98
Registriert: Mi 7. Mär 2012, 11:42
Einheitenset: Terraner

Re: Zugriff auf ObjectType.getID()

Beitrag von GDA »

ich hab vergessen i zu inkrementieren:
i += 1
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: Zugriff auf ObjectType.getID()

Beitrag von Hanni »

Nö, du machst es dir nur unnötig schwer ...

Code: Alles auswählen

if unit ~=nil then
    i = getUnitID(unit)
    counterUnit[i] = counterUnit[i] + 1
    counter = counter + 1
end
Das da erfüllt den Zweck ebenso und ist um Welten schneller ...

Grüße
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Antworten