[Editor1] Simples(?) Scriptproblem

Attic

Senior Member
Registriert
26.03.2002
Beiträge
683
Vermutlich werden Viele daüber lachen, aber ich verstehe einfach nicht warum folgendes Script nicht läuft. Ich habe zum ersten Mal versucht ein Modul mit paar Scripts zuverwenden und dachte, damit ich mich einarbeiten kann, bzw. damit die Scripte auch laufen nehme ich eines der Demomodule. In diesem Fall das mit den Kobolden und Goblins.

Mein Scrip basiert auf dem Spawnscript und nennt sich "ud_warrior"

void main()
{
int iUD = GetUserDefinedEventNumber();
int iRandom = Random(4)+1;
string sRandom = IntToString(iRandom);
object oWarriorSpawn = GetNearestObjectByTag("Spawn_Warrior");
location lSpawn = GetLocation(oWarriorSpawn);

if (iUD == 1007)
{
CreateObject(OBJECT_TYPE_CREATURE, "Warrior"+sRandom, lSpawn);
}

Ist fast 1:1 übernommen, dazu habe ich ein Gebäude mit ner Tür (geöffnet) davor nen Wegpunkt namens: "Spawn_Warrior" und in einiger Entfernung einen zweiten Wegpunkt: "Post_Warrior" erstellt.

Dann habe ich 4 Arten von Kriegern erstellt und allle als Fraktion "Warrior" eingestuft (die Fraktion habe ich definiert in ihren Beziehungen zu anderen Fraktionen).
Die 4 Kriegertypen heissen alle Warrior (mit Vornamen)+Typenbezeichnung (z.B Bogenschuetze). Als Kennzeichen sind sie alle "Warrior".


Ich habe keine Ahnung was falsch sein könnte. Bitte helft mir!!!!!!



PS:
Wie muss ein Script aussehen und eingebaut werden, wenn ich will, dass da Spawnen aufhört, sobald die Person XXY vernichtet wurde, bzw das Objekt XYZ zerstört wurde?
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Da ich nicht weiß, was passiert, oder was nicht passiert, kann ich Dir nur erstmal die mir naheliegensten Fehlerquellen aufzeigen.

1.) Hast Du im OnSpawn Skript dieser Krieger das UserDefinedEvent "OnDeath" freigeschaltet? Im Standard OnSpawn Skript sind nämlich alle UserDefinedEvents deaktiviert.

2.) Wenn Du den Befehl "CreateObject" benutzt, dann meint der String darin nicht den Tag des Objekts, sondern seine Blueprint Reference. Diese ist auf der Karte "Advanced" der Kreatur zu finden. Dabei ist darauf zu achten, daß NWScript immer und überall case sensitive ist, Du also auf die Groß- und Kleinschreibung immer genau achten mußt.

Ein kleiner Verbesserungsvorschlag: Statt "Random(4) + 1" würde ich lieber "d4(1)" benutzen. Das ist kürzer und liefert das selbe Ergebnis. Generel würde ich diese Würfel-Funktionen, wenn möglich, der Funktion Random vorziehen. Für alle gängigen Würfel gibt es eine Funktion: d4, d6, d8, d10, d12, d20 und d100. Der Integer, den Du der Funktion übergibst, gibt die Anzahl der Würfel dieser Art an, die geworfen werden sollen.
Außerdem würde ich mir die Variable iRandom komplett sparen und gleich

string sRandom = IntToString(d4(1));

schreiben, da die Variable iRandom sowieso sonst nirgendwo gebraucht wird. Als Faustregel kann man sagen, man sollte nur Variablen anlegen, wenn der darin gespeicherte Wert mehr als einmal gebraucht wird oder es einfach nicht anders geht, als den Wert in einer Variable zu speichern (solche Fälle gibt es).
Gegen diese Faustregel sollte man nur dann verstoßen, wenn dadurch die Lesbarkeit des Quellcodes ein notwendige Verbesserung erfährt.

Was Deine zweite Frage angeht, so ist das recht einfach: Setze im OnDeath-Teil des OnUserDefinedEvent Skriptes der Person oder des Objektes, die getötet bzw. zerstört werden muß, damit das Spawnen aufhört, eine lokale Variable, am besten auf der Area, in dem sich das Ganze abspielt oder auf sonst irgendeinem Objekt, das nicht zerstört werden kann (notfalls auch auf dem Modul selbst), denn wenn das Objekt, auf dem die lokale Variable gespeichert ist, zerstört wird, ist, logischerweise, auch die Variable zerstört.
Diese Variable fragst Du einfach ab, bevor Du spawnst. Nehmen wir einfach 'mal an, Du nimmst einen Integer dafür. So lange Du ihn nicht gesetzt hast, ist er 0 (null). Wenn die betreffende Kreatur stirbt bzw. der Gegenstand zerstört wird, setzt Du ihn auf 1. Dann ließt Du vor dem Spawnen diesen Integer aus. Wenn er 0 (FALSE) ist, spawnst Du, ansonsten tust Du einfach gar nichts.
 
Zuletzt bearbeitet:

Attic

Senior Member
Registriert
26.03.2002
Beiträge
683
Hmmm, da muss ich mir doch mal ansehen was du meinst... so ganz versteh ichs noch nicht. Bisher Funktioniert das Spawnen immer noch nicht so wie gewünscht...anstelle der verbündetet Krieger erscheinen nur feindliche Dachse...Das ist echt mal ein Rätsel.
Ich werd mir die Scripte nochmal ansehen, danke!
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Das ist der beste Hinweis, den Du mir geben konntest. Dachse werden nämlich immer dann gespawned, wenn die Blueprint Reference nicht stimmt (oder die eines Dachses ist :D). (Das, was ich unter "2.)" geschrieben habe, trifft hier also offensichtlich zu.) Du solltest sie klein schreiben, da alle Blueprint References klein sind, also

CreateObject(OBJECT_TYPE_CREATURE, "warrior"+sRandom, lSpawn);

statt

CreateObject(OBJECT_TYPE_CREATURE, "Warrior"+sRandom, lSpawn);

Evtl. ist die Reference aber gar nicht "warrior" + eine Nummer zwischen 1 und 4. Es ist bei eigenen Kreaturen nicht unüblich, daß die Reference vom Tag abweicht.
 
Zuletzt bearbeitet:

Attic

Senior Member
Registriert
26.03.2002
Beiträge
683
JUHU, endlich mal nen Schritt vorwärts *freu*
Aber wenn die Referenz abweicht wie weiss ich dann was ich schreiben muss???


EDIT1: Ok, da wars tatsächlich Gross statt klein geschrieben...

EDIT2: Aber es werden trotzdem bisher fleissig weiter Dachse produziert...
 
Zuletzt bearbeitet:

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Wenn Du eine Kreatur editierst, klickst Du auf "Advanced". Dort steht ganz oben 'was von "Blueprint ResRef". Das ist der Code, den Du beim "CreateObject" benutzen mußt.
 

Attic

Senior Member
Registriert
26.03.2002
Beiträge
683
AHA, noch nie gesehen...

EDIT: Oder meinst du das dritte Feld von oben, auf Deutsch steht da "Kennzeichn."

da habe ich aber das zutreffende eingetragen.

Muss ich eventuel den Wegpunkt bzw. den Spawnpunkt noch in sich besonders definieren?
 
Zuletzt bearbeitet:

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Nein, das ist der Tag (engl. für Kärtchen, Schildchen). Du brauchst die Blueprint Reference (Blaupausen-Referenz?) auf der Karte "Advanved" (im Dt. vermutlich "Erweitert"). In das Feld mit der Reference kannst Du nichts eingeben und alles was da drin steht, ist in klein geschrieben.
Nein, wenn der Tag stimmt, dann reicht das. Da mußt Du nichts mehr zusätzlich definieren.

Ein ziemlich gutes Scripting-Tutorial, das die Grundlagen recht gut erklärt, findest Du hier, auf der offiziellen NwN-Seite von Bioware. Vor allem der Teil über Events ist ziemlich wichtig.

PS: Hast Du eigentlich irgendwelche programmiererischen Vorkenntnisse?
 
Zuletzt bearbeitet:

Attic

Senior Member
Registriert
26.03.2002
Beiträge
683
Hattest recht, habs Problem gefunden und gelöst, war wohl auch das was du gemeint hattest!!! Hatte nur ne andere Bezeichnung, im Deutshcen ist es die Referenz der Vorlage!
Ich hatte immer den selben Char als Grundgerüsst genommen, deshalb hatten alle dort die selbe Bezeichnung stehen... Hab nun alle einzelnd erstellt, nun gehts!
Kann man die noch an nem Fertigen Char ändern?

Danke fürs Tutoriel, werd mich damit auf jeden Fall mal beschäfftigen!

Zu deiner Frage, jein, ich habe Erfahrung mit Turbopascal und Java, aber das wars auch schon.
Aber was solls, irgendwann muss man ja mal was dazu lernen!

endlich funzt das Modul...wenn ich jetzt noch nen 300er mit Geforce5 hätte würde meine Massenschlacht sogar ruckelfrei laufen *G*. Da muss ich wohl noch ein wenig Zeit investieren.

Vielen Dank für deine Hilfe!!!!!

Aber Dachse will ich jetzt erstmal nicht mehr sehen...gibts irgendwo Dachsfreiemodule???
 

Tingil

Lord of the Links
Registriert
14.07.2000
Beiträge
7.884
Du mußt die Blueprint ResRef festlegen, wenn Du die Kreatur erstellt. Anders geht's leider nicht.

Wenn Du mit Java gearbeitet hast, dann sollte Dir die Syntax von NWScript ja eigentlich schon bekannt vorkommen. Das einzige, woran man sich gewöhnen muß, sind die Namen der Funktionen, aber dafür gibt's rechts im Script Editor ja die Übersicht bzw. den Funktionsfilter. Wenn Du dort auf eine Funktion klickst, erscheint im unteren Fensterabschnitt eine kleine Erklärung und der Prototyp der Funktion.
 
Oben