[Modding] Detektieren, ob ein Spiel neu geladen wurde?

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
@Taimon fällt Dir eine Möglichkeit ein, wie man überprüfen kann, ob gerade ein Save neu geladen wurde? Es gibt keine Veränderung in einem Skript, dass ich zum Resetten der Dialoge verwenden könnte, da diese sich nicht verändern. Ich hatte gehofft, dass lokale Variablen von cres (nicht NPCs) auf Null zurückgesetzt werden würden, aber falls das mal so war, ist es in der EE definitiv nicht so, zumindest hat mein schneller Check mit einer test-cre nicht geklappt.

Wenn es keinen Check dafür gibt, fällt mir als Lösung nur ein, die Dialoge alle x Zeiteinheiten per Skript zurückzusetzen, wenn kein Kampf läuft. Wovon ich nicht so begeistert bin.
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Ich bin mir nicht ganz sicher, ob ich das Problem im Detail verstanden habe.
Ist das automatische Ändern der Dialogdateien durch die Engine auf nur eine Area begrenzt?
Und welche 2da ist das, pdialog.2da?
(Da es sich hier um die EE-Version handelt, kann ich nicht mal schnell in den Debugger schauen, um das zu bestätigen.)

Prinzipiell besteht die Möglichkeit, etwas mit dem OnCreation()-Trigger zu machen.
Der sollte beim Laden des Objektes triggern, im Area-Skript also beim Betreten des Gebietes. (auch nach Neuladen)

Ich hatte gehofft, dass lokale Variablen von cres (nicht NPCs) auf Null zurückgesetzt werden würden
Nein, lokale Variablen werden persistent in jedem Actor als Effect gespeichert.
Lokale Timer (StartTimer()) werden nicht gespeichert.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Genau. Das Problem ist, dass EndlessBG1 die Areas bd0120 und bd0130 (Korlasz' Dungeon) im BG1-Teil des Spiels betretbar macht, die originalen NPCs aber in dieser Gruft im Originalspiel Einmischdialoge haben, die in ihrem soD-Dialog stehen (SoD joined-Dialoge in der bddialog.2da). Das heißt, das eigentliche Problem ist, dass die originalen NPCs nun ihren BG1-Joined-Dialog gesetzt haben, aber mit ihrem SoD-joined-Dialog sprechen sollen, was natürlich nicht klappt.
Also wollte ich per Skript die joined-Dialoge der NPCs auf die SoD-Einträge setzen. Wenn der Spieler nun aber einen Save in Korlasz' Dungeon lädt, dann setzt die Engine die joined-Dialoge zurück auf das, was in der aktiven (p/bd)dialog.2da steht, und das ist in dem Fall die von Bg1, also weden die joined-dlgs der NPCs auf die BG1-joined-Dialoge resettet.
Ich bräuchte entweder eine Möglichkeit, das Laden eines Speicherstandes zu detektieren und über Skript die dlgs wieder anzupassen. Oder ich finde einen Weg, dass eine anderen xxdialog.2da aktiv ist (s.u.).

Prinzipiell besteht die Möglichkeit, etwas mit dem OnCreation()-Trigger zu machen.
Der sollte beim Laden des Objektes triggern, im Area-Skript also beim Betreten des Gebietes. (auch nach Neuladen)
Interessant. Das würde das zimelich einfach machen.

Lokale Timer (StartTimer()) werden nicht gespeichert.
Ist ein Timer nachdem er gelaufen ist auf 0 oder 1? Das müsste ich mal ausprobieren. Das würde, wenn es geht, meine lokale Variable einer cre-idee ersetzen.

Um es etwas komplizierter zu machen - Ich könnte auch einen neuen Eintrag in die CAMPAIGN.2da setzen, der die bd0120.are als Startarea hat. Ich mache in EndlessBG1 bereits etwas ähnliches für den Wechsel zu "SoD", das ja dann entsprechend in der bd0103 anfängt (statt in Korlasz' Dungeon). Dazu schreibe ich eine "C#STSD" in die CAMPAIGN.2da, die durch die bdsodtn.bcs gestartet wird (statt der originalen "SoD").
So könnte ich hier zwei einträge dazufügen: einen, wenn man in den Dungeon hinabsteigt. Und einen, wenn man wieder hochkommt.
Ich muss nochmal überlegen, ob es dadurch irgendeinen Nachteil geben könnte. Ich sehe aber nicht, welchen. Ein neues Spiel kann man mit diesen neuen "Kampagnen" nicht starten und sie verhalten sich gleich wie BG1 - bis darauf, dass in Korlasz' Dungeon die Joined-dlgs aus soD verwendet werden. Klingt ein bisschen wie ein Overkill, aber wahrscheinlich besser, als alle 10s ein Skript laufen zu lassen, das die Handlungen der NPCs unterbricht. :hae: Großer Charme dieser Methode wäre, dass - falls es tatsächlich mal sowas geben sollte - auch neue Areas in Korlasz' Dungeon damit abgedeckt wären, falls eine Mod mal welche einfügt, solange der Ausgang (zum Verlassen der Hilfskampagne) derselbe bleibt.

Danke erstmal, damit sollte sich ja was machen lassen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Update: OnCreation() funktioniert, auch wenn es nicht am direkten Skriptanfang steht (was ich nicht wusste). Das ist gut, das sollte reichen.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.378
Hm, das Ausführen von OnCreation beim Laden eines Spielstands eröffnet schon Möglichkeiten. Gerade bei Kämpfen mit vielen Rettungswürfen versuchen Spieler ja häufig, den Kampf zu unterteilen und dann nach jedem Abschnitt zu speichern, wenn man erfolgreich war. Da könnte man dann ja bei jedem Neu-Laden was zusätzliches Einbauen.

Das dürfte denke ich auch der Grund sein, warum bei SoD nach dem man in der Vorratskammer manchmal so viele Gegner gespawnt wurden, wenn man da vorher öfter mal neu geladen hat. Dürfte an der Stelle von den Entwicklern wahrscheinlich unbeabsichtigt sein, aber gut zu wissen, dass man auf zu häufiges Neuladen reagieren kann...
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
OnCreation() funktioniert, auch wenn es nicht am direkten Skriptanfang steht (was ich nicht wusste).
Solange kein anderer Block beim ersten Skriptdurchlauf matcht ist es kein Problem.
Wenn aber etwas anderes matcht und dort kein Continue() steht, dann wird beim nächsten Skriptdurchlauf das OnCreation() nicht mehr triggern.
(Bin mir nicht mehr komplett sicher, aber ich denke das war so.)

Ist ein Timer nachdem er gelaufen ist auf 0 oder 1?
Verstehe die Frage nicht ganz, der Timer ist keine Variable an sich. Er wird mittels TimerExpired() geprüft.
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.378
Verstehe die Frage nicht ganz, der Timer ist keine Variable an sich. Er wird mittels TimerExpired() geprüft.
Aber der Wert des Timers steht in einer Variable und diese kann abgefragt werden. Und TimerExpired() prüft, ob die Variable 0 (oder negativ) ist meldet das Ergebnis (boolean) zurück, oder?

Die Frage, die sich für mich stellt: wird ein Timer nach Ablauf negativ (läuft einfach weiter) oder stoppt er bei 0? Wenn ich raten müsste, würde ich auf weiterlaufen tippen, weil ich meine bei Timerabfragen schon mal krass negative Werte gesehen zu haben (weiß allerdings nicht mehr, ob das BG war... ).
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Wenn aber etwas anderes matcht und dort kein Continue() steht, dann wird beim nächsten Skriptdurchlauf das OnCreation() nicht mehr triggern.
Ah, das könnte sein, warum es doch geklappt hat. Ich habe nämlich immer brav ein Continue() dazugetan, wenn ich Areaskripte über EXTEND_TOP gepatcht habe, weil ich mir gemerkt hatte, dass sonst die "OnCreation"-Blöcke nicht ausgeführt werden. Dass es natürlich auch davon abhängt, ob die Blöcke davor wahr triggern oder nicht, darauf bin ich grad nichtgekommen. Hmm. Das ist mir eigentlich zu riskant dann. Es gibt zu viele Mod, die ihre Skriptblöcke an den Anfang schreiben ohne Continue() (manche davon wahrscheinlich von mir...) EDIT: yep, wenn ein wahrer Skriptblock davor ausgeführt wird, wird das OnCreation nicht mehr ausgeführt. - Ist mir zu unsicher, und ich möchte auch nicht noch mehr Skriptblöcke an den Anfang der bd0120.bcs legen. Das fällt also raus.
Verstehe die Frage nicht ganz, der Timer ist keine Variable an sich. Er wird mittels TimerExpired() geprüft.
Ich löse manchmal beim testen Dialoge aus, indem ich globale Timer über SetGlobal auf "1" setze, was ihn im nächsten Moment auslaufen lässt. Daher war meine Vermutung wie @Maus schon schrieb, dass man den aktuellen Wert eines Timers über eine Variablenabfrage erhalten kann. Das scheint auch zu gehen, das problem ist nur, dass der Timer wohl auf 0 runterläuft, jedenfalls hatte ich bei der Abfrage, ob die Timervariable 0 ist einen Loop, wenn der Timer ausgelaufen ist. Ich hatte gehofft, einen lokalen Timer mit setTimer setzen zu können und wenn der "0" ist dann deswegen, weil der Spieler neu geladen hat und der Timer vom Spiel vergessen wurde. Ich meine, ich könnte ihn immer noch auf unendlich viele Stunden setzen und die Infrastruktur dieser Idee trotzdem nutzen... :hae:
 
Zuletzt bearbeitet:

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Aber der Wert des Timers steht in einer Variable und diese kann abgefragt werden. Und TimerExpired() prüft, ob die Variable 0 (oder negativ) ist meldet das Ergebnis (boolean) zurück, oder?
Nein, nicht bei diesen lokalen Timern.
Die werden in einer Liste in dem Akteur gehalten und pro Sekunde heruntergezählt. Sobald ein Timer abgelaufen ist, wird einmalig ein TimerExpired()-Triggerevent für diesen Timer zum Akteur geschickt und der Timer aus der Liste entfernt. Dass heißt, wenn in der jeweiligen Skriptrunde dieser Timer nicht geprüft wird, würde das Triggerevent verloren gehen.
Also nicht sonderlich zuverlässig.
Man kann den Timer auch während er läuft wieder mit StartTimer() aufziehen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Die werden in einer Liste in dem Akteur gehalten und pro Sekunde heruntergezählt. Sobald ein Timer abgelaufen ist, wird einmalig ein TimerExpired()-Triggerevent für diesen Timer zum Akteur geschickt und der Timer aus der Liste entfernt. Dass heißt, wenn in der jeweiligen Skriptrunde dieser Timer nicht geprüft wird, würde das Triggerevent verloren gehen.
Also nicht sonderlich zuverlässig.
Hmm, dann war mein "Timer läuft aus-Loop" gar keiner sondern die "Variable"nabfrage (des Timernamens) hat immer wahr gegeben... böh...
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
An dieser Stelle sollte ich meinen üblichen Disclaimer bringen, dass ich mir ja nur die ToB-Engine angeschaut habe und sich in der EE-Engine einiges geändert haben könnte.

Alternativ zu dem OnCreation() im Areascript könnte man natürlich auch einen unsichtbaren Akteur in der Area platzieren und auf dessen OnCreation() triggern.
Dieses Skript sollte ja exklusiv zur Verfügung stehen, so dass man da die volle Kontrolle hat.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Alternativ zu dem OnCreation() im Areascript könnte man natürlich auch einen unsichtbaren Akteur in der Area platzieren und auf dessen OnCreation() triggern.
Dieses Skript sollte ja exklusiv zur Verfügung stehen, so dass man da die volle Kontrolle hat.
Ooh wenn das auch im OVERRIDE Script einer kreatur funktioniert, dann wird dies die Lösung sein. Das werde ich als nächstes ausprobieren, aber wohl nicht mehr heute. Vielen Dank!
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Ooh wenn das auch im OVERRIDE Script einer kreatur funktioniert, dann wird dies die Lösung sein.
Ja, das sollte funktionieren.

Hmm, dann war mein "Timer läuft aus-Loop" gar keiner sondern die "Variable"nabfrage (des Timernamens) hat immer wahr gegeben...
Ich bin mir nicht ganz sicher, ob wir wirklich über diesselben Timer reden. Die lokalen Timer haben keine Namen, sondern nur einen Zahlwert als ID.
(Theoretisch könnte man dieser Zahl über eine IDS-Datei einen Namen geben, standardmäßig ist dafür aber keine IDS-Datei definiert.)
Aber egal, spielt ja wahrscheinlich keine Rolle mehr.

/Edit:
Eine Sache noch, eventuell sollten wir die Diskussion aus diesem Thread herauslösen.
Vielleicht ist die Information auch für andere interessant.
 
Zuletzt bearbeitet:

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
@Taimon hab's ins öffentliche Modding Forum geschoben.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ich bin mir nicht ganz sicher, ob wir wirklich über diesselben Timer reden. Die lokalen Timer haben keine Namen, sondern nur einen Zahlwert als ID.
Ich war nach dem beispiel im IESDP gegangen:
Code:
StartTimer("SPAWNMON",12)
und dachte, "SPAWNMON" ist der Name des lokalen Timers.

Jetzt habe ich das Problem, dass ein Skript mit Continue() und ganz am Ende wird die Variable hochgezählt nicht das macht, was es soll. Die Variable wird hochgezählt, aber die ganzen Skriptblöcke dazwischen scheinen nicht stattgefunden zu haben. Ich weiß, dass ein Konstrukt dieser art eigentlich funktionieren sollte, daher habe ich wohl noch irgendeinen Fehler drin. Den muss ich aber morgen suchen. - Mit Cutscene hatte alles schon geklappt, Helfer cre setzt bei OnCreation die entsprechende Variable runter so dass das Areaskript dann die entsprechenden skriptblöcke laufen lassen kann, aber die Cutscene hatte immer einen kuirzen Hopser des Bildschirms zur folge, so dass ich es umstricken wollte, nun tut es erstmal nicht mehr..
IF
Global("SOD_fromimport","global",2)
InMyArea("%IMOEN_DV%") // Imoen
InPartyAllowDead("%IMOEN_DV%")
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("%IMOEN_DV%",SetDialog("BDIMOEN"))
ActionOverride("%IMOEN_DV%",ChangeAIScript("BDIMOEN",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("dynaheir") // Dynaheir
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("dynaheir",SetDialog("bddynahj"))
ActionOverride("dynaheir",ChangeAIScript("bddynahe",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("minsc") // Minsc
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("minsc",SetDialog("bdminscj"))
ActionOverride("minsc",ChangeAIScript("bdminsc",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("rasaad") // Rasaad
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Rasaad",SetDialog("bdRasaaj"))
ActionOverride("Rasaad",ChangeAIScript("bdrasaad",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Viconia") // Viconia
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Viconia",SetDialog("bdViconj"))
ActionOverride("Viconia",ChangeAIScript("bdviconi",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Safana") // Safana
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Safana",SetDialog("bdSafanj"))
ActionOverride("Safana",ChangeAIScript("bdsafana",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Edwin") // Edwin
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Edwin",SetDialog("bdEdwinj"))
ActionOverride("Edwin",ChangeAIScript("bdedwin",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Jaheira") // Jaheira
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Jaheira",SetDialog("bdJaheij"))
ActionOverride("Jaheira",ChangeAIScript("bdjaheir",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Khalid") // Khalid
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Khalid",SetDialog("bdKhalij"))
ActionOverride("Khalid",ChangeAIScript("bdkhalid",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Dorn") // Dorn
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Dorn",SetDialog("bdDornj"))
ActionOverride("Dorn",ChangeAIScript("bddorn",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Neera") // Neera
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Neera",SetDialog("bdNeeraj"))
ActionOverride("Neera",ChangeAIScript("bdneera",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Baeloth") // Baeloth
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Baeloth",SetDialog("bdBaeloj"))
ActionOverride("Baeloth",ChangeAIScript("bdbaelot",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Ajantis") // Ajantis
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Ajantis",SetDialog("bdAjantj"))
ActionOverride("Ajantis",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Alora") // Alora
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Alora",SetDialog("bdAloraj"))
ActionOverride("Alora",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Branwen") // Statue
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Branwen",SetDialog("bdBranwj"))
ActionOverride("Branwen",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Coran") // Coran
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Coran",SetDialog("bdCoranj"))
ActionOverride("Coran",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Eldoth") // Eldoth
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Eldoth",SetDialog("bdEldotj"))
ActionOverride("Eldoth",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Faldorn") // Faldorn
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Faldorn",SetDialog("bdFaldoj"))
ActionOverride("Faldorn",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Garrick") // Garrick
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Garrick",SetDialog("bdGarrij"))
ActionOverride("Garrick",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Kagain") // Kagain
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Kagain",SetDialog("bdKagaij"))
ActionOverride("Kagain",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Kivan") // Kivan
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Kivan",SetDialog("bdKivanj"))
ActionOverride("Kivan",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Montaron") // Montaron
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Montaron",SetDialog("bdMontaj"))
ActionOverride("Montaron",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Quayle") // Quayle
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Quayle",SetDialog("bdQuaylj"))
ActionOverride("Quayle",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
OR(2)
InMyArea("Shar-Teel")
InMyArea("SharTeel") // Shar-Teel
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Shar-Teel",SetDialog("bdSharTj"))
ActionOverride("Shar-Teel",ChangeAIScript("",OVERRIDE))
ActionOverride("SharTeel",SetDialog("bdSharTj"))
ActionOverride("SharTeel",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Skie") // Skie
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Skie",SetDialog("bdSkiej"))
ActionOverride("Skie",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Tiax") // Tiax
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Tiax",SetDialog("bdTiaxj"))
ActionOverride("Tiax",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Xan") // Xan
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Xan",SetDialog("bdXanj"))
ActionOverride("Xan",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Xzar") // Xzar
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Xzar",SetDialog("bdXzarj"))
ActionOverride("Xzar",ChangeAIScript("",OVERRIDE))
Continue()
END

IF
Global("SOD_fromimport","global",2)
InMyArea("Yeslick") // Yeslick
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
ActionOverride("Yeslick",SetDialog("bdYeslij"))
ActionOverride("Yeslick",ChangeAIScript("",OVERRIDE))
Continue()
END


IF
Global("SOD_fromimport","global",2)
GlobalLT("C#EBG1_npc_dlg_script_to_sod","global",2)
THEN
RESPONSE #100
SetGlobal("C#EBG1_npc_dlg_script_to_sod","global",2)
END
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Ich war nach dem beispiel im IESDP gegangen
Sieht für mich nach einem Fehler im IESDP aus. Wahrscheinlich verwendet niemand diese Timer. :)

Zu dem Skript:
Ich würde überprüfen, ob das InMyArea() zum Zeitpunkt des Skriptdurchlaufs auch gegeben ist.
Kann ja sein, dass die NPCs erst kurz danach in die Area kommen und deswegen der Trigger noch nicht wirkt.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ich würde überprüfen, ob das InMyArea() zum Zeitpunkt des Skriptdurchlaufs auch gegeben ist.
Kann ja sein, dass die NPCs erst kurz danach in die Area kommen und deswegen der Trigger noch nicht wirkt.
Ich hatte die Variable nach dem Laden noch mal per Hand auf 1 gesetzt. Da sollten sie alle in der Area erkannt worden sein. Sie war wieder auf 2, aber die NPCs hatten ihre Bg1 Dialoge.
Kann es ein Problem sein, dass nicht alle NPCs im Skript anwesend bzw. in der Gruppe sind?
 

Taimon

Infinity Engineer
Registriert
25.11.2001
Beiträge
1.501
Kann es ein Problem sein, dass nicht alle NPCs im Skript anwesend bzw. in der Gruppe sind?
Nein, das sollte keine Rolle spielen.

Vielleicht mal probieren den InMyArea()-Check durch AreaCheckObject() zu ersetzen.
Aber am besten erstmal drüber schlafen und dann später nochmal anschauen.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ich habe es heute erstmal nochmal so probiert, um zu sehen, was ich eigentlich genau mache. Es klappt mal, mal klappt es nicht. Mal ändert sich nur Imoens dialogue (als erste im Skript), mal auch ihrer nicht. Fun Fact: wenn ich Imoen einen DisplayStringHead() gebe, um das Ausführen des Skriptes zu überprüfen, klappt es immer :wunder:
Das ganze ist so aber auch noch zu störanfällig - klickt der Spieler nach dem Laden gleich mit Befehlen los, wird das Skript unterbrochen bzw. die Handlung der NPCs. Ich werde es nochmal umscripten, um es besser dagegen zu schützen. Zur Not kann ich immer noch zur Cutscene zurück - auf die Gefahr hin, dass die Spieler sich über den hopser der Graphik wundern, was aber nur beim Gebietswechsel und nach einem Neuladen geschehen würde.
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.918
Ich habe es jetzt. Jeder NPC hat nun eine individuelle Variable, damit wird jeder Skriptblock erst ausgeführt, wenn die Konditionen zutreffen. Die Helfer-cre setzt alle individuellen Variablen für die NPCs zurück, wenn der OnCreation() Trigger in seinem Script wahr ist. Das Setzen der Dialoge erfolgt dann über das Areaskript.

Ich habe aber erstmal die Nase voll von den Engine-Quirks und ähnlichem. Irgendwann als alles schon zu funktionieren schien wurde plötzlich Imoens Dialog nicht mehr korrigiert. Stellte sich raus: der neu eingefügte Skriptblock wurde über ein generelles Patchen aller Imoen betreffenden Skriptblöcke später in derselben Komponente deaktiviert. Dämlich genug, aber das Problem dabei: ich habe die Reihenfolge der Kompilierung seit vorgestern nicht geändert. Warum hat es also überhaupt geklappt? Fragen über Fragen. nun läuft es erstmal - glaube ich zumindest. Und es scheint so, als müsste ich meine NPC-Mods nicht anpassen, weil sie es bereits abdecken - yay!
 
Oben