**GetEntityId**

EineID ist Identifikator, auch Kennung, Identifikationsnummer oder eben auch kurz ID… Diese ID ist nicht immer fest zugeordnet, und wird vom Spiel „verwaltet“ , aber das ist wieder ein anderes Thema… GetEntityId() liefert eben diese ID, und die folgenen Beispiele sollen zeigen, dass man damit allerhand Unsinn treiben kann…;-)

Die kommenden Funktionen zeigen auch wie man einen SSJ „zweckentfremden“ kann…

Sozusagen:

StartSimpleJob("DarioStrahlt")
--against ;-)
DarioStrahlt() 

Als erstes setzte einen Held, sinnigerweise Dario, auf die Karte und benenne Ihn „dario“! Ich persönlich finde ein Hasen lustiger…:-)

Dann, im Skript, am besten in der FMA:

StartSimpleJob("DarioStrahlt")

Was passiert jetzt bei Start des Spieles?

Die Funktion DarioStrahlt() wird jetzt jede Sekunde einmal aufgerufen, sofern er nicht mittels return true beendet wird!

Jetzt irgendwo im Skript:

function DarioStrahlt()
    --jetzt wird jede Sekunde, in der dieser Job aufgerufen wird, die von GetEntityId("dario"), gelieferte ID, 
    --in der localen Variable "darioID" gespeichert..
    local darioID = GetEntityId("dario")
 
    --jetzt wird gefragt, ob sich diese ID bewegt! 
    --Logic.IsEntityMoving,findet man in der _G-Liste, und liefert immer 1 wenn sich die entsprechende ID bewegt!
    if Logic.IsEntityMoving(darioID) == 1 then  
 
        --erzeuge dann an dieser Position, der gelieferten ID, einen Effekt...
        CreateEffect(1 ,GGL_Effects.FXKalaPoison, GetPosition(darioID))
        --CreateEffect(1 ,GGL_Effects.FXTemplarAltarEffect, GetPosition(darioID))
        --CreateEffect(1 ,GGL_Effects.FXBuildingSmoke, GetPosition(darioID))
        --da dieser Job nicht mit return true beendet wird, läuft er, zumindest in dieser Form des Aufrufes, fortwährend...		
 
    end
end

Wird dieser Job als normale Funktion gestartet…

DarioStrahlt()

…passiert nichts! Es sei den, Dario bewegt sich während die Funktion gestartet wird! Die Abfrage findet dann nur in diesem einen Augenblick statt, und entweder er bewegt sich gerade, dann hat man Glück und kann den Effekt sehen, oder eben nicht…

Läuft der Job als…

StartSimpleJob("DarioStrahlt")

und man beendet ihn mit return true, verhält es sich so ähnlich wie bei der normalen Funktion, nur mit dem Unterschied, dass die Funktion solange läuft, bis sich Dario das erstemal bewegt, dann kommt der Effekt und mit return true ist damit auch schon wieder Schluß…

Eine andere Variante ist:

StartSimpleJob("DarioStaubt")
function DarioStaubt()
    --jetzt wird jede Secunde, in der dieser Job aufgerufen wird, die von GetEntityId("dario"), gelieferte ID, 
    --in der localen Variable "Hanswurst" gespeichert..
    local Hanswurst = GetEntityId("dario")
 
    --Da die ID auch die Position sozusagen gleich mitliefert,in Form eines PositionsTables, kann ich diese in der Variablen "pos" speichern...
    local pos = GetPosition(Hanswurst)
 
    --jetzt wird wieder gefragt, ob sich diese ID bewegt, wenn ja, dann... 
    if Logic.IsEntityMoving(Hanswurst) == 1 then
 
        --Die Position, die in "pos" steht, wird jetzt mit X = pos.X und Y = pos.Y, übergeben...
        Logic.CreateEffect(GGL_Effects.FXBuildingSmoke, pos.X, pos.Y, 1 )
 
        --...und das ganze bei einem Trupp Reiter, die einen Hang runterstieben, 
        --und mittels Cutscene ins rechten Licht gerückt...Hat doch was...
    end
end

Zur Schreibweise der Variablen:

local darioID = GetEntityId("dario")

oder

local Darioid = GetEntityId("dario")

oder

local _darioID = GetEntityId("dario")

…macht alles das Gleiche!

Profis werden für eine einheitliche Schreibweise plädieren, was im professionellen Bereich auch Sinn macht, aber in meinem Skript, bin ich der Chef…;-) Ich muß damit arbeiten und ich muß mich darin zurechtfinden… Allerdings sollte man, wenn man Funktionen ins Wiki stellt, sich an vorgegebene Schreibweisen halten!

Doch wie beende ich den Effekt wieder? Ich will vieleicht einen staubenden Dario, oder was auch immer, nur zu einem bestimmten Zeitpunkt haben, z.B. innerhalb einer Cutscene…

Dann speichere ich die ID des Funktionsaufrufs in eine Variable.

z.B.

gvMission.DarioStrahlt = StartSimpleJob("DarioStrahlt")

Jetzt wird es in einem Table namens „gvMission“ gespeichert…

Aber auch hier kann ich schreiben:

MeinSimpleJobStrahlenderDario = StartSimpleJob("DarioStrahlt")--< wie gesagt, wie man lustig ist...

Jetzt ist es allerdings kein Table mehr…

Worin sich der funktionelle Unterschied, der verschiedenen Speichervarianten begründet, kann an dieser Stelle ja jemand anders erklären…;-)
Der Unterschied ist nur in der Ordnung zu begründen. Beides ist der Name eines Speicherplatzes, damit der PC den gespeicherten Wert findet. Beides sind globale Variable, werden also vom Spiel gespeichert. Wenn man allerdings alles in gvMission packt, so ist das mit der Ordnung auch nicht das Wahre.

Beenden kann man dann die Funktion, wann immer man will, mit:

EndJob(gvMission.DarioStrahlt)

oder eben mit:

EndJob(MeinSimpleJobStrahlenderDario)

z.B.

StartSimpleJob("NixMehrRadioaktiv")

und:

function NixMehrRadioaktiv()
    if IsNear("dario","darioEnde", 700) then
        EndJob(MeinSimpleJobStrahlenderDario)
        return true
    end
end

Siehe auch: Endjob

Dies sollte mal ein etwas anderer Versuch sein, eine Wikiseite zu füllen! Anhand eines lustigen Effektes auch mal die Bereiche zu streifen, die mittel- sowie unmittelbar davon betroffen sind. Es entspricht auch nicht der Natur eines reinen Wikis, weil persönliche Meinungen und Vorlieben enthalten sind. Aber wie gesagt, ist es nur ein Versuch!