Construction Set Skriptthread zum Construction Set

Ich hab da noch ne Frage: Wenn ich das Gold eines Händlers durch "SetBarterGold" verändere, wird diese Veränderung wieder rückgängig gemacht, sobald ich die Mod deaktiviere oder bleibt diese Änderung auch nach Deaktivierung der Mod im Save erhalten?

Edit: @Diarrhoe: Zeitgleich geschrieben :D . Mh, schade, nunja, dann werde ich das ganze im CS machen. Der Tipp mit den Septimen ist übrigens gut, hätte ich glatt vergessen.
 
Zuletzt bearbeitet:
Da bin ich ehrlich gesagt überfragt. Müsstest du mal ausprobieren, bzw. gucken, wo es im CS angewendet wird. Ich kann mir aber nicht vorstellen, dass das Spiel bei der Deaktivierung der Mod genau diese Änderung wieder rückgängig macht. Eventuell ist dies aber ein Befehl, der sowieso nur bis zum Ende der laufenden Spielsession läuft und bei jedem Spielstart neu ausgeführt werden muss.

Wo ich gerade darüber nachdenke ist, wird der Befehl möglicherweise bei der Kapitalerhöhung der Händler durchgeführt, die man als Experte im Handelsgeschick machen kann (sage ich mal so, ich war nie so weit in dieser Fertigkeit). Dann müsste das eine permanente Änderung sein.
 
  • Like
Reaktionen: bjoernret
Ok, dann werde ich das mal weiter recherchieren.

Für den Fall, dass der Befehl dauerhaft ist: Es ist doch bestimmt möglich eine Liste zu erstellen und die HändlerRefs mit dem zugehörigen Standardhandelsgold in diese Liste einzufügen (Vielleicht auch zwei Listen: Eine für die HändlerRefs und eine für das Standardhandelsgold, zusammengehörige nehmen immer denselben Listenplatz ein). So kann man die Werte ja speichern und wiederherstellen.

Das zu scripten übersteigt aber leider im Moment noch meine Fertigkeiten. Wäre super, wenn das jemand machen könnte oder mir ein Tutorial verlinken würde, wo beschrieben wird, wie das geht :)
 
Für Arrays benötigst du auf jeden Fall OBSE, dazu gibts ein Tutorial im CS-Wiki. Aber eventuell kannst du auch betreffende Händler mit einem permanenten Skripteffekt belegen, der diese Informationen verwaltet. Und ich könnte mir auch schmutzige Tricks für eine vorher festgelegte maximale Anzahl an Händlern vorstellen. Aber OBSE ist definitv eleganter.
 
  • Like
Reaktionen: bjoernret
Ich hab ein Problem mit Wartezeiten und durch Timer ausgelösten Ereignissen. Es kommt nicht oft vor, ist aber etwas unschön. Im konkreten Fall:

Wenn ich ein Ereignis habe das nach einer bestimmten Wartezeit ("kommt übermorgen wieder" etc.) ausgelöst werden soll kann es passieren, daß ein anderes zeitabhängiges Ereignis aufschlägt (z.B. der wöchentliche Einnahmenbericht der Castle Seaview Farms) und dann das questrelevante Ereignis nicht auslöst. Das Problem ist wahrscheinlich dem einen oder anderen vertraut.

Gibts einen Weg dieses Problem zu umgehen?

Und bevor jemand fragt: Mein Warteskript ist an sich ziemlich 08/15 und sieht so aus:
Code:
Scn A67HQ01Script

short Tag
float Zeit
short Start      ; von 1 bis 9, so bald > 0 startet Wartezeit, Wert von Start auch Tage die gewartet werden sollen
short Auswahl  ; Wert der Stage die hochgesetzt werden soll

Begin GameMode

if Start > 0 && Start < 10
   set Zeit to GameHour
   set Tag to (GameDaysPassed + Start)
   set Start to 10
endif

if Start == 10
   if GameDaysPassed >= Tag
      if GameHour > Zeit
      set Start to 0
      SetStage A67HQ01 Auswahl
      endif
   endif
endif

End
Da ich es innerhalb der selben Queste mehrfach verwende setze ich jeweils Start und Auswahl an anderer Stelle, aber das Prinzip ist das selbe jedes anderen Wartescripts.
 
Wenn Du ein weiteres Skript am Laufen hast, das ebenfalls die Tage überprüft und beide Ereignisse zur selben Zeit eine Stage auslösen, kann natürlich immer nur ein Tagebucheintrag angezeigt werden. Aber das betrifft nur das Öffnen des Tagebuchs. Die Stages werden in beiden Fällen gesetzt, nur bekommt ein Spieler die kurze Meldung des verschluckten Updates möglicherweise nicht mit.

Was ist das questrelevante Ereignis? Wird die Stage erst gar nicht gesetzt, oder wird in einem anderen Skript diese Stage als Bedingung für das Ereignis benutzt und läuft das etwa nicht?
 
Meinst du damit den Dialogtext, der nach zwei Tagen Warten erscheint? Wenn du da deinem Text Vorrang geben willst, musst du die Priorität der Quest hochstellen, höher als die der anderen.
 
Wenn Du ein weiteres Skript am Laufen hast, das ebenfalls die Tage überprüft und beide Ereignisse zur selben Zeit eine Stage auslösen, kann natürlich immer nur ein Tagebucheintrag angezeigt werden. Aber das betrifft nur das Öffnen des Tagebuchs. Die Stages werden in beiden Fällen gesetzt, nur bekommt ein Spieler die kurze Meldung des verschluckten Updates möglicherweise nicht mit.

Was ist das questrelevante Ereignis? Wird die Stage erst gar nicht gesetzt, oder wird in einem anderen Skript diese Stage als Bedingung für das Ereignis benutzt und läuft das etwa nicht?
In meiner Mod läuft nur der eine Timer. Die andere Meldung kommt aus einer anderen Mod. Im konkreten Fall: Ich sprechen jemanden Sonntags an und er sagt mir ich solle übermorgen wiederkommen. Ich warte also 2x 24 Stunden mit der Wartefunktion bis zum Dienstag. Das Spiel merkt dann zunächst mal es ist Dienstag und bringt mir dann den Report über die wöchentlichen Einnahmen der aus dem anderen Mod immer Dienstags fällig ist. Eine direkte Verbindung zwischen den Mods oder den jeweiligen Ereignissen gibt es nicht. Die Meldung "ich sollte noch mal mit XYZ reden" die durch meinen Timer (als Questlogeintrag) eingeblendet werden soll erscheint nicht und die Queststage wird überhaupt nicht gesetzt.

Diarrhoe schrieb:
Meinst du damit den Dialogtext, der nach zwei Tagen Warten erscheint? Wenn du da deinem Text Vorrang geben willst, musst du die Priorität der Quest hochstellen, höher als die der anderen.
Und damit ist es dann wirklich schon getan? Kann das Leben wirklich so einfach sein?
 
Achso... die Queststage wird gar nicht erst gesetzt? Ich dachte du spricht die Person an, aber stattdessen erscheint ein Dialog aus einer anderen Mod. Das ist dann in er Tat seltsam und sollte nicht passieren.
 
Ja, die Stage wird wirklich nicht geschaltet. Das selbe Problem hatte ich auch als ich Saphirias Romance gespielt hab. Da gibt es ja so einige Ereignisse die davon abhängig sind wie lange Saphiria einen schon begleitet und irgendwann wurde auch eins nicht ausgelöst und die Romanze ging nicht weiter. Evtl. ist es auch kein generelles Problem sondern hat irgendwie damit zu tun wie bei Castle Seaview Farms die wöchentlichen Produktionsberichte implementiert sind. Allerdings gab es auch beim Betatest einmal dieses Problem ohne CSV Famrs und ließ sich anschließend nicht mehr reproduzieren.

Für den Moment kommt erst mal ein entsprechender Hinweis in die ReadMe und wir sehn mal weiter ob bei den Spielern irgendwelche vergleichbaren Probleme auftreten. Das Problem scheint ja wohl nicht ganz einfach einzugrenzen zu sein und ist oft auch nicht reproduzierbar. Ob sich das jemals exakt bestimmen - und abstellen lässt - ist für mich noch nicht absehbar. Da die Mod an sich absolut spielbar ist hau ich es raus wie es ist, hoffe auf's beste , und bereite mich auf's schlimmste vor. :D
 
Tach

Nach längerer auszeit wollte ich mich mal wieder an ein mod für oblivion schmeißen....
und hab bemerkt das ich in sachen scripting irgentwie sogut wie nix mehr auf die reihe kriege!
(woll ZU lang nichts mehr mit oblivion zutun gehabt... :oops: )

Folgendes: Ein NPC hat ein Item in seinem Inventar.
Sobald der Spieler denn NPC anspricht soll, statt des gesprächs, das item in dessen inventar aktieviert werden.
sobald das item "deaktieviert" (geschlossen) wird, endet auch das "gespräch". (also im grunde kommt es erst garnicht zu einem gespräch)

hoffe das mir jemand helfen kann.
 
Ich bezweifle mal spontan, dass man Items im Inventar aktivieren kann, einmal davon abgesehen, dass es im Inventar nicht unbedingt eine Ref hat. Ich habe allerdings auch lange nicht mehr intensiv gemodded, also gebe ich darauf keine Garantie. ;)

Ein Skript auf dem NPC sollte es allerdings auch tun:
Code:
begin onActivate player

if ( getItemCount ItemID >= 1 )
  ;mache etwas
endif

end
 
  • Like
Reaktionen: Lightknight
Könntet ihr mir nochmal bei einem Skript helfen?

Ich möchte eine größere Anzahl von Gegenständen für einen Questgeber einsammeln. Wenn ich sie alle eingesammelt und an den Questgeber abgegeben habe, soll die Abschluss-Stage steigen und die Quest beendet werden. Ich weiß, dass es am besten über eine Variable geht, die zum richtigen Zeitpunkt hochgesetzt wird. Als Variable habe ich mal den Begriff "Anzahl" gewählt.
Ich habe dafür dieses Quest-Skript hier geschrieben:

PHP:
scn meinQuestScript

short DoOnce
short Anzahl

begin GameMode
	If DoOnce == 0		
		player.additem aaFlugblatt 1
  		Messagebox "blablabla."
		Set DoOnce to 1
	endif

	if GetStage MeineQuest == 20
		if Anzahl < 0
			set MeineQuest.Anzahl to MeineQuest.Anzahl + 1
			setstage MeineQuest 30
		endif
	endif
End


Wie erwartet tut sich nichts, nachdem ich alle Gegenstände an den Questgeber abgegeben habe.
Würdet ihr bitte mein Skript korrigieren und evtl. ergänzen?
Vielen Dank schon mal im voraus.

Grüße
Arielle
 
Wieso nicht alles im Dialog mit dem Questgeber erledigen? Ein Topic mit zwei Infos, können auch zwei Greetings sein. Eine fragt über Bedingungen ab ob der Spieler die Gegenstände bei sich hat, die andere Info hat eben die gegenteiligen Bedingungen. Je nachdem gibts eben die eine, oder andere Antwort. Hat der Spieler das Zeug, setzt das Result der positiven Info die Stage hoch und nimmt dem Spieler die Gegenstände weg. Das geht ganz ohne Skript, nur mit entsprechenden Bedingungen im Dialog und ein paar Resultbefehle.
 
PHP:
scn meinQuestScript

    if GetStage MeineQuest == 20
        if Anzahl < 0
            set MeineQuest.Anzahl to MeineQuest.Anzahl + 1
            setstage MeineQuest 30
        endif
    endif
End


Wie erwartet tut sich nichts, nachdem ich alle Gegenstände an den Questgeber abgegeben habe.
Würdet ihr bitte mein Skript korrigieren und evtl. ergänzen?
Frage: Setzt du von anderer Stelle aus deine Anzahl Variable? Wenn nicht ist es klar, daß nichts passiert, denn der Wert von "Anzahl" ist zunächst mal exakt 0, solange du es nicht irgendwo änderst. Damit kann die Bedingung "< 0" nicht erfüllt werden.

Außerdem nehme ich an, daß meinQuestScript an der MeineQueste als Questscript eingebunden ist? Falls ja könntest du auch statt MeineQueste.Anzahl auch einfach nur Anzahl schreiben. Du bewegst dich ja innerhalb des Scripts in dem die Variable definiert wird, also musst du dem Spiel an der Stelle nicht extra sagen wo es die Variable zu suchen hat.
 
@Beolo
Diese Variante rentiert sich nur, wenn es wenige Gegenstände sind, die ich dem Questgeber übergeben muss. Wenn ich z.B. 6 Äpfel sammeln und auf einmal übergeben soll, dann könnte ich das über die Abfrage GetItemCount im entsprechenden Result des Dialogs regeln.
Im meinem Falle sind es ein paar Dutzend Gegenstände, die der Questgeber begehrt und die man im Laufe des Spiels, wenn man sie findet, nach und nach an ihn abgeben kann. Dabei spielt die Reihenfolge keine Rolle. Ich möchte nur erreichen, dass das Spiel erkennt, wann der letzte begehrte Gegenstand abgegeben wurde.

@Andy
Da hast du natürlich Recht, meinQuestScript ist an der MeineQueste als Questscript eingebunden. Da reicht ein set Anzahl to 1. Was mich jetzt zu der nächsten Frage führt. Von welcher Stelle aus könnte ich die Variable Anzahl setzen? Könnte es bereits im Greeting geschehen, wenn man den Auftrag erhält?
 
@Andy
Da hast du natürlich Recht, meinQuestScript ist an der MeineQueste als Questscript eingebunden. Da reicht ein set Anzahl to 1. Was mich jetzt zu der nächsten Frage führt. Von welcher Stelle aus könnte ich die Variable Anzahl setzen? Könnte es bereits im Greeting geschehen, wenn man den Auftrag erhält?
Da sollte mit einem "set MeineQueste.Anzahl to 1" im Result Script eines Topics problemlos gehen und ich wüsste nicht, daß sich in der Hinsicht Greetings irgendwie von anderen Topics unterscheiden würden, also müsste es eigentlich funktionieren.
 
Da sollte mit einem "set MeineQueste.Anzahl to 1" im Result Script eines Topics problemlos gehen und ich wüsste nicht, daß sich in der Hinsicht Greetings irgendwie von anderen Topics unterscheiden würden, also müsste es eigentlich funktionieren.

Hab ich gemacht, aber die Quest wird nicht beendet nach Aushändigung aller Items. Irgendwo muss noch ein Fehler drin sein. Habt ihr noch eine Idee, was ich da machen könnte?
 
Wie genau sieht dein Script jetzt aus, und was soll bei welcher Stage der Queste passieren? Och zumindest kann da ohne ein paar mehr Details wenig zu sagen, fürchte ich.