B_RefreshArmor ======== Wird einmal pro Spieltag um 0 Uhr vom Code aufgerufen! Wurde früher genutzt, um NSCs die ihrer Rüstung beraubt wurden, wieder eine passende Rüstung dazuzuschummeln. Da der Spieler nun den NSCs nicht mehr die Rüstung abnehmen kann, ist diese Funktion leer. WICHTIG: Könnte aber zum Respawnen von irgendwelchen anderen Dingen benutzt werden!
Achtung: Diese Funktion wird nur dann aufgerufen, wenn die Spielzeit von 23:59 Uhr auf 0 Uhr springt, aber nicht, wenn der Spieler sich vor Mitternacht ins Bett legt und bis zum nächsten Tag schläft! Für diesen Fall muss eine weitere Abfrage in sleepabit.d eingebaut werden. B_RefreshArmor wird außerdem teilweise mehrmals pro Tageswechsel aufgerufen, daher sollte man mit Wld_GetDay() sicherstellen, dass nur ein Aufruf pro Tag verarbeitet wird.
Diese Funktion lässt sich für diverse Spielereien nutzen. Zum Beispiel kann man daraus recht einfach ein Wochentagsscript machen, welches die Tagesabläufe eurer NPC variieren lässt.
Dafür benötigen wir zunächst einmal die Funktion B_SetDay, die einfach in den B_RefreshArmor-File eingefügt werden kann. Diese könnte z.B. so aussehen:
func void B_SetDay() { if (CurrentDay == 1) { CurrentDay = 2; Print ("Schon wieder Dienstag..."); } else if (CurrentDay == 2) { CurrentDay = 3; Print ("Mittwoch. Die Hälfte der Woche ist vorbei."); } else if (CurrentDay == 3) { CurrentDay = 4; Print ("An Donnerstagen soll es ja angeblich immer regnen."); } else if (CurrentDay == 4) { CurrentDay = 5; Print ("Wenn ich am Freitag nur frei hätte... aber Helden schlafen nie."); } else if (CurrentDay == 5) { CurrentDay = 6; Print ("Samstag, endlich Wochenende!"); } else if (CurrentDay == 6) { CurrentDay = 7; Print ("Warum ist das Wochenende nur so kurz? Ich darf nicht vergessen, in die Kirche zu gehen."); } else { CurrentDay = 1; Print ("Ich hasse Montage!"); }; };
In die Story_Globals.d muss dann noch die Variable CurrentDay eingeführt werden.
Damit die Funktion auch ausgeführt wird, tragen wir sie in die B_RefreshArmor ein:
B_SetDay();
Damit die Funktion aufgerufen wird, muss nun noch ein NPC vorhanden sein, der keine Rüstung trägt. Dieser kann mit der Story verflochten sein (z.B. ein Gefangener) oder einfach an einem unerreichbaren Punkt stehen.
Ist diese Bedingung erfüllt, so wird die Funktion immer dann aufgerufen, wenn der Hero bis Mitternacht aufbleibt.
So wird der Tag aber nicht gewechselt, wenn er im Bett übernachtet. Also fügen wir noch folgenden Befehl in Zeile 32 ein(das ist kurz vor der Stelle, wo die Lebenspunkte aufgefüllt werden):
B_RefreshArmor();
Allerdings tritt damit ein neues Problem auf. Die Funktion wird nun nämlich auch dann aufgerufen, wenn der Held nicht übernachtet, sondern z.B. von 10 bis 12 Uhr schläft.
Also darf die Funktion nur einmal am Tag ausgeführt werden. Wir erstellen in der Story_Globals.d die Variable Refreshday und fügen eine passende Abfrage in die B_RefreshArmor ein.
Die Funktion sieht nun wie folgt aus:
func void B_RefreshArmor() { if (Refreshday < Wld_GetDay()) { B_SetDay(); Refreshday = Wld_GetDay(); }; };
Zuerst braucht man einen ocTriggerScript Vob in allen Welten (hier heißt er SCHLEIFE), der nach x Sekunden (0 = keine Verzögerung) eine Funktion aufruft. Der Trigger kann irgendwo an einer unerreichbaren Stelle sein, es ist nur wichtig, dass er existiert, ein Visual braucht er auch nicht. Der Trigger muss aber unendlich oft ausführbar sein und sollte mind. 1 Sekunde Verzögerung (fireDelaySec) haben, damit Gothic etwas Luft zum reagieren hat.
Als zweites brauchen wir eine Funktion, die nach Ablauf den Trigger wieder feuert:
var string msg; var int x; func void TestSchleife () { //Zum testen, hier muß das rein was regelmäßig ausgeführt werden soll msg = IntToString (x); PrintScreen (msg, -1, x,"font_old_10_white.tga",_TIME_MESSAGE_XPGAINED); x++; //Test Ende Wld_SendTrigger ("SCHLEIFE"); //Funktion erneut aufrufen lassen => Schleife entsteht };
Initialisieren muß man das per Wld_SendTrigger („SCHLEIFE“); in den init_irgendwas Funktionen in startup.d
(von NicoDE [http://forum.rpg-ring.com/forum/showthread.php?threadid=28724 Original-Thread])
Wie man dafür sorgt, dass eine Skript-Funktion zu einer bestimmten Tageszeit aufgerufen wird:
1) In jedem Level (Welt) gibt es ein oCTriggerScript mit:
vobName: TIMETRIGGER
reactToOnTrigger: TRUE (die anderen reactTo/respondTo sind FALSE)
startEnabled: TRUE
scriptFunc: EVT_TIMETRIGGER_FUNC
2)
Gothic 2:
InitTimeTrigger() in der INIT_GLOBAL* aufrufen.
Gothic 1:
InitTimeTrigger() in allen Init-Funktionen der Welten aufrufen.
func void InitTimeTrigger() { Wld_SetObjectRoutine( 06, 00, "TIMETRIGGER", 1 ); Wld_SetObjectRoutine( 12, 00, "TIMETRIGGER", 1 ); Wld_SetObjectRoutine( 18, 00, "TIMETRIGGER", 1 ); };
Was im Endeffekt dafür sorgt, dass für die angegebenen Zeitpunkte eine Objekt-Routine angelegt wird, die für ein OnTrigger-Event sorgt, welches EVT_TIMETRIGGER_FUNC() aufruft. Es sollte niemals eine Objekt-Routine für 23:59 angelegt werden, da diese Routine nie als 'erledigt' erkannt wird (und somit werden ab dem zweiten Tag keine Routinen/Events mehr aufgerufen).
3) Eine EVT_TIMETRIGGER_FUNC() schreiben
func void EVT_TIMETRIGGER_FUNC() { var int test; test += 1; PrintScreen( IntToString( test ), -1, -1, FONT_SCREEN, 1 ); };