Willkommen Anonymous, es sind 42 User online. [ Anzeigen ]


[RPG]Board Neverwinter Nights NWN Scripting


[ Login ] [ Registrieren ] [ Abo ] [ Suche ] [ Profil ] [ Hilfe ]


Operatoren: zauriel, Avantenor
Moderatoren: NWN Moderat, Camael, IRQ
[ ANTWORTEN ]
[ FAQ ]
Autor Druckansicht   Thema: Kreatur erscheint nicht mit CreateObject(...)
Seite: 1
Thor Odinsson X

Profil anschauen ]

erstellt am 30.06.2012 um 10:12 Uhr       Zitatantwort        #1818969

Ich habe ein Problem mit einem Skript.
Es sollte unter bestimmten Bedingungen Kreaturen an Wegpunkten erstellen. Der Code dazu:
 
CreateObject(OBJECT_TYPE_CREATURE, "NW_CREATURE_000", lCreaturepoint, TRUE, ""); 
SendMessageToPC(oPlayer, "Spinne erstellt"); 


Leider erscheinen die Kreaturen nicht oder sind zumindest nicht sichtbar!? Es sollte allerdings eine Schreckensspinne zu sehen sein.

Wandle ich das Skript ab zu
 
CreateObject(OBJECT_TYPE_ITEM, "item003", lCreaturepoint, TRUE, ""); 
SendMessageToPC(oPlayer, "Spinne erstellt"); 


, erscheint an dem Wegpunkt das entsprechende Item (hier ein Stück Fleisch).

Das Skript als solches scheint also zu funktionieren. Aber wieso kann ich keine Kreaturen erscheinen lassen?

PS: Eine Überprüfung mit
 
object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "NW_CREATURE_000", lCreaturepoint, TRUE, ""); 
SendMessageToPC(oPlayer, "Spinne erstellt"); 
JumpToLocation(GetLocation(oCreature)); 


hat ergeben, dass nichts passiert! Der Spieler wird nicht teleportiert, was darauf schließen lässt, dass keine Kreatur erzeugt wird...

Hat jemand eine Ahnung, woran es liegen könnte?

System: Win 7 Ultimate 64-Bit, NWN 1.68 de
Masqurin

Profil anschauen ]

Gilde/Clan:
Pessimist™

erstellt am 30.06.2012 um 11:45 Uhr       Zitatantwort        #1818978

Wichtig ist: Nicht die Kennzeichnung sondern die ResRef der Vorlage ist entscheidend. Du könntest einfach mal nw_spiddire testen, das wäre die Standard Schreckensspinne des Spiels.
Thor Odinsson X

Profil anschauen ]

erstellt am 30.06.2012 um 13:04 Uhr       Zitatantwort        #1818983

Ok, jetzt bin ich etwas verwirrt...

Laut meinem Aurora ist "nw_spiddire" die Kennzeichnung der Spinne und die ist ja laut dir nicht entscheidend. Und zumindest bei meinen Items stimmt das auch (item003 ist Vorlagen-ResRef).

Ich habe es aber trotzdem probiert. Das Ergebnis: NWN hängt sich beim Laden des Gebiets, in welchem die Spinne erzeugt werden soll, auf.

Nutze ich die Vorlagen-ResRef (zu finden unter Eigenschaften->Erweitert->Vorlagen-ResRef) "spiddire002" (Vorlagen-ResRef der Standard-Schreckensspinne) passiert wieder nichts.
MonsieurPomme@ZW

Profil anschauen ]

erstellt am 30.06.2012 um 13:26 Uhr   Homepage besuchen    Zitatantwort        #1818985

"nw_spiddire" ist definitiv die ResRef für die standart Schreckensspinne. Was du dir als ResRef anzeigen lässt, deutet für mich eher darauf hin, dass du dir eine kopie dieser Spinne anschaust (aufgrund spiddire002 wohl sogar die 2. Kopie)

Wenn du die ResRef haben willst, platziere die Kreatur kurz in ner Map und schau dir dann die Eigenschaften dieser platzieren Kreatur an. Wenn du dir die Standart Vorlagen mit rechtsklick über die Liste anschaust, kannst du nur Kopien angucken, deren resref anders ist.

Außerdem ist es immer hilfreich, den kompletten Code zu posten. Dann kann man das ganze besser Nachvollziehen (sofern da noch mehr is)
Thor Odinsson X

Profil anschauen ]

erstellt am 30.06.2012 um 13:39 Uhr       Zitatantwort        #1818987

Ok, nach dem Platzieren auf der Map wurde mir nun auch "nw_spiddire" angezeigt. Deine Erklärung macht Sinn, immerhin ist meine Spinne eine Kopie der Standard-Spinne...

Hier mal das Skript mit "nw_spiddire"
 
void main() 
{ 
    int iRandom; 
    int iPoint; 
    string sPoint; 
 
    object oPlayer = GetFirstPC(); 
 
    for (iPoint = 1; iPoint <= 4; iPoint ++) 
    { 
        sPoint = "CREATUREPOINT" + IntToString(iPoint); 
 
        iRandom = Random(10); 
 
        SendMessageToPC(oPlayer, sPoint + ":" + IntToString(iRandom)); 
 
        if (iRandom > 5) 
        { 
            SendMessageToPC(oPlayer, "Erstelle Kreatur..."); 
 
            object oCreaturepoint = GetWaypointByTag(sPoint); 
 
            if ( oCreaturepoint == OBJECT_INVALID) 
            { 
                SendMessageToPC(oPlayer, "Fehler:" + sPoint + "wurde nicht gefunden!"); 
            } 
 
            location lCreaturepoint = GetLocation(oCreaturepoint); 
            iRandom = Random(3); 
 
            object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_spiddire", lCreaturepoint, TRUE, ""); 
 
            SendMessageToPC(oPlayer, "Kreatur (int):" + IntToString(iRandom)); 
 
            if (iRandom == 0) 
            { 
                object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_spiddire", lCreaturepoint, TRUE, ""); 
                JumpToLocation(GetLocation(oCreature)); 
                SendMessageToPC(oPlayer, "Spinne erstellt"); 
            } 
            else if (iRandom == 1) 
            { 
                object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_spiddire", lCreaturepoint, TRUE, ""); 
                JumpToLocation(GetLocation(oCreature)); 
                SendMessageToPC(oPlayer, "Fledermaus erstellt"); 
            } 
            else if (iRandom == 2) 
            { 
                object oCreature = CreateObject(OBJECT_TYPE_CREATURE, "nw_spiddire", lCreaturepoint, TRUE, ""); 
                JumpToLocation(GetLocation(oCreature)); 
                SendMessageToPC(oPlayer, "Zombie erstellt"); 
            } 
        } 
    } 
} 


Wenn ich hier nun "OBJECT_TYPE_CREATURE" in "OBJECT_TYPE_ITEM" und "nw_spidder" in "item003" ändere, funktioniert das Skript wunderbar. Items werden wunderbar erstellt.

Nur eben so, wie es jetzt ist, passiert nichts. Zwar werden die Nachrichten ausgegeben, aber mein Char hüpft nicht die einzelnen Punkte ab und es sind auch keine Kreaturen zu sehen.
MonsieurPomme@ZW

Profil anschauen ]

erstellt am 30.06.2012 um 14:23 Uhr   Homepage besuchen    Zitatantwort        #1818994

dass JumpToLocation nicht funktioniert liegt daran, dass du erst noch klar machen muss, wer da denn Jumpen soll.

AssignCommand(oPlayer,JumpToLocation(GetLocation(oCreature)));

Dann sollte das auch klappen. Der Spieler ist wohl nicht "calling object", also musst du das so machen.

Wieso keine Spinnen kommen, ist mir so beim ersten gucken, auch ein rätsel. es scheint, dass ja nur in 50% der fälle überhaupt was passieren soll. aber das weisst du ja sicher^^. außerdem kommen die texte ja.

Dass das Gebiet beim Laden abstürzt könnte evtl. daran gelegen haben, dass du das Skript im OnEnter des Gebietes startest. Wenn dem so ist, wäre es evtl. klug, an den Anfang noch "if !GetIsPC(GetEnteringObject())return;" zu setzen, da Kreaturenspawns ebenfalls das OnEnter auslösen und dann quasi ne Endlossschleife startet. Aber nur ne Vermutung, ka, über welches Event das Skript startet

Troka

Profil anschauen ]

erstellt am 01.07.2012 um 22:38 Uhr       Zitatantwort        #1819147

Mir fällt da grade auch nichts auf, außer dass du hier
 
if ( oCreaturepoint == OBJECT_INVALID)  
            {  
                SendMessageToPC(oPlayer, "Fehler:" + sPoint + "wurde nicht gefunden!");  
            }

am besten noch continue; einbaust:
 
if ( oCreaturepoint == OBJECT_INVALID)  
            {  
                SendMessageToPC(oPlayer, "Fehler:" + sPoint + "wurde nicht gefunden!");  
                continue; 
            }


Dann stoppt die Schleife an dieser Stelle und inkrementiert i direkt um 1 anstatt bis zum Ende zu laufen und noch unwahre Aussagen von erstellen Kreaturen auszugeben.

Ansonsten hast du auch um ResRef und Kennzeichnung herauszufinden oben im Toolset eine Lupe, wenn du die anklickst öffnet sich ein kleines Fenster, was dir beim anklicken von Kreaturen/Gegenständen/Placeables in der rechten Liste direkt die wichtigsten Daten anzeigt.
Uranochos

Profil anschauen ]

erstellt am 01.07.2012 um 22:49 Uhr eMail schreiben  Homepage besuchen    Zitatantwort        #1819150

@ Thor:

Wenn ich Dein Script richtig verstehe, dann hast Du im Gebiet 4 Wegpunkte, an denen mit 50% Wahrscheinlichkeit ein Monster erscheinen soll. Dann willst Du per Zufall eine von 3 Monsterarten auswählen: Spinne, Zombie oder Fledermaus.

Ich denke, Du musst vor allem Deine Variablen eindeutiger definieren.

Du definierst zB int iRandom zweimal unterschiedlich. Gib doch dem zweiten einen anderen Namen, denn sonst kann es Dir passieren, dass unmögliche Werte herauskommen.

Das Problem beim Testen von Zufallsskripten ist halt auch, dass es sein kann, dass manchmal mögliche Kombinationen entstehen (alles funktioniert wunderbar), manchmal aber auch unmögliche.

iRandom = Random(10); 
if (iRandom > 5) 
...

bedeutet, dass bei den Werten 6,7,8 und 9 etwas passiert, also 40% Chance für Erscheinen der Kreaturen.

object oPlayer =GetFirstPC();

gibt Dir den ersten Spieler in der Liste der Spieler, die Dein Modul spielen, nicht den ersten Spieler, der etwas tut, etwas benutzt, etwas betritt usw.

Sehr, sehr, sehr wichtig ist auch, dass Du Deine Scripte immer für den passenden Eventhandler schreibst und ausserdem im Auge behältst, welcher Gegenstand/Objekt/Trigger/Gebiet das Script auslöst ("Calling object", idR OBJECT_SELF).

Dass Dein Spiel abstürzt, wenn Du das Gebiet betrittst, hat M.Pomme Dir schon erklärt (Wenn das Script tatsächlich beim Eventhandler "OnEnter" abläuft.) Kreaturen zu erschaffen, ist da deutlich heikler als Gegenstände, und Dein Script läuft praktisch sofort endlos ab, wobei jeder Durchgang mit 40% Wahrscheinlichkeit das Script erneut ausführt. Und so ein Computer kann verdammt schnell zählen!

Gruß,
Uranochos


--
"Geschichten von der Alten Erde"
Deutschsprachiges Rollenspielprojekt.
-Work-in-progress-
[Externer Link - Bitte einloggen oder registrieren]
alte-erde.spdns.org

Thor Odinsson X

Profil anschauen ]

erstellt am 25.07.2012 um 17:55 Uhr       Zitatantwort        #1822256

Danke für eure schnellen Antworten und Entschuldigung für meine späte Reaktion.

Tatsächlich lag/liegt das Skript auf dem OnEnter-Slot.
Und das scheint tatsächlich das Problem gewesen zu sein. Zumindest funktioniert es nun einwandfrei, da ich nun auch prüfe, was denn eigentlich das Gebiet betritt.
Ich hätte ja nie gedacht, dass ein Spawn als Betreten gewertet wird...

Danke nochmal an alle Helfer.
Seite: 1
Druckansicht   Thema: Kreatur erscheint nicht mit CreateObject(...)  
[ ANTWORTEN ]

[RPG]Board Neverwinter Nights NWN Scripting

  


[RPG]Board 1.94.01 wird betrieben von Sebastian "Pandur" Olle.
Programmiert von Andreas "Monti" Bytzek.
Nutzungsbedingungen / Impressum / Haftungsausschluss / Datenschutz
Scriptlaufzeit: 0.12 sec