World of Gothic Archiv > NWN-Hilfe
Toolset Fragen
Seite 2 von 2  1  2 
14.06.2004, 18:40 #26
Deathlord
Beiträge: 513

Gibt es ne Möglichkeit, die verschiedenen Umgebungssets(?) also z.B. Wald und. Ländlich zu kombinieren, also dass ich z.B. in den Wald ne Taverne setzten kann?
17.06.2004, 15:00 #27
Kardor
Beiträge: 523

möglich ist das, effektiv bedeutet es aber ein neues Tileset zu erstellen und das ist nicht ganz unaufwändig ( und macht ein hakpack extrem gross )

Schau dich mal auf der nwvault.com um, da gibts ne Menge Tilesetskombnationen zum herunter laden, dann musst du dir die Arbeit nicht selbst machen.
23.06.2004, 16:48 #28
Deathlord
Beiträge: 513

Schaut euch mal dieses Skript an(ist in OnConversation):
code\:

void main()
{
switch(Random(5))
{
case 0:
ActionSpeakString("Text1", TALKVOLUME_TALK);
break;

case 1:
ActionSpeakString("Text2", TALKVOLUME_TALK);
break;

case 2:
ActionSpeakString("Text3", TALKVOLUME_TALK);
break;

case 3:
ActionSpeakString("Text4", TALKVOLUME_TALK);
break;

case 4:
ActionSpeakString("Text5", TALKVOLUME_TALK);
break;
}
}



Wenn man den NPC anspricht, sollte ein Zufallssatz (also 1-5) erscheinen. Das klappt auch, bis auf Satz 5. Der kommt irgendwie nie vor.
TALKVOLUME_TALK sollte ja dafür sorgen, dass der NPC etwas sagt (aus dem Soundset das man ihm gegeben hat). Das tut er aber leider nicht.


___________________________

--currently more or less inactive ;)--[/font]
23.06.2004, 19:16 #29
Kardor
Beiträge: 523

Hmm deine Randomfunktion sieht richtig aus, keine Ahnung warum das nicht geht.
kanns grade nicht überprüfen.

Edit: die Random-Funktion in NWN ist aber afaik eh neu, mag sein, dass die nen Bug hat.
Ich benutze immer die d20, d10,d6, d4, d2 Funktion bei der der jeweilige Würfel simuliert wird...also d20 für einen zwanzigseitigen Würfel usw...das hat irgendwie auch sowas angenehm rollenspielartiges :D

Grosser Nachteil ist natürlich, dass du keine Zufallsfunktion mit 5 machen kannst, sondern nur mit Würfeln.
Probiers mal spasseshalber mit 6 Sätzen und der Funktion d6(1) statt Random.
( dann muss dein erster case allerdings case 1 lauten, da ja das niedrigste Ergebnis auf einem Würfel 1 und nicht null ist )


aber TALVOLUME_TALK setzt die "Lautstärke"
( also auch die Entfernung in der der Spieler es noch lesen kann und im Chatfenster angezeigt bekommt) des Gesprochenen auf TALK also Reden das gehört da auch hin wo du es jetzt hast.

Was du meinst ist VOICE_CHAT_...
das musst du aber extra aufrufen
Einfach in die Zeile nach ActionSpeak...
jeweils ein

PlayVoiceChat( VOICE_CHAT_HELLO, OBJECT_SELF);

statt VOCE_CHAT_HELLO knanst du auch ein anderes VOICE_CHAT nehmen, da gibts einige von
24.06.2004, 11:17 #30
Deathlord
Beiträge: 513

Hmm danke. Jetzt geht auch die Randomfunktion ganz. Keine Ahnung worans lag.:)
Ok das mit dem VoiceChat muss ich mal testen.
Hast Recht mit den Würfeln, das erinnert mich an BG:D

Edit:
Ich habs auch mal über ein Gespräch probiert, das klappt auch gut. Einfach dem NPC ein Gespräch geben mit z.B. 5 Sätzen, und jeden auf 20% einstellen. Dann gibts auch automatisch nen Sound.

Greetzens Deathlord
25.06.2004, 18:46 #31
Deathlord
Beiträge: 513

Moinsen mal wieder.
Mit dem Skript-Wizard kann man ja z.B. abfragen, ob ein Gegenstand im Gepäch ist. Aber wie kann ich abfragen ob z.B. 100 von einer Sorte (z.B. Pfeile) vorhanden sind. Ich kann nicht einfach in der Arg-Liste die Anzahl oder so adden afaik.
26.06.2004, 14:59 #32
$tormRider
Beiträge: 208

Bei Gegenständen, die man auf einen Stapel legen kann(also Pfeile, Tränke, Bolzen...) brauchst du GetItemStackSize().
Bei Gegenständen, wie Waffen, Rüstungen, Schädel..., ist es afaik schwerer(jedenfalls hab ich noch keinen einfachen Weg gefunden :D )
28.06.2004, 15:16 #33
Deathlord
Beiträge: 513

Ok gib bitte mal ein Beispiel-Skript.
28.06.2004, 17:21 #34
$tormRider
Beiträge: 208

code\:
int StartingConditional()
{
object oPC = GetLastSpeaker();

if(GetItemPossessedBy(oPC, "tag des gegenstandes") != OBJECT_INVALID) //Diese Zeile ist eigentlich unnötig
{
if(GetItemStackSize(GetItemPossessedBy(oPC, "tag des gegenstandes")) == Anzahl)
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE; //wenn man das erste if weglässt braucht man das hier auch nicht.
}
}

Das funktioniert aber wie gesagt nur bei "stapelbaren" Gegenständen :)
07.07.2004, 19:23 #35
Deathlord
Beiträge: 513

Wie kann ich Hak-Paks verwenden? Also zuerst kopiere ich die .erf und die .hak in die entsprechenden Verzeichnisse, dann adde ich im Modul via Eigenschaften die HakPaks die ich verwenden will. Aber wie kann ich jetzt darauf zugreifen? Zum Beispiel auf neue Tilesets? Ich kann sie nicht beim Gebiet erstellen auswählen, und Monster etc. sind nicht in der Liste. Was genau muss ich machen?
Please answer asap (ok macht ihr eh immer;))
09.07.2004, 15:24 #36
Deathlord
Beiträge: 513

Hallo will ja nicht nerven, aber ist jemand zu Hause?:D ;)
09.07.2004, 15:55 #37
Kardor
Beiträge: 523

Oh sorry, den post hab ich übersehn.

Also eigentlich müsstest du das neue Tileset beum Erstellen eines Gebietes auswählen können, nachdem du das Hakpack eingebunden hast.

Da gibts keine weiteren Schwierigkeiten.

Bei den Monstern ist es oft so, dass nur das Model importiert wird, du musst also das neue Aussehn suchen wenn du ein neues Monster erstellts - aber eigentlich sind genau dafür die .erf-Dateien da die du importiert hast.

Die .erfs musst du aber noch mit Datei/ Resoourcen importieren einbinden.
25.07.2004, 12:00 #38
Deathlord
Beiträge: 513

Seht euch mal Folgendes an:
code\:

object oNPC = GetObjectByTag("Mein_Toller_NPC");
object oLocation = GetWaypointByTag("Mein_Toller_Waypoint");

void main()
{
AssignCommand(oNPC, ActionMoveToLocation(GetLocation(oLocation)));

SetFacing(100.0f);

if(Random(3) == 0 && IsInConversation(OBJECT_SELF) == FALSE)
{
SpeakOneLinerConversation();
}
if(IsInConversation(OBJECT_SELF) == FALSE)
{
ActionPlayAnimation(ANIMATION_LOOPING_SIT_CROSS,1.0,4000.0);
}

}



Das Problem ist, dass die Aktionen nicht hintereinander ausgeführt werden, obwohl sie das ja normalerweise sollten.
Der NPC sollte zuerst zum WP laufen, sich dann ausrichten, und sich schließlich hinsetzen.
Er dreht sich aber zuerst, läuft zum WP, und setzt sich gar nicht hin. Wo liegt der Fehler, bzw. wie kann man das Problem vermeiden?


___________________________

--currently more or less inactive ;)--[/font]
25.07.2004, 15:02 #39
Kardor
Beiträge: 523

Also:

ActionMoveToLocation ist ein Befehl, der in die Action-Que des Charakters aufgenommen wird, er wird erst ausgeführt wenn der Char keine anderen Actions mehr in seiner Que hat, im Gegensatz dazu ist SetFacing eine Funktion, die sofort ausgeführt wird, deshalb macht er das zuerst.

Bei der Sache mit der Animation , ist es vermutlich ähnlich. Mit ActionPlayAnimation kommt der Befehl erstmal in die Action-Que, leider passiert es ziemlich oft, dass der Befehl dann "verloren" geht, wenn die vorherige Aktion "zu lange" dauert.
Du könntest ActionPlayAnimation durch PlayAnimation ersetzen, dann führt sie der Char auf jeden Fall aus...Problem ist nur, dass er das auch wieder sofort tun würde.

An deiner Stelle würd ichs mit folgendem Workaround versuchen:

mach einen Trigger, an der Stelle an der
der NPC(?) sich drehen soll und einen an
der, an der er sich hinsetzen soll, in dem Trigger fragst du ab, ob es sich auch um deinen NPC handelt und lässt ihn dann seine Aktion ausführen.

Du könntest natürlich auch, alle Aktionen mit DelayCommand verzögern und timen, aber es kann ziemlich tricky werden genau einzuschätzen, wie lange ein Char braucht um irgendwohin zu kommen...falls er aufgehalten wird führt er dann seine Aktionen womöglich am falschen Ort aus.

Die Lösung mit den triggern ist zwar etwas aufwändiger, funzt aber zuverlässig.
26.07.2004, 13:36 #40
Deathlord
Beiträge: 513

Vielen Dank, ich werde es wohl mal mit einem Trigger versuchen, ich glaube beides an einer Stelle wollte ich ohnehin. Ich hatte es mal mit ActionWait() versucht, aber die wird auch direkt ausgeführt. Das Problem ist, wie du sagst, dass der NPC OnPerception eine Koversation anfängt, und man weiß nicht wo der PC steht.
THX:)

Edit:
Kann man eigentlich irgendwo sehen, ob die Aktion zu der einen oder anderen Sorte gehört?
26.07.2004, 14:05 #41
Kardor
Beiträge: 523

quote:
Kann man eigentlich irgendwo sehen, ob die Aktion zu der einen oder anderen Sorte gehört?


grob gesagt: Alles was ein Action im NAmen führt kommt in die Aktionsque, alles andere wird sofort ausgeführt.

Nochn kleiner tipp: Vergiß ActionWait. Das hat bei mir noch nie getan was es sollte.
Verwende stattdessen lieber DelayCommand.
26.07.2004, 14:08 #42
Deathlord
Beiträge: 513

Danke, werds mir merken.
PS: Und da war er auf der zweiten Seite:D Ich habe wirklich schon eine Menge gefragt hier. Und eine Menge Antworten bekommen.:)
26.07.2004, 15:18 #43
Deathlord
Beiträge: 513

*Kardor nerv*
Kleines Prob dabei:
Wenn ich mich im Skript des Triggers bei einer Aktion auf einen NPC beziehen will (und die Aktion darauf nicht ausgelegt ist), nehme ich ja einfach AssignCommand().
Wenn ich aber keine Aktion sondern z.B. SetFacing() nehmen will ;) geht das nicht. Ich habe aber nichts gefunden mit dessen Hilfe ich das machen könnte.
Natürlich könnte ich einfach eine Variable erhöhen, die im OnHeartbeat Skript des NPCs mit if geprüft wird nehmen, aber das wäre ein bischen umständlich. Außerdem wäre es generell gut das zu wissen.
//Sorry for Doppelpost, aber ich brauche eine schnelle Antwort:D ;)
26.07.2004, 20:52 #44
Kardor
Beiträge: 523

ging nicht früher.

mach den trigger möglichst klein und setze den Waypoint an den Rand des Triggers.
Dann füg noch ein
code\:

AssignCommand(oDeinNPC, ClearAllCommands() );

vor dem SetFacing ein und es sollte gehn.
27.07.2004, 14:20 #45
Deathlord
Beiträge: 513

Danke, das ist gut zu wissen. Ich habe aber auch noch eine etwas andere Lösung gefunden:
Beim Trigger OnEnter wirde eine Variable erhöht, diese wird beim OnHeartbeat Skript des NPCs geprüft, dann wird die Aktion ausgeführt. Bei OnExit wird die Variable wieder zurückgesetzt. Bischen umständlich, aber es klappt:D Ich probiere aber mal noch die andere Variante.
Noch mal ein fettes Thx.
12.08.2004, 13:54 #46
Deathlord
Beiträge: 513

Jetzt stehe ich wieder vor dem gleichen Problem. Ich muss in einem OnEnter-Skript den Player ansprechen.
Da aber dieser kein zugängliches OnHeartbeat-Skript hat, brauche ich eine andere Lösung und kann nicht wie das letzte Mal ausweichen.
Wie gesagt funktioniert folgendes nicht:
AssignCommand(), da es keine Aktion ist.
oder:
AssignCommand(Spieler, ActionDoCommand(....));
es wird wieder nur eine Aktion angesprochen.
So wie Kardor es oben geschrieben hat, geht es auch nicht. Es wird wahrscheinlich doch nicht der Player angesprochen.

Fazit:
Ich suche also praktisch einen Erstatz für AssignCommand(), der eben keine Aktion (also etwas mit ActionTueDiesOderDas) anspricht, sondern eine andere "Anweisung", bzw. eine Möglichkeit das Problem zu umgehen.
(Es wäre irgenwie schon komisch wenn es so etwas gar nicht gibt, also habe ich es wahrscheinlich nur nicht gefunden ;) )

Wäre nett wenn ihr mir wieder helfen könntet :)
12.08.2004, 14:29 #47
Kardor
Beiträge: 523

sorry aber ich kann dir nicht folgen. Was genau soll passieren und was funktioniert nicht? der Reihe nach bitte ;)
12.08.2004, 15:49 #48
Deathlord
Beiträge: 513

Die Frage war nur generell gemeint.
Wie gesagt:
Gibt es eine Möglichkeit, z.B. bei Set Facing, festzulegen, welche Person gemeint ist.
So etwas würde ja nicht gehen:

AssignCommand(oPC, SetFacing(DIRECTION_NORTH));

Und zwar da SetFacing nicht ACTIONSetFacing heißt. Daher suche ich für diesen Fall eine Alternative zu AssignCommand().
Ist jetzt deutlich was ich meine?;)
12.08.2004, 17:02 #49
Kardor
Beiträge: 523

äh nee sorry, verstehe dein Problem immer noch nicht.

AssignCommand(oPC,SetFacing(DIRECTION_NORTH);

funktioniert wunderbar ( abgesehn davon , dass am Ende eine Klammer fehlt ).

AssignCommand fügt nicht automatisch etwas der ActionQue hinzu.

Wenn du z.B. mehrer Befehle hintereinander hast, z.B.
code\:


AssignCommand(oPC, ActionBlabla(...));
AssignCommand(oPC, ActionWasAnderes(...));
AssignCommand(oPC, SetFacing(...));



dann wird SetFacing mit grosser Wahrscheinlichkeit als erstes ausgeführt, weil es ganz oben auf den Action-Stack gelegt wird.


___________________________

Pilze Band I - das NWN Modul ;)
Niemand hat die Absicht eine Mauer zu baun. Außer uns!
[/font]
13.08.2004, 08:31 #50
Deathlord
Beiträge: 513

Hmm. In der Syntaxbeschreibung von AssignCommand() steht aber ungefähr sowas:
AssignCommand(ActionSubject, ACTIONToDo);
Also ging ich davon aus dass diese Aktion mit ACTION anfangen muss(also z.B. ActionStartConversation, aber nicht SetFacing).
Also dachte ich
AssignCommand(oPC, SetFacing(DIRECTION_NORTH));
würde nicht funktionieren, und das hat es auch nicht. Wahrscheinlich muss ich mich dann vertippt haben.
Ich muss das nochmal testen, wenn es geht, dann ist meine Frage damit beantwortet.;)

Edit:
Jep, das funktioniert tatsächlich.:) Muss mich damals wohl vertippt haben.
Seite 2 von 2  1  2