in Funktionen eingreifen

» Siedler Map Source Forum » Siedler DEdK Script Forum » in Funktionen eingreifen

Seiten: 1

Kalle
#1
02.02.2013 10:50
Beiträge: 1150

in Funktionen eingreifen

Ich habe da mal wieder ein Problem, bzw. ich verstehe etwas mal wieder gar nicht:

Ich möchte mich in eine (mehrere) Funktion(en) einhacken, um zusätzlich Auslöser einzubauen...

Hier geht es um die Uni-Forschung:

GUIAction_CancelTechnology_Orig = GUIAction_CancelTechnology
   GUIAction_CancelTechnology = function(a,b,c,d,e)
      Message ("treffer1")
      erlaubt = true
      GUIAction_CancelTechnology_Orig(a,b,c,d,e)
   end



Hier soll nur das abbrechen einer Forschung "bemerkt" werden (in diesem Beispiel wird ein Text ausgegeben und eine Variable gesetzt) und sonst soll es wie gewohnt weitergehen.

Leider funktioniert das Beispiel so nicht. Die Forschung wird zwar abgebrochen, aber ist nicht neu zu starten, sonder wird intern weiter erforscht und dann als erforscht dem Spieler gemeldet. Weitere Forschungen und Abbrüche werden dem Spieler immer wieder als erforscht gemeldet (immer noch die alte Forschung, als würde man sie x-mal erforschen können)...

Hmmmm...

Eigentlich will ich an den Originalfunktionen gar nichts ändern, aber ich möchte das Ereignis bemerken und zusätzlich irgendwas auslösen können.

Mein Wunsch wäre:
- ich bemerke, wann eine Forschung gestartet wurde
- ich bemerke, wann eine Forschung abgebrochen wurde
jeweils dabei möchte ich gerne etwas zusätzlich auslösen.

Wer hat eine Idee? Und kann mir jemand erklären, warum das Beispiel oben nicht so richtig funktioniert?

Danke

____________________
Lieber Siedeln statt (fern)sehen.....

Peter-FS
#2
02.02.2013 12:39
Beiträge: 1086

Hallo Kalle,

ich bin auch kein Profi in Hacks, aber du solltest es mal damit probieren.

GUIAction_CancelTechnology_Orig = GUIAction_CancelTechnology
   GUIAction_CancelTechnology = function()
      Message ("treffer1")
      erlaubt = true
      GUIAction_CancelTechnology_Orig()
   end


Die Buchstaben bzw. Variablen a,b,... benötigst du nur, wenn du Rückgabewerte aus der Funktion benötigst. z.B. Abfrage welche Technologie gerade abgebrochen wird.

Ich hoffe das hilft!

Gruß Peter

____________________
Man muss nicht alles wissen, man muss nur wissen wo es steht!

Kalle
#3
02.02.2013 14:21
Beiträge: 1150

Da sollte nun eigentlich kein Unterschied sein, sagt mir mein Laienwissen. Denn wenn die Originalfunktion ohne Parameter kommt und quasi mit Parameter = NIL aufgerufen/weitergeleitet wird, sollte das eigentlich nichts ausmachen.

In diesem Fall gehe ich aber davon aus, dass die Originalfunktion GUIAction_CancelTechnology auch Parameter haben sollte, denn woher soll die GUI sonst wissen, welche Forschung in welchem Gebäude abgebrochen wird.

Das ganze ist und bleibt für mich irgendwie ein Buch mit sieben Siegeln... grrrr....

Eigentlich würde mir das Feststellen von "drücken der Buttons" schon helfen... aber wie??? Ein Trigger existiert nur für die Fertigstellung von Forschungen...

____________________
Lieber Siedeln statt (fern)sehen.....

andre111
#4
02.02.2013 15:38
Beiträge: 220

GUIAction_CancelTechnology verlangt keine Parameter, sonder bricht immer die aktuelle Erforschung des selektierten Gebäudes ab.

edit: Ich weiß nicht ob du diese Liste schon besitzt, aber sie beinhaltet alle GUI Elemente und welche Funktionen sie aufrufen: http://pastebin.com/yKQ83d2R

Darin findet man unter anderem:
CancelResearch
Calls: GUIAction_CancelTechnology()
Calls: GUITooltip_Generic("MenuBuildingGeneric/cancel_reserach"
Calls: GUIUpdate_CancelResearchButton()

Dieser Beitrag wurde von andre111 am 02.02.2013 um 17:05 editiert.

Kalle
#5
02.02.2013 19:39
Beiträge: 1150

Heureka

Dank Noigi's wiederholten Tipp klappt es nun:

Es ist scheinbar so, dass nur ein Parameter übergeben werden sollte, wenn die Funktion auch nur einen Parameter haben möchte:

function GuiHack()
	GUIAction_ReserachTechnology_Orig = GUIAction_ReserachTechnology;
	GUIAction_ReserachTechnology = function( _tech )
           if Logic.GetEntityType( GUI.GetSelectedEntity() ) == Entities.PB_University2 then
           Message ("Forschung begonnen")
			    end
   	   GUIAction_ReserachTechnology_Orig( _tech );
		end
	GUIAction_CancelTechnology_Orig = GUIAction_CancelTechnology
	GUIAction_CancelTechnology = function( _tech )
           if Logic.GetEntityType( GUI.GetSelectedEntity() ) == Entities.PB_University2 then
           Message ("Forschung Abbruch")
           end	
        GUIAction_CancelTechnology_Orig( _tech)	
		end
end


...funktioniert nun einwandfrei.

Toll.

Aber warum arbeitet die Funktion durch Fehlfunktionen aus dem ersten Beispiel?

Falls jemand eine Erklärung dafür hat, bin ich dankbar...

Gruß
Kalle

____________________
Lieber Siedeln statt (fern)sehen.....

andre111
#6
02.02.2013 22:21
Beiträge: 220

Ich habe noch eine Frage:

Wird bei GUIAction_CancelTechnology wirklich ein Parameter übergeben, da die Funktion laut der GUI Übersicht ohne Parameter aufgerufen wird.

jugl
#7
02.02.2013 22:33
Beiträge: 803

Mal ne ganz dumme Frage,
Es müsste doch Research statt Reserach heißen , oder lassen mich meine rudimentären Englischkenntnisse in Stich ?

____________________
Si tus vi late, in isse tabernit.

Noigi
#8
02.02.2013 22:37
Beiträge: 772

Zitat von Kalle:
Aber warum arbeitet die Funktion durch Fehlfunktionen aus dem ersten Beispiel?

Falls jemand eine Erklärung dafür hat, bin ich dankbar...


Ich habe Peters Code einmal ausprobiert, und er funktioniert wie gewünscht! Es kam vor, dass der zugehörige Technologie-Button nach dem Abbrechen ausgegraut war, aber durch erneutes Selektieren der Uni ließ sich das beheben. Das von dir beschriebene Phänomen hatte ich nicht.

Zitat von andre111:
Ich habe noch eine Frage:

Wird bei GUIAction_CancelTechnology wirklich ein Parameter übergeben, da die Funktion laut der GUI Übersicht ohne Parameter aufgerufen wird.


Siehe oben, prinzipiell ohne Parameter.
Auf die GUI-Liste kann man sich erfahrungsgemäß verlassen.

Noigi
#9
02.02.2013 22:38
Beiträge: 772

Zitat von jugl:
Mal ne ganz dumme Frage,
Es müsste doch Research statt Reserach heißen , oder lassen mich meine rudimentären Englischkenntnisse in Stich ?



Ganz genau, aber gestresste BB-Programmierer haben wichtigeres im Kopf als englische Rechtschreibung.
Die Funktion heißt jedenfalls tatsächlich "GUIAction_ReserachTechnology".

Kalle
#10
04.02.2013 15:49
Beiträge: 1150

... das Hauptproblem in der Funktion ist, dass wenn der Abbruch-Button gedrückt wird und eine aufgerufene Funktion wieder alle Forschungen erlaubt, dann wird die eigentlich abgebrochene Forschung fortgesetzt.

Ich musste eine Verzögerung einbauen, damit die System-Funktion durch Abbruch überhaupt eine Chance gegen das Script hatte.

Außerdem vergaß ich zu berücksichtigen, dass bei dem verbieten und/oder erlauben von Forschungen die bereits erforschten Forschungen nicht wieder "gesperrt" werden...

Jetzt habe ich nur noch ab und zu das Phänomen, dass bei beabsichtigten hin- und her von abbrechen und neu beauftragen von Forschungen es vorkommen kann, dass in einer der Uni's der Button angewählt bleibt...

Ein erneutes "abbrechen" der Forschung bringt aber nicht wieder alle Buttons ins Spiel...

____________________
Lieber Siedeln statt (fern)sehen.....

Seiten: 1

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

Impressum