Tooltipps für das Kaufen von Militäreinheiten

» Siedler Map Source Forum » Siedler DEdK Script Forum » Tooltipps für das Kaufen von Militäreinheiten

Seiten: 1

Play4FuN
#1
19.02.2014 11:40
Beiträge: 704

Tooltipps für das Kaufen von Militäreinheiten

Ich möchte die Tooltipps ändern, die für das Kaufen von Einheiten in Kaserne, Schiessanlage, Stall und Kanonengießerei nötig sind (neue für alle Einheiten!).

Dazu habe ich das gefunden:

   GUITooltip_BuyMilitaryUnit_Orig = GUITooltip_BuyMilitaryUnit
    GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
        GUITooltip_BuyMilitaryUnit_Orig(_c1,_c2,_c3,_c4,_c5)
		newString, numberOfChanges = string.gsub( _c2, "MenuBarracks/BuyLeaderSword_normal", "" )
        if numberOfChanges == 1 then
        -- ...


Das in eine Funktion und hinten dran kommt dann der Text/Tooltip mit

XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 TITEL @cr TEXT." )
XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 150 @cr Eisen: 30" )



Das funktioniert für Schwertkämpfer, Speerträger und Bogenschützen auch ohne Probleme. Auf die gleiche Art und Weise wollte ich das auch mit den TTs bei Reitern und Kanonen machen, erhalte aber im Spiel, sobald ich mit dem Cursor über IRGENDEINEN Tooltip fürs Einheit-kaufen fahre, die Fehlermeldung eines "stack overflow".

Mir ist der Syntax der GUITooltip_BuyMilitaryUnit-Tooltipps bekannt. Hier ein Beispiel für leichte Kavallerie:

GUITooltip_BuyMilitaryUnit(UpgradeCategories.LeaderCavalry,"MenuStables/BuyLeaderCavalryLight_normal","MenuStables/BuyLeaderCavalryLight_disabled", Technologies.MU_LeaderLightCavalry,"KeyBindings/BuyUnits1")



Klappt ja bei dem Fußvolk ohne Probleme - was passt hier nicht? Bitte um Hilfe!

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Fire_Bird
#2
19.02.2014 15:02
Beiträge: 719

Hast du daran gedacht, auch immer den original-Tooltip aufzurufen, wenn der aktuelle Tooltip nicht dein gewünschter ist?

Außerdem könnte es noch daran liegen, in welcher Funktion du das mit dem Tooltip machst.

Play4FuN
#3
19.02.2014 15:27
Beiträge: 704

Zitat von Fire_Bird:
Hast du daran gedacht, auch immer den original-Tooltip aufzurufen, wenn der aktuelle Tooltip nicht dein gewünschter ist?


Es ist analog zu einwandfrei funktionierenden Codes im SELBEN Prinzip.

Zitat von Fire_Bird:

Außerdem könnte es noch daran liegen, in welcher Funktion du das mit dem Tooltip machst.


Ich weiß was Du meinst, habe leider grade keine Zeit mehr, ich melde mich spätestens morgen wieder. Aber eigentlich sagt das schon alles:

GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)



____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Fire_Bird
#4
19.02.2014 15:32
Beiträge: 719

Zitat von Play4FuN:
Aber eigentlich sagt das schon alles:

GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)



Das heißt, dass du diesen Tooltiphack einfach irgendwo im Script stehen hast?

warrior1024
#5
19.02.2014 21:32
Beiträge: 345

Sieht dein Code etwa so aus?

GUITooltip_BuyMilitaryUnit_Orig = GUITooltip_BuyMilitaryUnit
GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
   --GUIHack für Kaserne
end
[...]
GUITooltip_BuyMilitaryUnit_Orig = GUITooltip_BuyMilitaryUnit
GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
   --GUIHack für Kavallerie
end



Wenn ja, dann wird die Originalfunktion in "GUITooltip_BuyMilitaryUnit_Orig" gespeichert und die Funktion für die Kaserne richtig überschrieben.

Im zweiten Teil wird die gehackte Funktion "GUITooltip_BuyMilitaryUnit" ( Mit dem Aufruf von "GUITooltip_BuyMilitaryUnit_Orig" ) erneut in "GUITooltip_BuyMilitaryUnit_Orig" gespeichert und damit ruft "GUITooltip_BuyMilitaryUnit_Orig" sich selbst auf.

Eine Lösung wäre diese:

GUITooltip_BuyMilitaryUnit_Orig_Kaserne = GUITooltip_BuyMilitaryUnit
GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
   --GUIHack für Kaserne
end
[...]
GUITooltip_BuyMilitaryUnit_Orig_Kavallerie = GUITooltip_BuyMilitaryUnit
GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
   --GUIHack für Kavallerie
end



Alternativ ginge auch folgende Comfortfunktion:http://www.siedler-maps.de/for...-Hack-leicht-gemacht-13344.htm

____________________
"Banken machen keine Fehlentscheidungen! Haben Euch das Eure Eltern nicht beigebracht?"
- Bankier Samael Silren, Enderal

Dieser Beitrag wurde von warrior1024 am 19.02.2014 um 21:51 editiert.

bobby
#6
19.02.2014 23:16
Beiträge: 393

Hier mal die genauen Namen der Parameter der Funktion:
(c1, c2, usw. ist nicht gerade übersichtlich und würde ich auch nicht verwenden)

GUITooltip_BuyMilitaryUnit(_UpgradeCategory, _NormalTooltip, _DisabledTooltip, _TechnologyType, _ShortCut)

Dementsprechend erscheint mir das string.gsub mit den "NumberOfChanges" auch nicht sehr sinnvoll...

Ich denke so können wir hier nur raten du solltest mal den gesamten Code posten

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

Play4FuN
#7
20.02.2014 10:56
Beiträge: 704

Zitat von bobby:
Hier mal die genauen Namen der Parameter der Funktion:
(c1, c2, usw. ist nicht gerade übersichtlich und würde ich auch nicht verwenden)


Richtig, den Code habe ich auch nur übernommen ("Clankrieg", auch von der SMS).

Zitat von bobby:
Ich denke so können wir hier nur raten du solltest mal den gesamten Code posten



Hier:

-- FMA ...
TT_1()
TT_2()
TT_3()
TT_4()

-- im Skript:
function TT_1()		-- Buttontooltip: Schwertkämpfer kaufen
   GUITooltip_BuyMilitaryUnit_Orig = GUITooltip_BuyMilitaryUnit
    GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
        GUITooltip_BuyMilitaryUnit_Orig(_c1,_c2,_c3,_c4,_c5)
		newString, numberOfChanges = string.gsub( _c2, "MenuBarracks/BuyLeaderSword_normal", "" )
        if numberOfChanges == 1 then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 TITEL @cr @color:255,255,255 TEXT" )
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 150 @cr Eisen: 30" )
		 end
   end
end
function TT_2()		-- Buttontooltip: Speerträger kaufen
    GUITooltip_BuyMilitaryUnit_OrigA = GUITooltip_BuyMilitaryUnit
    GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
        GUITooltip_BuyMilitaryUnit_OrigA(_c1,_c2,_c3,_c4,_c5)
		newString, numberOfChanges = string.gsub( _c2, "MenuBarracks/BuyLeaderSpear_normal", "" )
        if numberOfChanges == 1 then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 TITEL @cr @color:255,255,255 TEXT" )
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: 80 @cr Holz: 50" )
		end
	end
end
function TT_3()		-- Buttontooltip: Bogenschützen kaufen
    GUITooltip_BuyMilitaryUnit_OrigC = GUITooltip_BuyMilitaryUnit
    GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
        GUITooltip_BuyMilitaryUnit_OrigC(_c1,_c2,_c3,_c4,_c5)
		newString, numberOfChanges = string.gsub( _c2, "MenuArchery/BuyLeaderBow_normal", "" )
        if numberOfChanges == 1 then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 TITEL @cr @color:255,255,255 TEXT" )
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: xxx @cr Holz: xxx" )
		end
	end
end
function TT_4()		-- Buttontooltip: Schwere Kavalerie kaufen
    GUITooltip_BuyMilitaryUnit_OrigC = GUITooltip_BuyMilitaryUnit
    GUITooltip_BuyMilitaryUnit = function(_c1,_c2,_c3,_c4,_c5)
        GUITooltip_BuyMilitaryUnit_OrigC(_c1,_c2,_c3,_c4,_c5)
		newString, numberOfChanges = string.gsub( _c2, "MenuStables/BuyLeaderCavalryLight_normal", "" )
        if numberOfChanges == 1 then
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomText, "@color:180,180,180 TITEL @cr @color:255,255,255 TEXT" )
			XGUIEng.SetText( gvGUI_WidgetID.TooltipBottomCosts, "Taler: xxx @cr Holz: xxx" )
		end
	end
end



Ich probiere als nächstes gleich Mal den Vorschlag von Warrior aus, indem ich für die zwischengespeicherte Funktion andere Namen verwende...

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Play4FuN
#8
20.02.2014 11:06
Beiträge: 704

Okay, mit Warriors Hinweis funzt es. Habe total übersehen, dass da immernoch ein Buchstabe drann stand, eben um die zwischengespeicherte Funktion nicht erneut zu überschreiben. Naja ich denke mir, der BlackOut772 wird schon gewusst haben, wie das geht und habe das ganze KOPIERT und bearbeitet. Dabei habe ich das mit den besagten Buchstaben übersehen und schon hauts nich mehr hin.

Ich danke sehr für die Hilfe. Eins interessiert mich trotzdem noch, wie kann ich das ganze schreiben ohne dieses "numberOfChanges" - wozu hatte BlackOut772 das verwendet?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

Dieser Beitrag wurde von Play4FuN am 20.02.2014 um 13:03 editiert.

totalwarANGEL
#9
20.02.2014 14:00
Beiträge: 2123

Zitat von Play4FuN:
Ich danke sehr für die Hilfe. Eins interessiert mich trotzdem noch, wie kann ich das ganze schreiben ohne dieses "numberOfChanges" - wozu hatte BlackOut772 das verwendet?


Weil er es so aus ItM rauskopiert hat, würde ich mal vermuten.

____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.

Play4FuN
#10
20.02.2014 14:45
Beiträge: 704

@twA Das wollte ich eigentlich nicht wissen
Mir ging es darum: braucht man das? bzw. was ist mit "newstring", der (varcheck) sagt, dass das nicht gebraucht wird...!?

____________________
LG Play4FuN

Siedler DEdK Mapping + Scripting Tutorials

bobby
#11
20.02.2014 17:23
Beiträge: 393

newString, nrOfChanges = string.gsub("foo bar", "foo", "")


Im string "foo bar" wird nach "foo" gesucht und wenn gefunden durch "" ersetzt.
In newString wird der resultierende String gepseichert -> " bar"
und in nrOfChanges wie oft "foo" durch "" ersetzt wurde also 1

____________________
Tools und Verbesserungen für Siedler: settlers.pro

Neues:
Cutscene Editor
LuaDebugger v0.5.2

Seiten: 1

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

Impressum