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