World of Gothic Archiv > NWN-Hilfe
Türen bei Nacht verschließen
Seite 1 von 1  1 
01.09.2002, 22:27 #1
Anandra
Beiträge: 14
Türen bei Nacht verschließen
Hi allerseits :)

Mein Team und ich haben bei einer Kleinigkeit ein doch eher großes Problem. Wir kriegen es einfach nicht umgesetzt, dass eine Tür bei Nacht geschlossen ist und bei Tage offen steht.
Auch eine mögliche Lösung konnte ich bisher nach längerem Suchen leider nicht finden, so hoffe ich hier auf Hilfe :)

Anandra
01.09.2002, 22:53 #2
Rhaegar
Beiträge: 296

Ok: folgendes ins On HeartBeat-Scipt der Tuer:

code\:

void main()
{
if ((GetIsNight())&&(!GetLocked(OBJECT_SELF)))
{ActionCloseDoor(OBJECT_SELF);
SetLocked(OBJECT_SELF,TRUE);}
else if ((GetIsDay())&&(GetLocked(OBJECT_SELF)))
{SetLocked(OBJECT_SELF,FALSE);
ActionOpenDoor(OBJECT_SELF); }
}



Viel Spass beim weiterbasteln :) !

Ach ja, damit's richtig funtzt sollte die Tuer anfangs verschlossen sein.


___________________________

Verliebt in den UserDefined Event ^^
Überzeugter Episode 2 Hasser[/font]
01.09.2002, 22:56 #3
Anandra
Beiträge: 14

Vielen Dank für die rasche Antwort :)

Es handelt sich nämlich eine Ladentür. Zwar gibt es bei D&D sicher kein Ladenschlußgesetz, aber jeder noch so Goldgierige Geschäftsmann braucht in der Nacht wie jeder andere Mensch seinen Schlaf :)
01.09.2002, 22:59 #4
Rhaegar
Beiträge: 296

ja, nachts um drei sind die meissten Ladentueren doch eher geschlossen ;) !

Falls ihr noch irgendwelche Probleme habt: Just post, ich schau dann was sich machen lässt :) !
02.09.2002, 10:36 #5
DTime
Beiträge: 155

Noch ne Möglichkeit

quote:

void main()
{
if (GetIsDusk() && GetISOpen (OBJECT_SELF)
{
ActionCloseDoor (OBJECT_SELF)
ActionDoCommand (SetLocked (OBJECT_SELF, TRUE)
}
else if (GetIsDawn() && GetLocked (OBJECT_SELF))
{
SetLocked (OBJECT_SELF, FALSE)




Ist nur ne kleine Alternative! dusk und dawn sind etwas anders geartet als Day und Night... jetzt wird mit dem Sonnenaufgang geöffnet und bei Sonnenuntergang ist Schluss. ActionDoCommand vor Set locked wird benutzt um das ganze in die Reihe einzugliedern, da der Befehl ActionCloseDoor vorher ausgeführt werden soll. Weiß nicht ob´s praktisch nen Unterschied macht... in der Theorie sollte es eigentlich, aber beide Skripte funktionieren tadellos.

Wollte eigentlich nur mal wissen ob jemand weiß warum da kein Unterschied besteht???????????????????? Skripten ist nicht unbedingt meine Stärke ;)
02.09.2002, 10:40 #6
Rhaegar
Beiträge: 296

Es besteht ein kleiner Unterschied:

Denn der Heartbeat funtzt leider nur wenn ein SC in der jeweiligen Area ist.
Wenn die Spieler also mittags um 12 in das Modul kommen und die Tuer geschlossen ist, bleibt sie auch zu und wird erst mit der nächsten Morgendämmerung geöffnet!



Hoffe ich konnte deine Frage beantworten :) !
(Und hoffe ich seh das richtig :D)

Edit: Ach ja: Das ActionDoCommand bei SetLocked macht Sinn !
02.09.2002, 11:15 #7
DTime
Beiträge: 155

Dann hätte ich mal ne blöde Frage:

Wäre es nicht sinniger diese Abfrage so einzubauen das sie nur gestartet wird wenn ein Player sich nähert? Falls Npc die Tür auch öffnen können müsste man die natürlich auch berücksichtigen! OnPerceived würde sich doch anbieten... oder geht so was bei Türen nicht??? Damit würden auch die OnHeartbeat Aktionen, die ja durchaus Speicherressourcen fressen, entschärft... gerade bei größeren Gebieten?

Falls das totaler Blödsinn ist, bedenkt ich bin ein Skripting Rookie
;)
02.09.2002, 11:39 #8
Rhaegar
Beiträge: 296

Tueren haben leider kein OnPerception-Skript.

Du kannst höchstens einen NPC dorthinstellen, der der Tuer dann die jeweiligen Anweisungen per AssignCommand oder SignalEvent zuweist.

Ich hasse es ja auch OnHB benutzen zu müssen, aber abgesehen von den zwei Mal beim Öffnen und Schliessen muss das Skript ja nichts anderes machen als die if-Conditionals zu ueberpruefen und das sollte Performance-mässig noch halbwegs erträglich sein.

Edit: Mögliche Loesung:
Einen Npc hinstellen und den die Perception uebernehmen lassen und dann per SignalEvent,ExecuteScript oder AssignCommand die Tuere beeinflussen.[Edit2:Hier stand Blödsinn :D]
Problem: Wenn der Spieler jetzt Tagsueber ankommt und ihn der NPC sieht ist die Tuere offen.Wartet der Spieler jetzt noch 5 Stunden und geht um 22:00 Uhr erst rein wird die Tuer vermutlich immer noch offen sein, weil ja keine neue Perception dazukam...
[Edit 3:Oops, ich sehe ich wiederhole mich in diesem Posting. Oh Mann, ich bin zu müde um das jetzt noch zu korrigieren ^^]
02.09.2002, 11:56 #9
Anandra
Beiträge: 14

@Rhaegar: Ich bin wohl auf dein Angebot auf weitere Hilfe angewiesen. Wir kommen soweit mit unserem Modul wirklich bestens klar und konnten fast alles bisher alleine lösen

Mein Wunsch ist es, dass sich bei uns im Modul ein Lehrer mit 3 Schüler unterhält, per SpeakString. Wir haben ein Skript eingearbeitet, das leider nicht funktioniert. Wir hatten das versucht mit der "Case"-Möglichkeit. Das mehrere Gespräche per Zufall vom Modul ausgewürfelt wird. Frag mich nur nicht, woran es liegen mag, das nichts passiert...

Wäre lieb von dir oder jemandem anderen, uns dort ein wenig zu helfen :)

Anandra
02.09.2002, 12:00 #10
Rhaegar
Beiträge: 296

Meinst du du koenntest mal das Originalskript hier reinposten, damit ich eine Vorstellung davon bekomme,wie genau es aussehen soll :) ?

Edit: Hm, ich schreib' mal kurz ein kleines Beispielskript für einige zufällig ausgewählte Gespräche mit mehreren Charakteren. Gib mir 30 Minuten :) (muss noch Essen ;)) !
02.09.2002, 13:10 #11
Rhaegar
Beiträge: 296

Ok:
So ähnlich (d.h. an euren Dialog angepasst) muss das Skript aussehen, dass im OnUserDefined-Event des Lehrers steht:

code\:


void main()
{
int nUser = GetUserDefinedEventNumber();
object oStudent1=GetObjectByTag("Tag von Schueler 1");
object oStudent2=GetObjectByTag("Tag von Schueler 2");
object oStudent3=GetObjectByTag("Tag von Schueler 3");

if(nUser == 1) //Dialog 1
{ActionSpeakString("Morgen,Kinder!");//Diese Saetze sagt der Lehrer
ActionWait(3.0); //kurze Pause, ,damit man's auch lesen kann
ActionDoCommand(AssignCommand(oStudent1,SpeakString("Morgen! Herr Lehrer!")));//so spricht Schueler 1
ActionDoCommand(AssignCommand(oStudent2,SpeakString("Morgen! Herr Lehrer!")));//so nummer 2
ActionWait(5.0);//kurze Pause(die beiden sagen das guten Morgen gleichzeitig, deswegen dazwischen keine Pause)
ActionSpeakString("Was ist denn mit dir heute los, Imoen? Du bist doch sonst nicht so schweigsam!");//mir fiel kein anderer Name als Imoen ein ^^
ActionWait(3.0);
ActionDoCommand(AssignCommand(oStudent3,SpeakString("*senkt traurig den Kopf*")));
ActionWait(3.0);
ActionDoCommand(AssignCommand(oStudent2,SpeakString("Sie hat Liebeskummer!")));
ActionWait(2.0);
ActionDoCommand(AssignCommand(oStudent1,SpeakString("*lacht lauthals los*")));
ActionWait(3.0);
ActionDoCommand(AssignCommand(oStudent3,SpeakString("Hab' ich nicht!")));
ActionWait(4.0);
ActionDoCommand(AssignCommand(oStudent2,SpeakString("Hast du wohl!")));
ActionWait(5.0);
ActionSpeakString("Ruhe jetzt,Kinder!");
//usw. und so fort...hier einfach weitere Saetze einfuegen..
ActionDoCommand(ClearAllActions());


}
else if(nUser ==2) // Dialog 2
{ /*Hier exakt diesselbe Geschichte wie oben, nur mit anderem Dialog*/

}
else if(nUser ==3)//Dialog 3
{ //siehe oben

}

}



Aufgerufen wird das Ganze ueber folgendes Skript:

code\:

void main()
{
int nRandom=d3(); //ein Wurf mit einem Dreierwuerfel, also eine Zufallszahl zwischen 1 und 3
object oTeacher=GetObjectByTag("Tag des Lehrers");

SignalEvent(oTeacher,EventUserDefined(nRandom));
}



Das koennte zum Beispiel im OnEnter-Skript der Area stehen, damit es ausgefuehrt wird, sobald jemand das Klassenzimmer betritt, oder aber auch im OnPerception-Script des Lehrers, je nachdem, bei welcher Gelegenheit ihr es haben wollt.

Wichtig: Der Lehrer ist sozusagen die Schaltzentrale fuer die Kinder.
Er darf NICHT SITZEN, weil er sonst keine Aktionen abarbeiten kann, da das Sitzen die Aktionsliste blockiert.

Falls er unbedingt sitzen soll schreib' Bescheid, dann schreib' ich eine Loesung dafuer(die aber nicht besonders elegant ist...)

Edit: *ueberleg*
Hm, geht doch auch recht einfach, dass auch der Lehrer sitzen kann:
Einfach das Skript in den UserDefined eines der Stuehle, die eh rumstehen und statt dem ActionSpeakString("...") für die Saetze des Lehrers einfach die Saetze des Lehrers auch wie die der Schueler scripten (Also : ActionDoCommand(AssignCommand(oTeacher,SpeakString("...."))) ).Das einzige was man am Auslöserskript aendern muss ist, dass man statt des UD des Lehrers den des Stuhles ausklöst (also statt SignalEvent(oTeacher,....)-> SignalEvent(oStuhl,...) ).

Aber eigentlich steht der Lehrer ja ohnehin meisstens vor der Klasse...


___________________________

Verliebt in den UserDefined Event ^^
Überzeugter Episode 2 Hasser[/font]
02.09.2002, 15:25 #12
Anandra
Beiträge: 14

Hab tausend Dank! :)

Das ging ja richtig schnell und vor allem gleich ein vollständiges Script, ich schätze, ich bin dir was schuldig :)

Ich weiß nicht, wie ich dir danken kann

Anandra
02.09.2002, 15:46 #13
Rhaegar
Beiträge: 296

Ist schon ok :) !

Ist ja nicht so, das ich ungern skripte, im Gegenteil, die Sache macht mir Spass (sonst wuerde ich auch nicht Info studieren ;) ).

Falls ihr weitere Probleme habt, du weisst ja wo du mich findest :)...
Seite 1 von 1  1