Gebäudepreise reduzieren

» Siedler Map Source Forum » Siedler DEdK Script Forum » Gebäudepreise reduzieren

Seiten: 1

Anarki
#1
17.05.2010 20:43
Beiträge: 518

Gebäudepreise reduzieren

In meinem Völkermod hätte ich gerne integriert, dass für bestimmte Völker bestimmte Gebäude Kostenreduziert sind.

'Gelöst' habe ich das über eine 'Rückbuchung' von Ressourcenkosten bei einem Triggerevent OnEntityCreated.

Naja, Gelöst ist es dadurch leider nicht... weil:
Wenn man eben nicht zumindest die alten Kosten auf dem Konto hat, kann man das Gebäude ja garnicht bauen.

Nach einigem forschen fürchte ich hier nicht weiter zu kommen. Ich könnte es durch einen GUI Hack mit GUI.ActivatePlaceBuildingState(12) gerade noch schaffen zumindest die Platzierung des Gebäudes anzeigen zu lassen. Platzieren kann ich es trotzdem nicht ohne Meldung - und ausserdem erscheint das Gebäude auf jedenfall Rot (nicht platzierbar), wenn nicht die vorgegebenen Ressourcen auf meinem Konto sind.

Jemand damit schon Erfahrung? Vielleicht hat ja zufällig jemand die Lösung parat.

Hier im Forum finde ich auch nix
Naja, mal sehen wie ich 'das Problem' in den Griff bekomme. Fürchte ich muss da wohl eher die Regeln umschreiben bezüglich 'man muss eben die alten Resourcen haben'

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Dieser Beitrag wurde von Anarki am 17.05.2010 um 20:55 editiert.

Kalle
#2
17.05.2010 22:08
Beiträge: 1150

... vielleicht weiß Noigi was. Ich bin mir aber sicher, darüber irgendwo was gelesen zu haben. Es gibt ein Table mit den Kosten für Gebäude. Und wenn man weiß, wie das bestückt wird, müsste das doch die Lösung sein, oder?

Und der eine oder andere Mapper hat doch bestimmt schon an den "Kosten" für ein Gebäude rumgespielt.

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

Noigi
#3
17.05.2010 22:11
Beiträge: 772

Ich kenne mich leider nur mit veränderten Ausbaukosten aus. Da gehts so: Man bei einem entsprechenden Button-Klick einfach manuell überprüfen (zB mit SubFromPlayersResources) ob die (verbilligten) Kosten vorhanden sind, wenn ja wird dem Spieler die Differenz per Add... gutgeschrieben und danach die Original-Ausbaufunktion aufgerufen.

Das Problem beim Bauen ist, dass der Buttonklick und das Rohstoffbezahlen nicht zeitgleich stattfinden. Das Platzieren löst allem Anschein nach keine GUI-Funktion aus, so dass man diesen Moment nicht abfangen kann.

Du könntest höchstens beim Buttonklick provisorisch die Rohstoffbeträge gutschreiben, um die der Bau verbilligt wurde, und dann ggf wieder abziehen, wenn der Spieler das Gebäude doch nicht baut - also wenn der GUI-State nicht mehr "PlaceBuilding" (oder so) ist, aber auch keine entsprechende Gebäudeentity des Spielers erstellt wurde.
Ich kann mir aber vorstellen, dass diese Methode im MP leicht "exploitbar" ist.


@Kalle:
Der einzige Baukostentable, den ich kenne, ist nur für die Kostenkomponente von Tooltips zuständig. Wenn es da doch noch was anderes gibt, könnte das natürlich eine Lösung sein.

Kalle
#4
17.05.2010 22:14
Beiträge: 1150

... naja, ich hab gerade mal gesucht. Bisher habe ich nur die Logic.FillBuildingCostsTable gefunden. Aber keinen weiteren Ansatz dafür...

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

Anarki
#5
17.05.2010 22:47
Beiträge: 518

Zitat von Noigi:

Du könntest höchstens beim Buttonklick provisorisch die Rohstoffbeträge gutschreiben, um die der Bau verbilligt wurde, und dann ggf wieder abziehen, wenn der Spieler das Gebäude doch nicht baut


An so eine Lösung habe ich auch schon gedacht... also gutschreiben, aber dann zusätzlich auch noch das GUI-Update der Rohstoffanzeige 'hacken', damit die 'Mehrresourcen' nicht angezeigt werden.

Zum Thema Multiplayer-tauglich... ja, also es könnte klappen, weil es noch nicht zum Desync führt, wenn die Ressourcen 'Lokal verändert' werden, sondern erst wenn eine Aktion ausgeführt wird, die auf den anderen Rechnern 'nicht machbar erscheint'.
Aber genau hier fragt sich nun eben, ob der Bau eines Gebäudes, wodurch der Spieler ja kurz ins 'minus' rutscht bei den Resourcen, eine Desycnmeldung zu Folge hat.

Probieren geht wohl über philosophieren.
So langsam hab ich dann wohl sämtliche GUI's hacken müssen für mein Skript

Schade dass es wohl tatsächlich nicht einfacher geht

Der Ideenansatz ist ein Simple-Hi-Ress-Job, der per WENN-DANN Bedingung den GUI-State abfragt - und solange der GUI-State auf Placebuilding ist eben 'virtuell' XXX Material gutgeschrieben ist.
Mh, dazu bräuchte ich aber wohl auch dringend eine Abfrage 'welches Gebäude' gerade gebaut werden soll.
Knifflig...
aber vielleicht mit einem Hack der im Startbeitrag genannten Funktion GUI.ActivatePlaceBuildingState(_building) machbar

-------------
Der Logic.FillBuildingCostTable(_building,_t) scheint wohl nur zum Einlesen von Gebäudekosten gut zu sein, hab ich schon rumexperimentiert. In ItM wird das ja auch genutzt.
Den Upgrade-Button kann man recht easy hacken per Hack der Upgrade-Selected-Building (also des Callbacks).
'Ähnlich' habe ich bei meinem Hauptquartier den Abrissbutton 'Anzeigen' lassen und dann gehackt, damit die zweite Volksfähigkeit der Germanen auch im HQ aktiviert werden kann.

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Dieser Beitrag wurde von Anarki am 17.05.2010 um 22:54 editiert.

Anarki
#6
18.05.2010 01:00
Beiträge: 518

Klappt eigentlich ganz gut mit den 'virtuellen Ressourcen'

Ein Hack der GUIUpdate_ResourceAmount und GUIAction_PlaceBuilding und dabei Erzeugung virtueller Resourcen hat erstmal genügt.

Beim Hack der GUIUpdate_ResourceAmount hab ich aber ein Problem.
Beim Beispiel hier:
XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(),GetClay() - 200)

Wird dann der Lehm-Text 'in der Mitte angezeigt'

Wie bekomme ich den nach rechts wo er hingehört?

In ItM hab ich die Funktion bei anderem Einsatz mit @center vermerkt gesehen. @right funktioniert leider nicht, mhh...
XGUIEng.SetText(XGUIEng.GetCurrentWidgetID(),"@center Burg"

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Noigi
#7
18.05.2010 01:09
Beiträge: 772

@ra

(für "right anchor"

nevermind
Siedler Map Source Admin (Web)
#8
18.05.2010 01:37
Beiträge: 483

So wie sich das anhört, ist die Lösung nicht für den Mehrspielermodus geeignet.
Wenn ein Spieler auf einen Button klickt und ihm dann "virtuelle Ressourcen" gutgeschrieben werden, wie stellst du dann sicher, dass dies auch bei allen anderen beteiligten Spielern passiert? Ein AddGold() muss bei JEDEM Spieler ausgeführt werden. Ein Knopfdruck passiert jedoch nur lokal bei EINEM Spieler.
Im ungünstigen Fall wird das Gebäude dann bei dir gebaut, bei allen anderen aber nicht -> DESYNC.

____________________
LUA_ERRSYNTAX: [string "?"]:1: `=' expected near `<eof>'

Anarki
#9
18.05.2010 09:46
Beiträge: 518

Zitat von nevermind:
So wie sich das anhört, ist die Lösung nicht für den Mehrspielermodus geeignet.
(...)
Im ungünstigen Fall wird das Gebäude dann bei dir gebaut, bei allen anderen aber nicht -> DESYNC.



So ist meine Befürchtung. Ich weiss nicht warum genau 'ich das Gefühl habe' dass es trotzdem klappen könnte.
Mein Gefühl, dass es klappen könnte, liegt daran, dass ja eine zehntel Sekunde nach dem Bau 'die virtuellen Resourcen' wieder verschwinden - und der Spieler nicht ins Minus rückt.

Die Gebäudeverbilligung ist über einen 'Payback On Entity Created' geschafft, heisst also auf allen anderen Rechnern müsste das Gebäude aber auf jedenfall erstmal erschaffen werden.

Natürlich gäbe es in diesem Fall auch wieder die Möglichkeit, die virtuellen Resourcen per 'PayTribute(a,b)' auf allen Rechnern gutzuschreiben. Allerdings klappt es dann wohl nicht, die Resourcen 'schnell genug' wieder abzuziehen, falls der Spieler auf einen anderen Gebäudebau-Knopf drückt.

Naja, das Skript habe ich mal soweit, war nicht allzuviel Umstand. Verfeiern werd ich das wohl erst wenn der MP-Test bestanden ist.

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Seiten: 1

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

Impressum