World of Gothic Archiv > NWN-Hilfe
Stadtwachescript
Seite 1 von 1  1 
25.08.2002, 10:24 #1
The King
Beiträge: 100
Stadtwachescript
Als mein erstes Script wollte ich ein Script machen wo die Wache dich aufhaltet wenn du dich ausruhst (wie in GB2) Allerdings das er einen sehen muss.

Aber die Wache macht nichts!

Der Kompiller sreibt bei der Zeile objekt oCreature = GetLastPerceived(); FEHLER: KEIN SEMIKOLON NACH ANWEISUNG - aber ich finde keinen Fehler.


Wie es im Scriptkurs stand hab ich die // vor
SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); //OPTIONAL BEHAVIOR - Fire User Defined Event 1002 weggenommen damit das OnUserdefinde aktiviert wird!

Dann hab ich in OnUserdefinde das hier reingeschreiben!

void main() {
{

if(nUser ==1002)
{
objekt oCreature = GetLastPerceived();


if(TRUE == GetLastPerceptionSeen()) && (GetisPC(oCreature)) && (GetIsResting(oCreature))
{

AssignCommand(oCreature, ClearAllActions());
ActionDoCommander(SetFacingpoint(GetPosition(oCreature)));

speakString("Sucht euch ein Gasthaus wenn ihr euch ausruhen wollt!");
}


}


}
25.08.2002, 10:26 #2
The King
Beiträge: 100

eigentlich hab ich das gegliedert aber hier sieht man es komischerweise ungegliedert
25.08.2002, 10:29 #3
palme
Beiträge: 466

Ich nehme dieses Script:

quote:
void main()
{
int nLetztesMal = GetLastRestEventType();
if(nLetztesMal != REST_EVENTTYPE_REST_STARTED) return; //damit der text nicht oefter erscheint (das onplayerrest-ereignis wird beim starten, abbrechen und beenden des rastens aufgerufen (ich glaube auch bei einem fehler))
int nAnzahlWachen = 5; //hier anzahl der wachen eingeben
int i = 1;
object oPC = GetFirstPC(); //der spieler
object oWache; //die wachen
for(i = 1;i <= nAnzahlWachen;i++)
{
oWache = GetObjectByTag("wache" + IntToString(i)); //die einzelnen wachen testen
if(oWache == OBJECT_INVALID) continue; //falls es eine wache nicht gibt, mach einfach weiter
if(GetObjectSeen(oPC,oWache) == TRUE || GetObjectHeard(oPC,oWache)) //wenn der spieler gehoert oder gesehen wird
{
location lGoBack = GetLocation(oWache); // Position speichern
AssignCommand(oPC,ClearAllActions()); //stopp das ausruhen
AssignCommand(oWache,ActionMoveToObject(oPC,TRUE)); //lauf zum spieler
AssignCommand(oWache,ActionSpeakString("Bitte ruht euch in einem Schlafgemach aus.!")); //sage dem spieler dass er nicht rasten darf
AssignCommand(oWache, DelayCommand(5.0, ActionMoveToLocation(lGoBack))); // Nach 4 Sekunden wieder zurück gehen

return; //hoer auf
}
}
}


Ich hoffe es hilft dir...
25.08.2002, 12:32 #4
The King
Beiträge: 100

Ich möchte aber noch wissen was hier falsch ist. Ich hab das Script jetzt ausgebessert (ein paar Fehler waren drin.)

Das hier muss man nur noch in OnPerception eingeben:
Die Wache schaut mir nur nach sonnst macht sie nichts!

void main()
{
int zahl = 0;
do
{
object Creature = GetFirstPC();


if(TRUE == GetIsResting(Creature))
{

AssignCommand(Creature, ClearAllActions());
ActionDoCommand(SetFacingPoint(GetPosition(Creature)));
ActionDoCommand(ActionMoveToObject(Creature));

SpeakString("Sucht euch ein Gasthaus wenn ihr euch ausruhen wollt!");

}
}
while(zahl ==1);


}
25.08.2002, 13:51 #5
GuradonHellsing
Beiträge: 232

anstelle von ActionDoCommand(ActionMoveToObject(Creature));
ActionMovetoObject is ja schon ein action befehl
AssignCommand(OBJECT_SELF,ActionMoveToObject(Creature));
und natürlich
AssignCommand(OBJECT_SELF,ActionSpeakString("BlaBlaBla"));
er soll ja hin laufen und dann sprechen
25.08.2002, 14:01 #6
The King
Beiträge: 100

Leider geht es immer noch nicht!
25.08.2002, 16:18 #7
GuradonHellsing
Beiträge: 232

das problem is das er das script nur ausführt wenn er den pc zum erstenmal wahrnimmt packs mal unter onheartbeat
und benutz getnearestobject
und getdistancebetween objects
falls die wache nurn bestimmten radius ham soll dann brauchste auch nimmer die do while schleife
05.09.2002, 10:30 #8
The King
Beiträge: 100

Überarbeitete Version: Geht aber immer noch nicht. Kann es sein das ir


object gesehen = GetFirstPC();
int aufgerufen =GetUserDefinedEventNumber();


void main()
{
switch(aufgerufen)
{
case 1001: // Jede 6 Sekunden kommt das Skript in action

if(GetIsResting(gesehen)) //Es wird überprüft ob spieler Rastet
{
if(GetObjectSeen(gesehen,OBJECT_SELF) == TRUE || GetObjectHeard(gesehen,OBJECT_SELF)) Wenn er auch noch gesehen ofer gehört wir passiert das
{
location lGoBack = GetLocation(OBJECT_SELF);

AssignCommand(gesehen,ClearAllActions());
AssignCommand(OBJECT_SELF,ActionMoveToObject(gesehen,TRUE));
AssignCommand(OBJECT_SELF,ActionSpeakString("Geht in ein Gasthaus wenn ihr euch ausruhen wollt!"));
AssignCommand(OBJECT_SELF, DelayCommand(5.0, ActionMoveToLocation(lGoBack)));
}
}


break;

}

}

Kann es sein das was mit dem if(GetIsResting(gesehen)) nicht in ordnung ist
05.09.2002, 17:02 #9
GuradonHellsing
Beiträge: 232

das getfirstpc ist falsch
ich würde lieber GetLastPerceived()
nehmen und die switch schleife ist mir nicht ganz klar
(glaub die kann man weglassen)
06.09.2002, 09:30 #10
The King
Beiträge: 100

Das case 1001 wird aufgerufen wenn Hearthbeath aktiviert wird.
das macht GetUserDefinedEventNumber()-

Klappt mit GetLastPerceived nicht
06.09.2002, 09:35 #11
Rhaegar
Beiträge: 296

Hm, also auf den ersten Blick wuerde ich sagen, das Ganze sollte eigentlich einwandfrei funktionieren. Tut es aber blöderweise nicht...
Ich mach mal ein wenig Debugging und schau woran's liegt...

Edit: Ok, ich hab' jetzt folgendes gemacht:
code\:

object gesehen = GetFirstPC();
int aufgerufen =GetUserDefinedEventNumber();


void main()
{
switch(aufgerufen)
{
case 1001: // Jede 6 Sekunden kommt das Skript in action
ActionSpeakString("Case ist ok!");
ActionSpeakString(GetName(gesehen));
ActionSpeakString(IntToString(GetIsResting(gesehen)));
if(GetIsResting(gesehen)) //Es wird überprüft ob spieler Rastet
{ActionSpeakString("Ich merke, dass er rastet!");
if(GetObjectSeen(gesehen,OBJECT_SELF) == TRUE || GetObjectHeard(gesehen,OBJECT_SELF))
{ActionSpeakString("Hoeren und Sehen kann ich ihn auch!");
location lGoBack = GetLocation(OBJECT_SELF);
AssignCommand(gesehen,ClearAllActions());
AssignCommand(OBJECT_SELF,ActionMoveToObject(gesehen,TRUE));
AssignCommand(OBJECT_SELF,ActionSpeakString("Geht in ein Gasthaus wenn ihr euch ausruhen wollt!"));
AssignCommand(OBJECT_SELF, DelayCommand(5.0, ActionMoveToLocation(lGoBack)));
}
}
break;
default: ActionSpeakString("Debug!");
}
}



Ergebnis: Der Nsc sagt alle 6 Sekunden "Case ist ok" , den Namen des PCs sowie 0. Blöderweise sagt er wenn man sich ausruht auch immer noch 0, es liegt also tatsaechlich am GetIsResting(), das irgendwie streikt...

Ich koennte ja jetzt versuchen eine Loesung zu posten, die im OnPlayerRest bestimmte PlotFlags bzw. Variablen fuer den Waechter setzt, aber das Skript das Palme gepostet hat ist viel zu schoen, um damit zu konkurrieren ;), nimm' lieber das.


___________________________

Verliebt in den UserDefined Event ^^
Überzeugter Episode 2 Hasser[/font]
06.09.2002, 11:44 #12
The King
Beiträge: 100

Ok ich nehm das von Palme.

PS: Gute Idee das mit dem Debugging
Seite 1 von 1  1