Counter.Tick2
» Siedler Map Source Forum » Siedler DEdK Script Forum » Counter.Tick2
Seiten: 1
Mordred
|
#1 30.07.2010 10:35 Beiträge: 939 |
Counter.Tick2
Neulich habe ich eine Funktion entwickelt, wenn auch nur wenig sinnvoll. (was ich hier herausfinden will)
Leider kann ich sie nicht testen und würde auch gerne kommentare von anderen dazu hören.
Und u.U. Erweiterungsvorschläge - falls sie überhaupt funktioniert.
Die Funktion ist sozusagen eine vereinfachung von Counter.Tick2.
Wer sie testen mag, muss nur "Erec" auf eine Testmap stellen und das da ins Skript einfügen:
Script.Load(Folders.MapTools.."Main.lua") IncludeGlobals("MapEditorTools") function FirstMapAction() AllePaarSekunden("KilleErec",4,100) end function KilleErec() if IsDead("Erec")then BEENDEN = true else HurtEntity("Erec",20) end end --- comfort --- function AllePaarSekunden(_job,_sek,_wieoft) if not _wieoft then _wieoft = false end if not _sek then _sek = 10 else if (_sek < 0)then _sek = 10 end end if not _job then Message("ERR:AllePaarSekunden! Param 1 must exist and be a string!") else _sek = math.floor(_sek) _wieoft = math.floor(_wieoft) if not AllPaSekT then AllPaSekT = {} StartSimpleJob("AllPaSekJob") end table.insert(AllPaSekT,{Jobb = _job,Sek = _sek,Ticker = 0,Anzahl = _wieoft}) end end function AllPaSekJob() for i=1,table.getn(AllPaSekT) do if (AllPaSekT[i][3] >= AllPaSekT[i][2])then AllPaSekT[i][3] = 0 BEENDEN = false if (AllPaSekT[i][4] ~= false)then if (AllPaSekT[i][4] > 0)then AllPaSekT[i][4] = AllPaSekT[i][4] - 1 StartJob(AllPaSekT[i][1]) if (BEENDEN == true)then table.remove(AllPaSekT,i) end else table.remove(AllPaSekT,i) end else StartJob(AllPaSekT[i][1]) if (BEENDEN == true)then table.remove(AllPaSekT,i) end end else AllPaSekT[i][3] = AllPaSekT[i][3] + 1 end end end
(Der Job "KilleErec" wir nun 100 mal alle 4 sekunden ausgeführt und beendet oder er wird beendet, wenn "Erec" tot ist.)
warrior1024
|
#2 30.07.2010 11:01 Beiträge: 345 |
Da geht vieles einfacher. Man kann z.B. über das _G auf die Funktion per String zugreifen...
Etwas gekürzt sieht das ganze dann so aus:
--- comfort --- function AllePaarSekunden(_job,_sek,_wieoft) if not _wieoft then _wieoft = 0 end if not _sek then _sek = 10 else if (_sek < 0)then _sek = 10 end end if (not _job) or (type(_job) ~= "string") then Message("ERR:AllePaarSekunden! Param 1 must exist and be a string!") else _sek = math.floor(_sek) _wieoft = math.floor(_wieoft) if not AllPaSekT then AllPaSekT = {} StartSimpleJob("AllPaSekJob") end table.insert(AllPaSekT,{Jobb = _job,Sek = _sek,Ticker = 0,Anzahl = _wieoft}) end end function AllPaSekJob() for i=1,table.getn(AllPaSekT) do AllPaSekT[i]["Ticker"] = AllPaSekT[i]["Ticker"] + 1 if (AllPaSekT[i]["Ticker"] == AllPaSekT[i]["Sek"])then --Der Ticker wird nie größer als die Sek-Zahl! AllPaSekT[i]["Ticker"] = 0 if (AllPaSekT[i]["Anzahl"] > 0)then AllPaSekT[i]["Anzahl"] = AllPaSekT[i]["Anzahl"] - 1 _G[AllPaSekT[i]["Jobb"]]() --über das _G-Table aufgerufen else table.remove(AllPaSekT,i) end end end end
Muss nurnoch getestet werden. Moment...
Edit:
Funktioniert. Noch als Erweiterung:
Z.B. mit return true den Aufrufzähler verringern(Erfolgreich) oder bei false unverändert lassen(Gescheitert).
Edit2:
Habe die Funktion etwas erweitert, muss aber noch getestet werden. Noch ist die getestete Version drin. Features der neuen:
-Funktion kann endlos laufen
-per return "failure" kann man verhindern, dass ei Aufruf verschwendet wird.
-per return "success" wird klar gemacht, dass die Funktion erfolgreich war: Aufruf wird gezählt
- wenn garnichts/irgendetwas anderes returned wird, wird der Aufruf der Funktion nicht mehr stattfinden
-Sobald die Funktion aus welchem Grund auch immer nicht mehr aufgerufen wird, wird eine Funktion einmal aufgerufen. Diese wird als String in der Funktion AllePaarSekunden festgelegt. Wenn nicht vorhanden, wird eine leere Funktion aufgerufen.
____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal
Dieser Beitrag wurde von warrior1024 am 30.07.2010 um 12:30 editiert.
kingsia
|
#3 30.07.2010 15:49 Beiträge: 750 |
Es funktioniert vielleicht ABER nur wenn es einmal verwendet wird.
Mehrfache gleichzeitige Aufrufe wird zum Absturze bzw. Fehlermeldungen führen.
Fehler liegt hier
for i=1,table.getn(AllPaSekT) do
Beim entfernen ein Eintrag im Tabelle mit
table.remove(AllPaSekT,i)
wird den nächsten Eintrag übersprungen und am Ende der Loop wird i ein ungultige Wert haben.
Die Zeile muss wie folgt geändert werden
for i=table.getn(AllPaSekT), 1, -1 do
Gruss
Kingsia
Dieser Beitrag wurde von kingsia am 30.07.2010 um 15:55 editiert.
Mordred
|
#4 30.07.2010 15:56 Beiträge: 939 |
Genau! Das habe ich ganz vergessen.
Erste Idee war es nämlich, ein Backup-table zu erstellen, aber das hier ist die eindeutig rationellere Lösung.
Danke
Seiten: 1