====== 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.