Construction Set Skriptthread zum Construction Set

Code:
Scriptname MeinBegleiterMod ;Typ QuestScript

short SaphiriaMakePotion
float SaphiriaPotionMakingTimer
short SaphiriaHasGotAPotionInProgress
short SaphiriaShouldMakeAPotion
short TrankTimer
short TrankTimerStart
short TrankStart
short TrankMessage


begin GameMode

if SaphiriaMakePotion == 1 ; Wir vom Dialog Brau mir einen Trank ausgeworfen.
    if SaphiriaHasGotAPotionInProgress != 1 && SaphiriaShouldMakeAPotion != 1
        set SaphiriaPotionMakingTimer to 15
        set SaphiriaHasGotAPotionInProgress to 1
        set SaphiriaShouldMakeAPotion to 1
        SaphiriaRef.AddItem MortarPestle 1
        SaphiriaRef.AddScriptPackage SaphiriaAlchemy
    else
        if SaphiriaPotionMakingTimer >= 0
            set SaphiriaPotionMakingTimer to SaphiriaPotionMakingTimer - GetSecondsPassed
        else
            set SaphiriaHasGotAPotionInProgress to 0
            set SaphiriaShouldMakeAPotion to 0
            SaphiriaRef.StartConversation Player, SaphiriaTrankFertig ;Wirft "set TrankTimerStart to 1 aus"
            SaphiriaRef.removeItem MortarPestle 1
        endif
    endif
endif
else
endif

; Bis hier funktioniert das Script einwandfrei.

if TrankTimerStart == 1
    set TrankTimerStart to -1
    set TrankTimer to 10
    Message "In 10 Tagen kann Saphiria wieder einen Trank brauen."

elseif TrankTimerStart == -1

    if TrankTimer > 0
        set TrankTimer to ( TrankTimer - GameDaysPassed )
    endif

    if TrankMessage == 0
    if TrankTimer <= 8
        Message "In 8 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 1
        endif
    
    elseif TrankMessage == 1
    if TrankTimer <= 6
        Message "In 6 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 2
        endif     

    elseif TrankMessage == 2
    if TrankTimer <= 4
        Message "In 4 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 3
        endif    

    elseif TrankMessage == 3
    if TrankTimer <= 2
        Message "In 2 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 4
        endif    

    elseif TrankMessage == 4
    if TrankTimer <= 2
        Message "Saphiria kann wieder einen Trank brauen."
        set TrankMessage to 0
            set TrankTimerStart to 0
        endif

    endif    

endif  

end

Nicht getestet, aber so im Überblick sollte es gehen... :D
 
Ich würde an das "Brau mir einen Trank" Topic einfach noch eine zusätzliche Condition anhängen, die entwerder eine Questvariabel oder eine GlobalVariabel wie TrankTimerRunning, die, sobald der Timer startet auf 1 gesetzt wird, und erst nach Ablauf wieder auf 0 und so das Topic freigibt.
 
@LordKain
Super, Danke. Werde dein Script sofort testen.



@AjAeXx
Leider funktioniert der Timer nicht. Die zweite Message wird nach einem Tag nicht ausgegeben. Um das mit dem Topic werde ich mich sofort nach dem der Timer läuft kümmern. Da habe ich bestimmt noch Fragen an dich.;)

Bin gleich zurück. Eben testen. (Man wenn das funktioniert, trinke ich mir gleich ein Bier. Sitze echt schon seit drei Tagen an dem sche*###.)
 
@LordKain

Habe dein Script ausprobiert. Die Meldungen kommen im Sekundentakt hintereinander. Sollte ja eigentlich 10 Tage dauer. ;)

Kannst du da was ändern?
 
Code:
Scriptname MeinBegleiterMod

short SaphiriaMakePotion
float SaphiriaPotionMakingTimer
short SaphiriaHasGotAPotionInProgress
short SaphiriaShouldMakeAPotion

float TrankTimer
short TrankTimerStart
short TrankMessage

begin GameMode

[...] // hab das obere jetzt mal weggelassen, kopier es einfach rein

; ***
; Anzeigen
; ***

if (TrankTimerStart == 1)
    set TrankTimerStart to -1
    set TrankTimer to 10
    Message "In 10 Tagen kann Saphiria wieder einen Trank brauen."
endif

if (TrankTimerStart == -1)

    set TrankTimer to TrankTimer - GameDaysPassed

    if (TrankMessage == 0 && TrankTimer <= 8)
        Message "In 8 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 1

    elseif (TrankMessage == 1 && TrankTimer <= 6)
        Message "In 6 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 2

    elseif (TrankMessage == 2 && TrankTimer <= 4)
        Message "In 4 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 3

    elseif (TrankMessage == 3 && TrankTimer <= 2)
        Message "In 2 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 4

    elseif (TrankMessage == 4 && TrankTimer <= 0)
        Message "Saphiria kann wieder einen Trank brauen."
        set TrankMessage to 0
        set TrankTimerStart to 0
    endif

endif

end
 
:cry::cry::cry:

Habe es hineinkopiert. Der Ablauf ist absolut so wie er sein soll. Nur dauert es keine 10 Tage.

Die Messages kommen hintereinader im Sekundentakt. Ich versteh das nicht.:huh:




if (TrankTimerStart == 1)
set TrankTimerStart to -1
set TrankTimer to 10
Message "In 10 Tagen kann Saphiria wieder einen Trank brauen."
endif
if (TrankTimerStart == -1)
set TrankTimer to TrankTimer - GameDaysPassed
if (TrankMessage == 0 && TrankTimer <= 8)
Message "In 8 Tagen kann Saphiria wieder einen Trank brauen."
set TrankMessage to 1
elseif (TrankMessage == 1 && TrankTimer <= 6)
Message "In 6 Tagen kann Saphiria wieder einen Trank brauen."
set TrankMessage to 2
elseif (TrankMessage == 2 && TrankTimer <= 4)
Message "In 4 Tagen kann Saphiria wieder einen Trank brauen."
set TrankMessage to 3
elseif (TrankMessage == 3 && TrankTimer <= 2)
Message "In 2 Tagen kann Saphiria wieder einen Trank brauen."
set TrankMessage to 4
elseif (TrankMessage == 4 && TrankTimer <= 0)
Message "Saphiria kann wieder einen Trank brauen."
set TrankMessage to 0
set TrankTimerStart to 0
endif
endif
 
Zuletzt bearbeitet:
@LordKain

Ja habe ich. Es ist wie ein Countdown im Sekundentakt. Für mich sieht das Script absolut richtig aus. Die Messages kommen alle hintereinander.:cry:

Ich habe bei TrankTimer beides versucht. 1x als short und 1x als float.
 
hmm, dreht die if-abfrage mit dem tranktimer doch einfach um. also statt:

if tranktimer <= 8 ...
elseif tranktimer <= 6 ...
elseif tranktimer <= 4 ...
elseif tranktimer <= 2 ...
usw.

wenn der tranktimer z.b. 3 ist, trifft ja schon die erste bedingung immer zu...

dafür einfach:

if tranktimer <= 0 ...
elseif tranktimer <= 2 ...
elseif tranktimer <= 4 ...
elseif tranktimer <= 6 ...
usw.

bei tranktimer=3 würden dann die ersten 2 bedingungen nicht passen, und das script würde auch bei der richtigen bedingung ankommen ;)
(wobei, wenn der timer z.b. 3 tage beträgt, wird ja trotzdem eine meldung mit 4 tagen ausgegeben. soll das so sein, oder wird das noch abgestuft?)
 
@Naboradd: Wir reden hier schon über das gleiche Skript, oder?
Die TrankMessage-Vars sind da nicht umsonst drin... ;)

Und mal allgemein: Das System mit den GameDaysPassed zählt NICHT vollständige Tage, sondern immer Bruchteile davon, daher benutzt man ja auch eine float-Variable.
Also nicht 1 oder 2 oder 3...
Sondenr z.B. 0.0234 oder 0.1234 oder 1.4563...
 
Ich habe nun statt - einmal + versucht.
PHP:
if (TrankTimerStart == 1) 
	set TrankTimerStart to -1 
	set TrankTimer to GameDaysPassed + 10 
	Message "In 10 Tagen kann Saphiria wieder einen Trank brauen." 
endif 
if (TrankTimerStart == -1) 
	set TrankTimer to (TrankTimer + GameDaysPassed) 
		if TrankTimer == 2 
			Message "In 8 Tagen kann Saphiria wieder einen Trank brauen." 
		elseif TrankTimer == 4 
			Message "In 6 Tagen kann Saphiria wieder einen Trank brauen." 			 
		elseif TrankTimer == 6 
			Message "In 4 Tagen kann Saphiria wieder einen Trank brauen." 
		elseif TrankTimer == 8 
			Message "In 2 Tagen kann Saphiria wieder einen Trank brauen." 			
		elseif TrankTimer >= 10 
			Message "Saphiria kann wieder einen Trank brauen." 			
			set TrankTimerStart to 0 
		endif 
endif

Hat aber auch nicht geklappt. Habe wieder das Script von LordKain genommen. Der Ablauf stimmt ja, nur die Zeit eben nicht. Die Meldungen rattern so runter.
 
Zuletzt bearbeitet:
@Naboradd: Wir reden hier schon über das gleiche Skript, oder?
Die TrankMessage-Vars sind da nicht umsonst drin... ;)

ja, ich denke schon... :roll:

allerdings kann das mit deinen trankmessages so logisch garnicht funktionieren.

PHP:
if (TrankTimerStart == 1)
    set TrankTimerStart to -1
    set TrankTimer to 10
    Message "In 10 Tagen kann Saphiria wieder einen Trank brauen."
endif

if (TrankTimerStart == -1)
    set TrankTimer to TrankTimer - GameDaysPassed
    if (TrankMessage == 0 && TrankTimer <= 8)
        Message "In 8 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 1
    elseif (TrankMessage == 1 && TrankTimer <= 6)
        Message "In 6 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 2
    elseif (TrankMessage == 2 && TrankTimer <= 4)
        Message "In 4 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 3
    elseif (TrankMessage == 3 && TrankTimer <= 2)
        Message "In 2 Tagen kann Saphiria wieder einen Trank brauen."
        set TrankMessage to 4
    elseif (TrankMessage == 4 && TrankTimer <= 0)
        Message "Saphiria kann wieder einen Trank brauen."
        set TrankMessage to 0
        set TrankTimerStart to 0
    endif
endif
1. durchlauf: nur die obere if-anweisung wird ausgeführt, tranktimerstart wird auf -1 gesetzt, tranktimer auf 10. meldung 10 tage.

2. durchlauf: jetzt ist die untere if-anweisung gültig, tranktimer wird auf irgend einen (wahrscheinlich) negativen wert gesetzt, je nachdem, wie lange man das spiel bereits spielt (gamedayspassed -> wie viele tage in dem aktuellen spiel bereits vergangen sind)
sobald man also bereits länger als 2 tage im spiel verbracht hat, trifft dann sofort die bedingung der 2. if-abfrage zu (msg=0, timer<8). meldung 8 tage. msg wird auf 1 gesetzt.

3. durchlauf: vom tranktimer werden wieder die insgesamt gespielten tage abgezogen, d.h. der wert rutscht immer weiter ins negative. erstes elseif trifft auch zu (msg wurde davor grad auf 1 gesetzt, tranktimer ist schon weit unter 6). meldung 6 tage. msg wird auf 2 gesetzt (und damit wird sofort die bedingung fürs nächste elseif erfüllt)

usw.

wie oft werden solche gamemode-scripts durchlaufen? 1x pro sekunde? würde die im sekundentakt durchratternden meldungen erklären ;)

2 sachen: zum einen sollte man den tranktimer innerhalb der schleife nicht verändern, sonst verändert man immer wieder die grundlage des scripts, und zum anderen sind meinermeinung nach diese trankmessages unnötig/störend. sie würden nämlich auch verhindern, daß die meldung mehr als 1 mal ausgegeben werden kann (du fragst am tag4 den stand ab, bekommst eine meldung, spielst also erstmal weiter. nächste abfrage später am tag4 oder an tag5, das script gibt aber keinen mucks von sich, die meldung für tag4 ist bereits raus, nächsten hinweis gibts erst wieder an tag6...)

ich versuch mal, das script entsprechend umzustellen, so daß es funktionieren müsste, einen moment...
 
@Naboradd

Gerne, ich bin für jede Hilfe dankbar.

Die Messages kann man ja später reduzieren. Sie dienen ja auch der Kontrolle, ob das Script funzt. Sonst müsste ich immer 10 Tage warten :eek: :shock:

Thanx trotzdem an alle die sich die Mühe machen zu helfen.
 
Ich hatte den Aufbau der GameDayPassed-Var wohl so in der Schnell etwas anders in Erinnerung gehabt, das erklärt aber das Problem.

Probier mal das:

Code:
[COLOR=#000000][COLOR=#007700]
short TrankTimerEnd // neue Extravariable

if ([/COLOR][COLOR=#0000bb]TrankTimerStart [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700]) 
    [/COLOR][COLOR=#0000bb]set TrankTimerStart to [/COLOR][COLOR=#007700]-[/COLOR][COLOR=#0000bb]1 
    set TrankTimerEnd to GameDaysPassed + 10 
    Message [/COLOR][COLOR=#dd0000]"In 10 Tagen kann Saphiria wieder einen Trank brauen." 
[/COLOR][COLOR=#007700]endif 

if ([/COLOR][COLOR=#0000bb]TrankTimerStart [/COLOR][COLOR=#007700]== -[/COLOR][COLOR=#0000bb]1[/COLOR][COLOR=#007700]) 
    [/COLOR][COLOR=#0000bb]set TrankTimer to TrankTimerEnd - GameDaysPassed
[/COLOR][/COLOR][COLOR=#000000][/COLOR][COLOR=#000000][COLOR=#007700]if ([/COLOR][COLOR=#0000bb]TrankMessage [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]0 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000bb]TrankTimer [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]8[/COLOR][COLOR=#007700]) 
        [/COLOR][COLOR=#0000bb]Message [/COLOR][COLOR=#dd0000]"In 8 Tagen kann Saphiria wieder einen Trank brauen." 
        [/COLOR][COLOR=#0000bb]set TrankMessage to 1 
    [/COLOR][COLOR=#007700]elseif ([/COLOR][COLOR=#0000bb]TrankMessage [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]1 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000bb]TrankTimer [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]6[/COLOR][COLOR=#007700]) 
        [/COLOR][COLOR=#0000bb]Message [/COLOR][COLOR=#dd0000]"In 6 Tagen kann Saphiria wieder einen Trank brauen." 
        [/COLOR][COLOR=#0000bb]set TrankMessage to 2 
    [/COLOR][COLOR=#007700]elseif ([/COLOR][COLOR=#0000bb]TrankMessage [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]2 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000bb]TrankTimer [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]4[/COLOR][COLOR=#007700]) 
        [/COLOR][COLOR=#0000bb]Message [/COLOR][COLOR=#dd0000]"In 4 Tagen kann Saphiria wieder einen Trank brauen." 
        [/COLOR][COLOR=#0000bb]set TrankMessage to 3 
    [/COLOR][COLOR=#007700]elseif ([/COLOR][COLOR=#0000bb]TrankMessage [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]3 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000bb]TrankTimer [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]2[/COLOR][COLOR=#007700]) 
        [/COLOR][COLOR=#0000bb]Message [/COLOR][COLOR=#dd0000]"In 2 Tagen kann Saphiria wieder einen Trank brauen." 
        [/COLOR][COLOR=#0000bb]set TrankMessage to 4 
    [/COLOR][COLOR=#007700]elseif ([/COLOR][COLOR=#0000bb]TrankMessage [/COLOR][COLOR=#007700]== [/COLOR][COLOR=#0000bb]4 [/COLOR][COLOR=#007700]&& [/COLOR][COLOR=#0000bb]TrankTimer [/COLOR][COLOR=#007700]<= [/COLOR][COLOR=#0000bb]0[/COLOR][COLOR=#007700]) 
        [/COLOR][COLOR=#0000bb]Message [/COLOR][COLOR=#dd0000]"Saphiria kann wieder einen Trank brauen." 
        [/COLOR][COLOR=#0000bb]set TrankMessage to 0 
        set TrankTimerStart to 0 
    [/COLOR][COLOR=#007700]endif 
endif[/COLOR][/COLOR]
 
  • Like
Reaktionen: Eddy Kaschinski
sooo...
musste erst noch etwas im cs-wiki nachstöbern, da ich mich mit den oblivion-scripts im speziellen nicht so gut auskenne (welche paramenter/befehle usw. sind erlaubt usf.)

PHP:
if (TrankTimerStart == 1) 
		set TrankTimerStart to -1
    set TrankTimerEnd to (GameDaysPassed + 10)
endif 

if TrankTimerEnd == GameDaysPassed
	Message "Saphiria kann wieder einen Trank brauen." 
	set TrankTimerStart to 0
else
	set TrankTimer to (TrankTimerEnd - GameDaysPassed)
	if TrankTimer == 1
		Message "In einem Tag kann Saphiria wieder einen Trank brauen."
	else
		Message "In %.0f Tagen kann Saphiria wieder einen Trank brauen.", TrankTimer, 5
	endif
endif

die TrankTimerEnd wird nur zum start einmal gesetzt, und behält die ganze laufzeit über den "zieltag" gespeichert. der TrankTimer selber hält eigentlich nur die anzahl tage für die message.
allerdings wird das script die meldung wohl jede sekunde ausgeben, da eine der beiden bedingungen ja immer passt. man könnte es noch in eine zusätzliche abfrage verpacken:

PHP:
if (TrankTimerStart == 1) 
	set TrankTimerStart to 0
	set TrankTimerEnd to (GameDaysPassed + 10)
	set TrankMsg to 1 ; damit die message auch gleich einmal ausgegeben wird
endif 

if TrankMsg == 1
	if TrankTimerEnd == GameDaysPassed
		Message "Saphiria kann wieder einen Trank brauen." 
		set TrankTimerStart to 0
	else
		set TrankTimer to (TrankTimerEnd - GameDaysPassed)
		if TrankTimer == 1
			Message "In einem Tag kann Saphiria wieder einen Trank brauen."
		else
			Message "In %.0f Tagen kann Saphiria wieder einen Trank brauen.", TrankTimer, 5
		endif
	endif
	set TrankMsg to 0
endif

dann musst du einfach nur irgendwo in deinem restlichen script trankmsg auf 1 setzen, und die meldung wird 1x ausgegeben.

übrigens sind bei sowas ein paar debugmeldungen recht hilfreich, dann sieht man immer gleich, was sache ist:

irgendwo oben ins script ein set TrankDebug to 1, und in die schleifen packst du dir dann sowas wie

if TrankDebug == 1
message "TrankTimer = %.0f", TrankTimer, 5
endif

um die meldung wieder weg zu bekommen, setzt du einfach nur trankdebug wieder auf 0. und wenn alles fix und fertig ist und wie gewünscht läuft, kannst du die debug-meldungen ja wieder rausnehmen.

da wär dir dann bei deinem ursprungsscript wohl sofort aufgefallen, daß der timer sofort rasant ins negative anwächst ;)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Eddy Kaschinski
@Naboradd
@LordKain

Echt super vielen Dank für eure Mühe und euren Einsatz. Ich werde Morgen/ hüstel Heute die Scripte ausprobieren. Hoffe das haut nu entlich hin.

Nu is aber erstmal Schluß. Mir raucht schon die Birne. Ich werde aber auf jeden Fall berichten.

Thanx to all :p
 
Heureka!!! :-D:-D:-D

Ich kann es nicht fassen, es funzt. Habe zwar noch nicht die komplette Zeitspanne gewartet, aber die ersten Meldung ist nach 2 Tagen ausgeworfen worden.

Damit konnte ich gleich 2 Probleme lösen.

Wie kann ich nun eine Variable einbauen, die das Topic für diese Zeit sperrt?:huh:



Nochmals many Thanx to all :-D
 
@Trisaster

Das funktioniert leider nicht. Das Topic wird trotzdem freigegeben. Aber der Tipp von AjAeXx hat gefunzt.

Alles im Butter jetzt. Der Tag ist gerettet. :-D :-D

Bis zum nächsten Timer ;)

Vielen Dank nochmals an die ScriptKings hier. Ohne Euch wäre so mancher mod nicht realisierbar.