Benutzer-Werkzeuge

Webseiten-Werkzeuge


comfort:trackentity

Comfort: TrackEntitys

Beschreibung

Diese Comfort Funktion speichert alle initialisierten Entities eines speziellen Typs und Spielers in einen Table.
Der Table ist dann überall im Skript ansprechbar.

Anwendung

Zunächst muss in der FirstMapAction() vor Anwendung der Code eingelesen werden:

Comfort_TrackEntitysIni()

Man muss ausserdem unbedingt die folgenden Trigger setzen:

Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_CREATED, "", "ActionOnEntityCreated", 1)
Trigger.RequestTrigger( Events.LOGIC_EVENT_ENTITY_DESTROYED, "", "ActionOnEntityDestroyed", 1)

Und die Funktionen ActionOnEntityCreated() und ActionOnEntityDestroyed() einfügen und bearbeiten. Das sieht dann in etwa so aus:

function ActionOnEntityCreated()
	local _eId = Event.GetEntityID()
	Comfort_TrackEntity_Created(_eId)
end
 
function ActionOnEntityDestroyed()
	local _eId = Event.GetEntityID()
	Comfort_TrackEntity_Destroyed(_eId)	
end

Jetzt können folgende Funktionen verwendet werden

Entitys tracken

Comfort_TrackEntityIni (_pId,_eType)	
_pId: Id des Spielers
_eType: Entity Type z.B. Entities.PU_Serf

Tracken beenden

Comfort_TrackEntity_RemoveTracking (_pId, _eType)
_pId: Id des Spielers
_eType: Entity Type

Wiederaktivieren siehe oben Comfort_TrackEntityIni (_pId,_eType)

Verwendung des Tables

Der Table sieht so aus:

Track_Entity_Table[_playerId][_entityType][n] -- Entities
Track_Entity_Table[_playerId][_entityType].count -- Anzahl der Entities
Track_Entity_Table[_playerId][_entityType].tracked -- true oder false, ob das Entity getrackt wird, ist ausschaltbar

Eine mögliche Verwendung wäre also mit allen tracked Entitys eines speziellen Typs etwas anzustellen:

local _eType = Entities.PU_Serf -- Beispiel Leibis
for _pId = 1,8 do		
	for i = 1, Track_Entity_Table[_pId][_eType].count do
		SetHealth(Track_Entity_Table[_pId][_eType][i],100) -- Beispiel Leben auf 100% setzen
	end
end

Achtung! Wenn du die Entitys umwandelt oder zerstörst in der Funktion wird das ganze nicht funktionieren, weil die Tablelänge ja jeweils um eins heruntergesetzt wird!
Hier ein Beispiel bei dem du alle Leibis in Milizen umwandelst. Es wird immer der Tablewert 1 genutzt:

for _pId = 1,8 do		
	for i = 1, Track_Entity_Table[_pId][Entities.PU_Serf].count do
		ReplaceEntity (Track_Entity_Table[_pId][Entities.PU_Serf][1], Entities.PU_BattleSerf )
	end
end

Es ist zu beachten, dass .count und .tracked nicht exisitieren, solange die Funktion nicht für den _entityType initialisiert wurde. Bei falscher Verwendung sind Fehlermeldungen vorauszusehen.

Code

function Comfort_TrackEntitysIni()	
 
	Track_Entity_Table = {}
	for i = 1,8 do
		Track_Entity_Table[i] = {}
	end	
	Comfort_TrackEntityIni = function(_pId,_eType)	
		local temp = {Logic.GetPlayerEntities(_pId, _eType,1)}
		local count = 0
		Track_Entity_Table[_pId][_eType] = {}
		Track_Entity_Table[_pId][_eType].tracked = true
		Track_Entity_Table[_pId][_eType].count = 0
		if temp[1] > 0 then
			local latestEntity = temp[2]
 
 
			for u = 1, Logic.GetNumberOfEntitiesOfTypeOfPlayer(_pId, _eType) do
 
				if latestEntity ~= 0 then
					table.insert(Track_Entity_Table[_pId][_eType], latestEntity)
					count = count + 1
				end		
				latestEntity = Logic.GetNextEntityOfPlayerOfType(latestEntity);
			end
			Track_Entity_Table[_pId][_eType].count = count
		end	
	end
 
	Comfort_TrackEntity_Created = function(_eId)
		local _pId = GetPlayer(_eId)	
		local _eType = Logic.GetEntityType(_eId)
		if Comfort_TrackEntity_IsTracked(_pId,_eType) then
			if Track_Entity_Table[_pId][_eType].tracked then
				table.insert(Track_Entity_Table[_pId][_eType], _eId)
				Track_Entity_Table[_pId][_eType].count = Track_Entity_Table[_pId][_eType].count + 1
			end
		end
	end
 
	Comfort_TrackEntity_Destroyed = function(_eId)
		local _pId = GetPlayer(_eId)
		local _eType = Logic.GetEntityType(_eId)	
		if Comfort_TrackEntity_IsTracked(_pId,_eType) then					
			for i = 1, Track_Entity_Table[_pId][_eType].count do
				if _eId == Track_Entity_Table[_pId][_eType][i] then
					table.remove(Track_Entity_Table[_pId][_eType], i)
					break
				end
			end
		end	
	end	
 
	Comfort_TrackEntity_IsTracked = function(_pId, _eType, _TypeOrId)
		if _TypeOrId == false then _eType = Logic.GetEntityType(_eTypeOrId) end
		if type(Track_Entity_Table[_pId]) == "table" then
			if type(Track_Entity_Table[_pId][_eType]) == "table" then
			else return false
			end
		else return false
		end
		return Track_Entity_Table[_pId][_eType].tracked	
	end
 
	Comfort_TrackEntity_RemoveTracking = function(_pId, _eType)
		Track_Entity_Table[_pId][_eType] = {}
		Track_Entity_Table[_pId][_eType].tracked = false
		Track_Entity_Table[_pId][_eType].count = -1	
	end	
 
end

Anmerkungen

Anmerkungen des Autors Anarki

Die Idee für diesen Comfort kam mir durch das Betrachten der Seite GetAllPlayerBuildings. Benötigt habe ich die Funktion für mein Völkerskript zur Erfassung der Arbeiter bestimmter Spieler.

comfort/trackentity.txt · Zuletzt geändert: 2021/09/18 19:15 von 127.0.0.1