World of Gothic Archiv > NWN-Hilfe
Item Übergabe
Seite 1 von 1  1 
21.07.2002, 20:17 #1
mephi
Beiträge: 39
Item Übergabe
Hi
wenn ich mit

.
..

object oPC=GetFirstPC();
object oNPC=GetObjectByTag("lich_king");
object okey_1=GetObjectByTag("key_1");
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));
.
.
.

ein item übergeb, muss das im inventar sein?

also ich benutz das um schlüssel abzugeben die dann benutzt werden um in einem speziellen raum zukommen
wenn ich nun 100 schlüssel bei dem char ins inventar geben muss wäre das schlecht...
dann bräuchte ich ein befehl bei dem egal ist ob der gegenstand im inventar des NPCs ist ;)

alles verstanden? ich weis ich bin ein verrücktes genie..
thx im vorraus
22.07.2002, 08:11 #2
Gawain15
Beiträge: 1.084

Ich weiss nicht wie genau der Befehl lautet.... kuck gleich mal genauer nach irgendwie so in der Art von "CreateItemOnObject"...
22.07.2002, 08:22 #3
Gawain15
Beiträge: 1.084

CreateItemOnObject("nw_arhe005", oPC, 1);

"nw_arhe005" ist ein Helm... du musst die ResRef von deinem Gegentand angeben.
22.07.2002, 16:17 #4
Paleswift
Beiträge: 154

Dabei wird der Gegenstand aber nicht wirklich übergeben.. sondern im Inventory des oPC erzeugt ;) Das ist etwas vöööööllig anderes!
22.07.2002, 16:51 #5
Gawain15
Beiträge: 1.084

Wieso das denn bitte? Du gibst dem NPC den Gegenstand einmal im Gepäck damit er ihn droppt wenn du ihn tötest das reicht doch, der spieler kriegt net mit ob der Erzeugt wird oder übergeben...
22.07.2002, 16:53 #6
Paleswift
Beiträge: 154

Das war als Scherz gemeint.. allerdigs giebt es tatsächlich einen Unterschied.. Wenn der Spieler den Gegenstand bekommen hat, und den NPC dann tötet, hat er ihn ja schon 2 mal, oder?
22.07.2002, 20:12 #7
Gawain15
Beiträge: 1.084

Bei CreateObject muss der Gegenstand nicht im Gepäck des NPC sein da er ja generiert wird, ich meinte das nur falls man den NPC tötet das man den Schlüssel trotzdem bekommt und nicht dumm da steht.
23.07.2002, 19:29 #8
mephi
Beiträge: 39

Soo ich bin nun wieder Zuhause
auf der LAN hab ich das script etwas erweitert ..(als mir langweilig war *g*) es soll eine Art Sicherheitskontrolle werden *G*

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

if(iHoeren == 777) // das dürftest du noch kennen *g*
{
sRufen = GetMatchedSubstring(0);
if(sRufen == "Losungswort") //erklärt sich von selbst
{
object oPC=GetFirstPC();
object oNPC=GetObjectByTag("lich_king"); // ein NPC der auf nix auser dem Losungswort reagiert
object okey_1=GetObjectByTag("key_1");
AssignCommand(oNPC, ClearAllActions());
CreateItemOnObject("key_1", oNPC, 1);
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));

es funktioniert aber nicht
seht ihr einen Fehler? also eigentlich geht es.. hab das script ohne createitemonobject getestet (einfach mit schlüssel im gepäck)
24.07.2002, 08:14 #9
Paleswift
Beiträge: 154

Lass dir mal mit Hilfe der Funktion

void PrintString(string sString);

anzeigen, ob er in die if-Abfrage überhaupt rein geht.. vielleicht ist das innere gar net falsch, sondern das mit der Abfrage, nach dem Losungswort.



Also.. probier mal das aus:
code\:

void main()
{
// Check: Funktion wird betreten.
PrintString("Funktion aktiviert");
// -----------------------
int iHoeren = GetListenPatternNumber();
string sRufen;

if(iHoeren == 777) // das dürftest du noch kennen *g*
{
// Check: Wurde etwas gehört?
PrintString("Es wurde Patternnumber 777 aktiviert.");
// -----------------------

sRufen = GetMatchedSubstring(0);
// Check: Wurde das rictige gehört?
PrintString("Es wurde '" + sRufen + "' gehört!");
// -----------------------

if(sRufen == "Losungswort") //erklärt sich von selbst
{

// Check: Wurde das rictige gehört?
PrintString("Das gehörte stimmte mit dem Losungswort überein.");
// -----------------------

object oPC=GetFirstPC(); // Warum eigentlich FirstPC ? Wie wäre es mit 'GetLastSpeaker();'
object oNPC=GetObjectByTag("lich_king");
// ein NPC der auf nix auser dem Losungswort reagiert
object okey_1=GetObjectByTag("key_1");
AssignCommand(oNPC, ClearAllActions());
CreateItemOnObject("key_1", oNPC, 1);
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));
}
}
}




Wenn das nicht reicht.. mach noch mehr debugg Marker rein. dann sollteste sehen, zu welcher Stelle er nicht kommt. Und im Zweifelsfall Frag die bjekte noch etwas ab, also z.B.: 'GetIsObjectValid(oPC);' ..oder.. 'GetIsPC(oPC);'.. oder halt sowas.. Damit kannste schon einiges an Fehlern abfangen, bzw. rausfinden, worans hakt.


___________________________

c===|[:::::::::::::::::>
Ja! ich bin unfähg die Rechtschreibung zu beachteln.. und das isd auch dut so![/font]
24.07.2002, 13:14 #10
mephi
Beiträge: 39

quote:
Zitat von Paleswift
Lass dir mal mit Hilfe der Funktion

void PrintString(string sString);

anzeigen, ob er in die if-Abfrage überhaupt rein geht.. vielleicht ist das innere gar net falsch, sondern das mit der Abfrage, nach dem Losungswort.



Also.. probier mal das aus:
code\:

void main()
{
// Check: Funktion wird betreten.
PrintString("Funktion aktiviert");
// -----------------------
int iHoeren = GetListenPatternNumber();
string sRufen;

if(iHoeren == 777) // das dürftest du noch kennen *g*
{
// Check: Wurde etwas gehört?
PrintString("Es wurde Patternnumber 777 aktiviert.");
// -----------------------

sRufen = GetMatchedSubstring(0);
// Check: Wurde das rictige gehört?
PrintString("Es wurde '" + sRufen + "' gehört!");
// -----------------------

if(sRufen == "Losungswort") //erklärt sich von selbst
{

// Check: Wurde das rictige gehört?
PrintString("Das gehörte stimmte mit dem Losungswort überein.");
// -----------------------

object oPC=GetFirstPC(); // Warum eigentlich FirstPC ? Wie wäre es mit 'GetLastSpeaker();'
object oNPC=GetObjectByTag("lich_king");
// ein NPC der auf nix auser dem Losungswort reagiert
object okey_1=GetObjectByTag("key_1");
AssignCommand(oNPC, ClearAllActions());
CreateItemOnObject("key_1", oNPC, 1);
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));
}
}
}




Wenn das nicht reicht.. mach noch mehr debugg Marker rein. dann sollteste sehen, zu welcher Stelle er nicht kommt. Und im Zweifelsfall Frag die bjekte noch etwas ab, also z.B.: 'GetIsObjectValid(oPC);' ..oder.. 'GetIsPC(oPC);'.. oder halt sowas.. Damit kannste schon einiges an Fehlern abfangen, bzw. rausfinden, worans hakt.




quote:[/font]
Zitat von mephi
also eigentlich geht es.. hab das script ohne createitemonobject getestet (einfach mit schlüssel im gepäck)


Es liegt zu 100% am CreateitemOnObject
ohne das gings!
24.07.2002, 13:45 #11
Paleswift
Beiträge: 154

Okilidokili.. hab mir das grade von dir nochmal angeschaut und den Fehler gefunden..
Hier nochmal mit erläuternden Komentaren:

code\:


if(sRufen == "Losungswort") //erklärt sich von selbst
{
// Check: Wurde das rictige gehört?
PrintString("Das gehörte stimmte mit dem Losungswort überein.");
// -----------------------

object oPC=GetFirstPC(); // Warum eigentlich FirstPC ? Wie wäre es mit 'GetLastSpeaker();'
object oNPC=GetObjectByTag("lich_king");
// ein NPC der auf nix auser dem Losungswort reagiert
object okey_1=GetObjectByTag("key_1"); //Hier ist der Fehler..
// Warum?: Du versuchst ein Object zu holen, dass so noch nicht existiert.. nur als Vorlage. Daher ist okey_1 = OBJECT_INVALID
AssignCommand(oNPC, ClearAllActions());
CreateItemOnObject("key_1", oNPC, 1);
//.. so hier hast du soeben das Object erzeugt, auf das du aber jkeine Referenz dann hast.
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));
// Hier giebst du dann OBJECT_INVALID weiter.. was nicht funktioniert.. logisch.
}



Richtigrum siehts so aus (Reihenfolge geändert)
code\:


if(sRufen == "Losungswort") //erklärt sich von selbst
{
object oPC=GetFirstPC(); // Warum eigentlich FirstPC ? Wie wäre es mit 'GetLastSpeaker();'
object oNPC=GetObjectByTag("lich_king");
// ein NPC der auf nix auser dem Losungswort reagiert
AssignCommand(oNPC, ClearAllActions());
object okey_1 = CreateItemOnObject("key_1", oNPC, 1);
AssignCommand(oNPC, ActionGiveItem(okey_1, oPC));
}




___________________________

c===|[:::::::::::::::::>
Ja! ich bin unfähg die Rechtschreibung zu beachteln.. und das isd auch dut so![/font]
24.07.2002, 18:26 #12
mephi
Beiträge: 39

das hört sich aufjedenfall logischer an.. aber seltsamerweise geht das auch nicht :(
25.07.2002, 08:08 #13
Paleswift
Beiträge: 154

Ja.. das is doch zum aus der Haut fahren.. GRRRR!!
Und wenn du dem NPC das Item ins Inventory legst, dann geht das?
Wenn du das Losungswort sagst.. steht dein Charakter dann weiter entfernt von dem lichking? .. oder gibts noch andere PCs außer dir selbst? (Dann wäre GetFirstPC deffinitiv falsch..) Vielleicht hilft ja auch zuvor erst ein ActionMoveToObject(oPC).. hmm .. haste schon mal ausprobiert, was passiert, wenn du den NPC tötest.. fällt das Teil dann zufälligauf den Boden? Haste vielleicht mal so einige Debugmarker eingebaut? Nimm mal ein anderes Objekt als zu übergebendes.. zum Beispiel einen Standard Dolch +1 oder so.. vielleicht tut er sich schwer etwas anderes als Standard Items herzustellen.. oder in der Vorlage ist irgendwas falsch..so viele Möglichkeiten.. so wenig Ratschläge.:(
25.07.2002, 09:38 #14
mephi
Beiträge: 39

Jup, wenn ich ihm das Item ins Inventory lege geht es( aber nur einmal.. beim 2mal klappts auch nicht mehr(ja, ich lege mehrere schlüssel rein *g*))
GetFirstPC hab ich ersetzt aber ich bin eh der einzige auf dem Modul, ich steh auch direkt daneben ActionMoveToObject ist also unnötig.
Den NPC hab ich mal ausversehen angegriffen und getötet, aber das Item ist ja nicht "dropable".

So ein mist, da hab ich mal eine gute Idee und schreib das script sogar selbst und dann geht nix :(
25.07.2002, 09:40 #15
Paleswift
Beiträge: 154

Ich werd mal sehen was ich machen kann..hab ha´lt leider grade hier keinen Compiler und auch kein Spiel auf der Arbeit. Ich werds am WE mal checken.. falls ich was zu stande bringe.. wirste das hier finden.
25.07.2002, 15:33 #16
mephi
Beiträge: 39

thx
ich hoffe du bekommst das gebacken ;)
26.07.2002, 21:12 #17
mephi
Beiträge: 39

*schieb*
Ich brauche Hilfe...
Seite 1 von 1  1