====== 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 [[utilfunctions:getallplayerbuildings|GetAllPlayerBuildings]].
Benötigt habe ich die Funktion für mein [[devscripts:voelker|Völkerskript]] zur Erfassung der Arbeiter bestimmter Spieler.