World of Gothic Archiv > NWN-Hilfe
stadtwachenscript
Seite 1 von 1  1 
17.07.2002, 19:11 #1
jf
Beiträge: 26
stadtwachenscript
da mir mal wieder so langweilig war ;) hab ich ein stadtwachenscript geschrieben...
wer kennt das nicht aus baldurs gate 2, da will man sich ausruhen und schon kommt die stadtwache und beschwert sich :D
bei mir kommen die stadtwachen aber nicht aus dem nichts sondern meckern nur, wenn man in hör- bzw. sichtweite ist.

folgenden code müsst ihr im "onplayerrest"-ereignis bei den moduleigenschaften (bearbeiten | eigenschaften des moduls | ereignisse) eingeben:
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("stadtwache" + 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
{
AssignCommand(oPC,ClearAllActions()); //stopp das ausruhen
AssignCommand(oWache,ActionMoveToObject(oPC,TRUE)); //lauf zum spieler
AssignCommand(oWache,SpeakString("Ihr duerft hier nicht rasten!")); //sage dem spieler dass er nicht rasten darf
return; //hoer auf
}
}
}

ihr könnt soviele stadtwachen verwenden wie ihr wollt, ihr müsst nur die anzahl bei nAnzahlWachen eingeben und die kennzeichnung der wachen muss "stadtwachex" lauten, mit dem x numeriert ihr die wachen durch (wenn sie die selbe kennzeichnung haben, wird immer nur die neueste angesprochen).
das "stadtwache" könnt ihr auch ändern, wenn ihr die wachen zb. wache_x nennen wollt, einfach das "stadtwache" austauschen.

was die wachen machen, könnt ihr natürlich auch noch ändern, ihr müsst nur den code bei
AssignCommand(oWache,ActionMoveToObject(oPC,TRUE)); //lauf zum spieler
verändern (das kann man natürlich auch weglassen ;) ).
solange das clearallactions und speakstring bleibt (aufhören mit rasten bzw. nachricht), habt ihr freie auswahl (angreifen, gold abnehmen, wegjagen... ;) )

wenn ich mich nicht täusche (habs nicht getestet) wird das script im mp nicht richtig funktionieren, da auf den spieler per GetFirstPC(); zugegriffen wird; funktioniert zwar problemlos bei einem spieler, bei mehreren wird er aber meistens nicht den rastenden spieler auswählen. falls jemand ne möglichkeit weiß, aus der spielerliste den rastenden rauszufiltern bitte posten :)
(ich habs probiert mit:

if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler1?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler2?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler3?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler4?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler5?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler6?
if(GetIsResting(oPC) == FALSE) oPC = GetNextPC(); //rastet spieler7?
if(GetIsResting(oPC) == FALSE) return; //wenn keiner rastet, hoer auf

da erkennt er aber nichtmal mehr dass spieler1 rastet...
naja, ist ja eh eher für den sp gedacht ;)

@lighthawk kannst natürlich auch ins buch übernehmen :) ;)

lob, kritik und anregungen natürlich erwünscht :)

mfg jf

achja: falls ihr irgendwelche scriptwünsche habt, sagt mal, mir ist nämlich immer so langweilig :D
17.07.2002, 19:21 #2
Gawain15
Beiträge: 1.084

n1, enemy down!

Ich hab einen Scriptwunsch :) Ich möchte das ich in einem Zauberwald umher hüpfen kann sooooooooooo hoch wie ein Hooooochhaus und die Bäume sollen mit mir reden und zwar sollen sie sagen das ich heute richtig toll aussehe und das ganze soll passieren sobald ich die "Zauberpilze" esse :) Ok das war nur ein Scherz... aber das ist eine gute Idee sobald man den Pilz benutz wird der Spieler in den Zauberwald teleportiert... sprechende Bäume sind auch kein Problem nur das hüpfen :D
18.07.2002, 08:50 #3
Arkcroth
Beiträge: 68
@jf = Wunschskript hier...
Also ich als Niete was das Scripten angeht hat hier 2 warscheinlich leichte Scripte die 2 Wachen von mir bekommen sollen.

Ich hab auch schon alles vorbereitet (Unique-Tags, Wegpunkte and so on... sollte was fehlen sag es). Die Tags der Objekte trage ich in eckigen Klammern ein [TAG].

Fangen wir mit dem leichten an.
Wache1[GuardSit] soll sich auf einen Schemel[schemel] setzen und sich zum Bratenspiess[CampfirewithSpit_1] ausrichten (setzen kann er sich bei mir schon schaut aber immer in die falsche Richtung).
Wenn man die Wache anspricht soll er nur sagen "Ich bin beschäftigt" (nicht im Dialog sondern nur über seinem Kopf)
OPTIONAL: Wache1 benutzt den Bratenspiess (dreht das teil oder so)

Und jetzt kommt der schwierige Teil:
Wache2[GuardGotoPatrol] soll als erstes auf folgenden Wegpunkten laufen [bridgepatrol_waypoint1, bridgepatrol_waypoint2, bridgepatrol_waypoint3, bridgepatrol_waypoint4, bridgepatrol_waypoint5] danach zu Wache1[GuardSit] gehen, kurz den Bratenspiess[CampfirewithSpit_1] anschauen (so um die 2 Minuten) und dann wieder zum ersten Wegpunkt gehen [bridgepatrol_waypoint1] dort eine Minute warten und wieder ALLE Wegpunkte ablaufen.
Danach wieder zum ersten Wegpunkt[bridgepatrol_waypoint1] gehen 5 Minuten warten.
Danach geht diese Aktionskette wieder von vorne los.
OPTIONAL: Wache2 könnte statt nur auf den Bratenspiess zu schauen etwas dazu sagen... so wie "Hmmmmm... sieht lecker aus."


IST SOWAS MACHBAR? Und ist es so schwierig wie es sich anhört.

so und jetzt will ich sehen wie JF sein Versprechen einhält.

seeya
Ark
18.07.2002, 09:06 #4
Lucifer2123
Beiträge: 11

Ich weiß nicht, ob du mir helfen kannst. Ich bräuchte mal ein Script, mit dem man mehr als einen Henchman aufnehmen kann.

Vielleicht kannst du mir ja helfen.
18.07.2002, 09:22 #5
Targeteron
Beiträge: 5

zu dem wachenscript: warum nich ein OnPerception UserDefined event bei der wache daraus machen und einfach checken ob das letzte was er gesehen hat ein PC ist, und wenn es ein pc ist ob der rastet, wenn er das tut, anlabern? dann ist es a) egal wieviele wachen es gibt und b) relativ egal wieviele leute in einem MP spiel sind würd ich denken.
18.07.2002, 17:44 #6
Leman Russ
Beiträge: 47

Ist es nicht möglich das ganze auch nur für eine bestimmte Region des Moduls zu verwenden? Denn es ist ziemlich seltsam wenn in einer Untotenverseuchten Gruft, oder vom Gegner besetzten Burg plötzlich Stadtwachen auftauchen!

greetz Leman Russ
18.07.2002, 18:44 #7
jf
Beiträge: 26

sooodala... :)
@gawain
void main()
{
object oPC = GetLastUsedBy();
object oZauberwald = GetObjectByTag("zauberwald");
SpeakString("Die Pilze haben einen sehr seltsamen Geschmack...");
AssignCommand(oPC,JumpToObject(oZauberwald));
}

die "pilze" müssen ein placeable sein (am besten kategorie parks und natur), da ich keinen weg gefunden habe, ein item zu benutzen.
bei den eigenschaften dann "benutzbar" wählen und obigen code ins onused ereignis einfügen

@leman russ
das ist kein problem, du kannst ein komplettes riesiges modul machen, kannst 100 areas machen ohne wachen und dann bei einer einen haufen, du wirst (hoffe ich :D ) nur in der nähe von diesen vom rasten abgehalten werden.
solange die anzahl und die nummerierung stimmt, kannst du die wachen verteilen wie du willst :)

@targeteron
muss ich mal probieren ;)
sowas in der art hatte ich aber iirc auch schon, hat aber nicht geklappt... aber mal schauen ;)

@die anderen
ich versuch so schnell wie möglich eure wünsche zu erfüllen :)

mfg jf
18.07.2002, 20:22 #8
Gawain15
Beiträge: 1.084

JF: Das war nur ein Scherz wie schon erwähnt und du hast auch nen Fehler drin (glaub ich da noch nicht getestet) wenn du GetObjectBy... nimmt er Objekte aber keine Location oder Area dafür gibt es ja den schönen Befehle GetArea :)
18.07.2002, 20:25 #9
jf
Beiträge: 26

ne, geht auch so wunderbar
18.07.2002, 20:39 #10
Gawain15
Beiträge: 1.084

Naja... wie auch immer. Was soll eigentlich der Nick heißen? Jayfrog von Scooter?
18.07.2002, 21:42 #11
Nizidraman
Beiträge: 1.171

Ich hätt auch noch was:( ich selbst hab es bisher nicht geschaft :rolleyes:) So ein Skript, das sich meldet, wenn man ein Fass oder ein Behälter öffnet. (so a la BG2).
18.07.2002, 21:58 #12
Gawain15
Beiträge: 1.084

Schonmal OnOpen probiert?
19.07.2002, 10:48 #13
sengir
Beiträge: 44

Mal ne Frage zu dem Script,
ich möchte das gerne modifizieren und zwar sollen die Wachen noch folgendes machen:

Random Walk während spawn (wenn ich das random walk unter onspawn einfüge laufen die wachen nicht mehr zum PC hin wenn er sich ausruht) - müsste sicher mit in das hauptscript rein von jf (ich weiss leider nicht an welcher stelle und ob nur random walk reicht (oder in verbindung mit den assign commands?)
Dann sollen die Gold vom PC nehmen (klappt auch nicht wenn ich das ins hauptscript reinschreibe - habs wahrscheinlich an die falsche stelle gepackt).
Und zu guter letzt soll man mit den wachen sprechen und wenn man fertig ist mit denen zu reden sollen die weiter random walk machen (klappt bei mir net - immer wenn ich die anspreche bleiben die stehen und machen gar nix mehr)

Kann mir jmd sagen ob dies klappt und wo ich die 3 Punkte (in welche Zeile und mit welchem command) einfügen kann?
19.07.2002, 14:59 #14
jf
Beiträge: 26

@sengir
das ActionRandomWalk(); gehört in die onspawnscripte der einzelnen wachen; wenn er jetzt gespawnt wird, läuft er solange zufällig rum bis irgendwas besonderes passiert (du ihn zb. anquatscht); deshalb musst du in das onConversation-Script der wachen nochmal ActionRandomWalk(); schreiben.
gold nehmen und weiter zufällig laufen nach dem "ihr duerft hier nicht rasten"-satz gehören ins hauptscript.

der code muss dann so modifiziert werden:

if(GetObjectSeen(oPC,oWache) == TRUE || GetObjectHeard(oPC,oWache)) //wenn der spieler gehoert oder gesehen wird
{
AssignCommand(oPC,ClearAllActions()); //stopp das ausruhen
AssignCommand(oWache,SpeakString("Ihr duerft hier nicht rasten!")); //sage dem spieler dass er nicht rasten darf
AssignCommand(oWache,TakeGoldFromCreature(50,oPC)); //nimm 50 gold vom spieler
AssignCommand(oWache,ActionRandomWalk()); //lauf weiter rum
return; //hoer auf
}

wenn du irgendwelche aktionen nicht direkt betroffenen personen zuordnen willst (zb. dass wenn du eine kiste öffnet dein char etwas sagt; wenn du das in das onOpen-script der kiste packst, würde bei SpeakString("bla"); die kiste und nicht dein char das sagen)
dann musst du AssignCommand(oChar,Aktion); benutzen (für aktion halt das was er machen soll, zb. gold wegnehmen, sprechen...

ich vermute mal dass da dein fehler war ;)

@argos
da hat gawain mal wieder recht
einfach ins onOpen-script des behälters
SpeakString("blablabla");
usw...

@gawain
nein, mein nick hat wirklich nix mit scooter zu tun, das sehe ich als beleidigung :D
ist nur je der erste buchstabe von meinem vor- und nachnamen... einfallsreich, gell
und mein avatar is die hypnosekröte aus futurama ;)
24.07.2002, 09:53 #15
sengir
Beiträge: 44

Gruesse jf,
ich hab das script mal ausprobiert und es funzt so halb richtig ;)
Die Wachen laufen erst random rum wenn ich mich im bereich ausruhe, jedoch laufen sie dann nicht mehr zum spieler hin.
Der Rest klappt ansich alles perfekt.

Kann man da evtl noch was dran machen das es so klappt das sie ständig random rumlaufen (bei dem alten 1. script stehen sie ja leider nur rum und wenn man da random irgendwo reinpackt machen die die gleiche sache - laufen ständig rum aber nicht mehr zum spieler und quatschen ihren satz von da wo sie gerade stehen) und wenn sich jmd ausruht das sie dann alles sein lassen, zum spieler laufen, das gold nehmen, den satz sagen und von da an weiter random laufen?
Ich hab versucht das random mal vorher einzugeben - das hat allerdings nicht geklappt.

danke und bye sengir
26.07.2002, 17:59 #16
Arkcroth
Beiträge: 68
schade...
jf scheint sich den Thread nicht mehr anzuschauen.

Schade... ich dachte mir könnte jemand mit diesen beiden "Monster"-Scripts helfen.

seeya
Ark
Seite 1 von 1  1