World of Gothic Archiv > NWN-Hilfe
Script Frage ;)
Seite 2 von 2  1  2 
17.07.2002, 23:27 #26
Gawain15
Beiträge: 1.084

So nachdem der böse Virus vernichtet wurde konnte ich auch wieder den Editor benutzen und habe mich an eine Lösung des Problems gemacht, es geht!

Also du machst zu erst den Kellner bei OnSpawn fügst du folgendes Script ein:

void main()
{
SetListenPattern(OBJECT_SELF, "**", 777); //Die Zahl kann alles sein und ** stellt sicher das er auch alles hört
SetListening(OBJECT_SELF, TRUE); //nochmal sichergehen das er auch zu hört
}

so und bei OnConversation fügst du das hier ein:

void main()
{
int iHoeren = GetListenPatternNumber();
string sRufen;

if(iHoeren == 777)
{
sRufen = GetMatchedSubstring(0);
if(sRufen == "Kellner")
{
object oPC=GetFirstPC();
object oNPC=GetObjectByTag("Kellner");
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, ActionMoveToObject(oPC));
AssignCommand(oNPC, ActionStartConversation(oPC));

}
}
}

Nach dem If kann man natürlich beliebige andere Aktionen einfügen, die Möglichkeiten sind also nahezu unbegrenzt. Ich hab mal eine Tür gemacht die Unverwundbar und Unknackbar ist und man kann sie nur mittels eines Passwortes öffnen das ist gut für Rätsel damit die Spieler auch mal ein wenig Denkarbeit leisten müssen :)
17.07.2002, 23:38 #27
Levi
Beiträge: 43

wow, das ist ja genial!
Hätt nich gedacht dass das geht. *froi*

Aber wärs nicht cleverer bei SetListenPattern statt ** gleich "Kellner" einzugeben? So wie ich das verstanden habe würde der Kellner dann nur auf dieses Wort hören, und damit könntest du dir einige aufrufe des anderen Skripts sparen. Würde zwar nix am Endergebnis ändern, aber n biserl weniger CPU-Last produzieren.
Oder hab ich das jetzt auf die schnelle falsch verstanden?
17.07.2002, 23:52 #28
Gawain15
Beiträge: 1.084

Ja schon aber warum einfach wenns auch kompliziert geht? :) Ich bin davon ausgegangen das er mehrere Worte verwenden möchte also Kellner, Ober, Bedienung etc. und dann muss er ja auf alles hören, dann musste ja nur die If abfrage mit oder (||) erweitern... also der einfachheit halber habe ich es gleich schwieriger gemacht... du merkst ich versuche deiner Frage auszuweichen :) Aber ich dneke das bischen Arbeit wird den Compi schon nicht umbringen.
18.07.2002, 09:58 #29
mephi
Beiträge: 39

Geil, vielen Dank ;)

Gawain, du bist ein Gott
und die Idee mit der Tür und dem Rätsel ist auch nicht schlecht.

So ich setz das ganze gleich mal um!

thx thx thx

*edit*
hm, ich schaffs trotzdem nicht ;)

verträgt sich das mit dem was schon bei onconversation drinsteht nicht?

habs auch mal bei den kreaturen eigenschaften unter gespräch eingefügt...

ich bin darin absoluter nub.. also net böse sein
18.07.2002, 11:14 #30
Levi
Beiträge: 43

quote:
Zitat von Gawain15
Ja schon aber warum einfach wenns auch kompliziert geht? :) Ich bin davon ausgegangen das er mehrere Worte verwenden möchte also Kellner, Ober, Bedienung etc. und dann muss er ja auf alles hören, dann musste ja nur die If abfrage mit oder (||) erweitern... also der einfachheit halber habe ich es gleich schwieriger gemacht... du merkst ich versuche deiner Frage auszuweichen :) Aber ich dneke das bischen Arbeit wird den Compi schon nicht umbringen.


Hehe, ehrlich gesagt gings mir nur darum ob ich verstanden hab wie das Skript funzt. ;)

@mephi: Kannst du mal dein OnConversation-Skript posten, vielleicht erkennen wir dann den fehler.
18.07.2002, 12:53 #31
mephi
Beiträge: 39

#include "NW_I0_GENERIC"

void main()
{ int iHoeren = GetListenPatternNumber();
string sRufen;

if(iHoeren == 777)
{
sRufen = GetMatchedSubstring(0);
if(sRufen == "Kellner")
{
object oPC=GetFirstPC();
object oNPC=GetObjectByTag("Kellner");
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, ActionMoveToObject(oPC));
AssignCommand(oNPC, ActionStartConversation(oPC));
}
}
---
das war meins und nun folgt das schon vorhandene
---
int nMatch = GetListenPatternNumber();
object oShouter = GetLastSpeaker();
object oIntruder;

if (nMatch == -1 && GetCommandable(OBJECT_SELF))
{
ClearAllActions();
BeginConversation();
}
else
if(nMatch != -1 && GetIsObjectValid(oShouter) && !GetIsPC(oShouter) && GetIsFriend(oShouter))
{
if(nMatch == 4)
{
oIntruder = GetLocalObject(oShouter, "NW_BLOCKER_INTRUDER");
}
else if (nMatch == 5)
{
oIntruder = GetLastHostileActor(oShouter);
if(!GetIsObjectValid(oIntruder))
{
oIntruder = GetAttemptedAttackTarget();
if(!GetIsObjectValid(oIntruder))
{
oIntruder = GetAttemptedSpellTarget();
if(!GetIsObjectValid(oIntruder))
{
oIntruder = OBJECT_INVALID;
}
}
}
}
RespondToShout(oShouter, nMatch, oIntruder);
}


if(GetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(1004));
}
}


Er konvertiert es ohne Fehler, also die Klammern dürften stimmen ;)
18.07.2002, 13:00 #32
Levi
Beiträge: 43

Öhm, kann sein dass ich das jetzt mißverstehe, aber du weist dass du nur eine main-methode haben darfst?
Den neuen Code solltest du ans ende der bestehenden main-methode, vor der letzten "Klammer zu" einfügen.
18.07.2002, 13:04 #33
mephi
Beiträge: 39

Hm, so hab ich es doch gemacht.

Nur ist das 2. halt ziemlich lang und enthält selber natürlich Klammern...
oder wie schaut das sonst aus?

braucht man das was vorher drin stand überhaupt?
18.07.2002, 13:17 #34
Levi
Beiträge: 43

Hm, bei mir klappts. Hat dein Kellner auch das Tag (zu deutsch Kennzeichnung) "Kellner"?
Sonst musst du das nämlich im GetObjectByTag ändern!
Oder du machst gleich oNPC=OBJECT_SELF draus.
Außerdem musst du beachten dass bei dem was gerufen wird. Groß-/Kleinschreibung unterschieden wird. "Kellner" ist also was anderes als "kellner".
18.07.2002, 14:22 #35
mephi
Beiträge: 39

ok, dann lags an dem object
der hat nämlich einen Namen
thx
18.07.2002, 17:33 #36
jf
Beiträge: 26

das mit der groß/kleinschreibung könnt ihr übrigens beheben, indem ihr folgendes macht:
string sRufenKlein = GetStringLowerCase(sRufen);
if(sRufenKlein == "kellner")
{
(...)
}

so ist es egal, ob das wort groß, klein oder gemischt geschrieben wird :)

mfg jf
Seite 2 von 2  1  2