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

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum