PDA

View Full Version : NPC-Script



el primato
19.06.2004, 01:33
Hi,

ich hab mal ne frage zu dem wiki-tutorial (http://wiki.devmode.de/Tutorials/Skript-Tutorial) zum scripten. ich hab den npc erstellt und kann ihn per konsole einfügen.
jetzt möchte ich den aber schon von anfang an drin haben. also hab ich eine ZS_GuntherWait.d erzeugt. dann hab ich in die Ta.d folgendes eingefügt:


//**********************************************
//Mein Gunther:
//**********************************************

func void TA_GuntherWait ( var int start_h,
var int start_m,
var int stop_h,
var int stop_m,
VAR string waypoint)
{
TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_GuntherWait, waypoint);
};

und in die startup.d das hier:


FUNC VOID STARTUP_Gunther ()
{
Wld_InsertNpc(None_999_Gunther,"gunther");
};

im tutorial stand zwar nur: Wld_InsertNpc(None_999_Gunther,"gunther");
aber dann gibts ne fehlermeldung beim parsen

übrigens benutz ich nich die alte welt, sondern meine eigene und der waypoint an dem gunther stehen soll, heisst "gunther"

so, jetzt funktioniert das ganze aber nich, hab alle scripte gereparsed und kann den npc auch per konsole ainfügen, aber er steht nicht von anfang an an seinem waypoint.

CeeX
19.06.2004, 02:50
Original geschrieben von pogo

Wld_InsertNpc(None_999_Gunther,"gunther");
Hinter der NPC-Instanz muss der Bezeichner eines Waypoints stehen. Wenn Gunther wie im Tut im Alten Lager stehen soll wäre dies zB "OC1".

Diese Zeile schreibst du in die Startup.d in den Oldcamp-Abschnitt.

Maharreshi
19.06.2004, 02:51
Hallöchen!


pogo schrieb:
FUNC VOID STARTUP_Gunther ()

Wie heißt denn deine Welt? Doch nicht 'Gunther.zen', oder?

Edit:

@Neely:

Er hat doch nen WP oder FP angegeben!;)

pogo schrieb:
übrigens benutz ich nich die alte welt, sondern meine eigene und der waypoint an dem gunther stehen soll, heisst "gunther"

el primato
19.06.2004, 03:29
Wie heißt denn deine Welt? Doch nicht 'Gunther.zen', oder?
nee, meine welt heisst mylevel.zen. mir war aber nich klar, das an der stelle dann der levelname stehen muss. ich werds gleich mal ausprobieren...

edit: vielen dank, aber das geht immer noch nicht :(

Black Eye
19.06.2004, 06:05
Test deinen Npc mal mit dem Standart TA und nem schon existierenden Monster/Npc um zu sehen ob deine Startup überhaupt ausgeführt wird.

el primato
19.06.2004, 21:48
was meinst du mit mit "standart" TA (TA ist mir schon klar...) und einem existierenden npc? in meiner eigenen welt existiert doch noch nix...
und der npc an sich funktioniert ja, weil ich ihn mit der konsole einfügen kann...

Black Eye
19.06.2004, 21:59
Ich meine damit, dass du das ganze mal mit nem Monster testen sollts, um zu sehen ob die Startup überhaupt aufgerufen wird. Denn monster gehen immer.

el primato
19.06.2004, 22:07
ich hab jetzt


FUNC VOID STARTUP_MYLEVEL ()
{
Wld_InsertNpc (None_999_Gunther, "gunther");
Wld_InsertNpc (Mst_Default_Bloodfly, "gunther");
};

in die startup.d eingefügt und da is leider nix aufgetaucht... :confused:

Black Eye
19.06.2004, 22:11
Mal checkliste durchgehen.
Deine Zen heist MYLEVEL.ZEN
Der Waypoint heist gunther
Du hast die Scripte compiliert
Du hast in deiner ini für die Map unter vdfs nicht stehen

Alian
19.06.2004, 22:18
für solche zwecke brauchst du einen Ferrpoint und keinen Waypoint. Jedes Monster braucht seinen eigenen Freepoint.
sonst fällt mir jetzt auch nichts mehr ein.

Black Eye
19.06.2004, 22:24
@alian
Npcs(monster und Menschen) können sowohl auf waypoints als auch auf freepoints spawnen. Lediglich für die rchtige Funktion der Zustände(bei Menschen nicht bei allen) ist es wichtig, dass es entsprechen benannte Freepoints gibt. Allerdings wird durch das fehlen dieser Freepoints kein Npc in seiner Existens bedroht.

CeeX
19.06.2004, 22:34
Original geschrieben von pogo
ich hab jetzt


FUNC VOID STARTUP_MYLEVEL ()
{
Wld_InsertNpc (None_999_Gunther, "gunther");
Wld_InsertNpc (Mst_Default_Bloodfly, "gunther");
};

in die startup.d eingefügt und da is leider nix aufgetaucht... :confused:
Mst_Default_Bloodfly ist ein Monster-Prototyp ohne Visuals. Demnach kann da theoretisch auch nix auftauchen (bzw taucht was auf, ist aber unsichtbar). Versuch es einfach mal nur mit 'Bloodfly'.

el primato
20.06.2004, 18:47
Mst_Default_Bloodfly ist ein Monster-Prototyp ohne Visuals. Demnach kann da theoretisch auch nix auftauchen (bzw taucht was auf, ist aber unsichtbar). Versuch es einfach mal nur mit 'Bloodfly'.

geht auch nicht


Mal checkliste durchgehen.
Deine Zen heist MYLEVEL.ZEN
Der Waypoint heist gunther
Du hast die Scripte compiliert
Du hast in deiner ini für die Map unter vdfs nicht stehen

alles richtig...

ergänzung:
-ich habe eine datei gunther.d in:
_work\DATA\scripts\content\Story\NPC
die ja offensichtlich auch funktioniert (mit insert)
-ich habe folgenden eintrag in der startup.d:

FUNC VOID STARTUP_MYLEVEL ()
{
Wld_InsertNpc (None_999_Gunther, "gunther");
};
-ich habe einen wp "gunther" in meiner mylevel.zen
-ich habe folgenden eintrag in der Ta.d:

func void TA_GuntherWait ( var int start_h,
var int start_m,
var int stop_h,
var int stop_m,
VAR string waypoint)
{
TA_Min (self, start_h,start_m, stop_h, stop_m, ZS_GuntherWait, waypoint);
};
-ich habe eine ZS_GuntherWait.d in _work\DATA\scripts\content\Story\ZS

und ich hab keinen npc im spiel... :D

LAP
20.06.2004, 18:57
Hast du die Datei ZS_GuntherWait.d in die Gothic.src eingetragen? Ansonsten findet er sie nicht und dann dürfte er den NPC auch nicht anzeigen ...

el primato
21.06.2004, 02:11
hatte sie nicht eingetragen. aber wenn ich


STORY\ZS\ZS_GUNTHERWAIT.D

eintrage, dann kommt beim starten (scripte reparsed) die meldung:

B:VFILE:Err:-4: Can't find free file handle for file _WORK\DATA\SCRIPTS\CONTENT\_INTERN\INTERN.SRC

was hat die datei denn jetzt damit zu tun?

:confused: :confused:

Fizzban
21.06.2004, 02:28
Hast du vielleicht bereits diese Zeile



STORY\ZS\*.D


in deiner Gothic.src? Dann brauchst du die ZS_GUNTHERWAIT.D nicht extra einzutragen.

Ansonsten ist die Datei vielleicht an einer ungünstigen Stelle eingetragen. Einfach mal eine andere Position ausprobierem.

Edit:

Hier übrigens ein Weg, wie du sicherstellen kannst, dass deine Startup-Funktion wirklich aufgerufen wird. Einfach



ExitGame();


als erste Zeile der Funktion eintragen. Ruft Gothic dann die Startup-Funktion auf, so wird das Spiel sofort nach der Initialisierung beendet. Ansonsten halt nicht.. :)

[LoA]Wotan
21.06.2004, 02:46
deine startup datei muss MyLevel.Startup.d heißen ... und du musst sie in die gothic.src schreiben soweit ich weis

Fizzban
21.06.2004, 02:48
Original geschrieben von [LoA]Wotan
deine startup datei muss MyLevel.Startup.d heißen ... und du musst sie in die gothic.src schreiben soweit ich weis

Also das ist weder in den Original-Gothic- noch den Diccuric-Scripten so. Da täuscht du dich wohl.

Black Eye
21.06.2004, 02:49
deine startup datei muss MyLevel.Startup.d heißen ... und du musst sie in die gothic.src schreiben soweit ich weis
Was du weist ist falsch :P
Du musst keine neue Datei erstelle, aber wenn man eine erstellt ja dann muss man sie eintragen.


man wieder zu lahm

el primato
21.06.2004, 04:45
ExitGame();

nee, geht nicht. das gibt einen syntax error in line 1: exitgame....

tja...

Fizzban
21.06.2004, 04:59
Syntax error in line 1?! Hast du den Befehl etwa einfach an den Anfang von startup.d geschrieben? Wie gesagt, der muss in die erste Zeile der Funktion und nicht der Datei, also:



FUNC VOID STARTUP_MYLEVEL ()
{
ExitGame();
Wld_InsertNpc (None_999_Gunther, "gunther");
};

wano
21.06.2004, 20:14
Versuchs mal mit einem anderen TA fürn Gunther (also überhaupt kein TA_GUNThERWAIT) sondern standart TA's wie TA_STAY_WP. Und haste auch 2 TA's und nicht nur einen? Denn es müssen min. 2TA's vorhanden sein im NPC script, auch wenn er nur die ganze zeit rumsteht.

Naja hier ist mal n SCript von mir, das auch funktioniert:

func void STARTUP_KH_ANFANG ()
//---MEINE EIGENE WELT KHORANA---
{
//Anfang
Wld_InsertNpc (None_999_Gunther, "SENEX_1");
//JÄGERLAGER
Wld_InsertNpc (JG_13371_Enzo, "KH_SENEX_JG_1");
Wld_InsertNpc (JG_13372_Henry, "KH_SENEX_JG_2");





//MONSTER-Scavenger ums Jägerlager
Wld_InsertNpc ( SCAVENGER, "KH_JG_SCAV_1");
Wld_InsertNpc ( SCAVENGER, "KH_JG_SCAV_2");
Wld_InsertNpc ( SCAVENGER, "KH_JG_SCAV_3");
};

func void INIT_KH_ANFANG ()
{
B_InitMonsterAttitudes ();
B_InitGuildAttitudes();
B_InitNpcGlobals ();
};

So ich dann mal auch n Prob mit dem tutorial:
also ich hab ein OcTriggerScript-vob in meiner "neuen" welt, und das soll so ähnlich wie im Tut ausgelöst werden, allerdings wenn der PC hindurch rennt. Hab die Box schon entsprechend langgezogen. Und das es beim berühren funzen sollte.
dann hab ich als scriptfunc: EVT_JAGD eingetragen

die datei ist dann im Event ordner u. heisst EVT_JAGD und beinhaltet
func void EVT_JAGD ()
{
wld_InsertNPC (Scavenger , "KH_JG_SCAV_1");
};

also es soll nurn scavenger gespawned werden. allerdings funzt es net.
Kann es daran liegen das es schon auf diesem WP einen Scavenger gibt?
Oder das es ein neues eigenes Level ist?

Fizzban
22.06.2004, 07:28
@wano:

Ich habe es gerade mal selbst ausprobiert und bei mir erscheint ein zweiter Scavenger am WP. Hast du beim OcTriggerScript-Objekt die Eigenschaft cdDyn auf TRUE gesetzt? Ansonsten wird der Trigger über Kollisionen mit dynamischen Objekten wie dem Spieler nicht informiert.

Außerdem müssen reactToTouch, respondToPC sowie startEnabled auf TRUE stehen, aber das hast du ja scheinbar schon.

Maharreshi
22.06.2004, 18:24
Mir ist gerade noch was zum Thema TAs eingefallen:

Wenn ich mich richtig erinnere, MUSS eine TA-Funktion (die, die im NPC-Skript über "daily_routine = ..." angegeben wird) nach folgendem Schema benannt sein:

Rtn_[Name des TAs]_[ID des NPCs], also zum Beispiel "Rtn_Start_10005" und im NPC-Skript steht dann dementsprechend "daily_routine = Rtn_Start_10005;"...

So, hab jetzt gerade nochmal nachgeguckt; in den Original-Skripten ist das jedenfalls auch so. Vielleicht hilft das ja weiter...§kratz

el primato
22.06.2004, 20:23
aber dies hier liegt doch auch im npc-sript:



func void Rtn_Start_999 ()
{
TA_GuntherWait (0,00,13,00, "gunther");
TA_GuntherWait (13,00,0,00, "gunther");
};


oder nicht?
da hab ich ja alles richtig gemacht. die ID des npcs ist 999 und der aufruf lautet: daily_routine = Rtn_start_999;
und liegt auch im npc-script, also bei mir gunther.d

edit: jetzt ergibt sich bei mir grad ein ganz anderes problem. wenn ich die scripte reparse kommt ein fehler in der datei DIA_PC_Fighter.d im missions ordner, obwohl ich da überhaupt nichts gemacht hab! irgendwas mit fm gateopen....

wano
22.06.2004, 20:26
@ Jonathan

ah thx daran hats gelegen, jetzt funzt alles Prima thx again!

Fizzban
25.06.2004, 02:44
@pogo

Kleinbuchstaben sind in Waypoint-Namen nicht erlaubt. Es muss also "GUNTHER" heißen.

CeeX
28.06.2004, 23:54
Das Problem besteht bei mir ebenfalls. Mein Testlevel besitzt Waypoints bzw Freepoints. Monster werden ohne Probleme eingefügt, sowohl auf Freepoints wie auch auf Waypoints, NPCs allerdings nicht.

Die NPCs sowie deren TAs sind scheinbar in Ordnung (immerhin funktionierten sie bisher in der world.zen einwandfrei), die Startup-Funktion wird auch korrekt abgerufen (mit PlayVideo ("INTRO.BIK"); getestet).
Ein Einfügen über ein Trigger-Item funktioniert auch nicht.

Ich habe mir einige Waypoints von anderen .ZENs angeschaut, konnte allerdings keine Besonderheiten oder Abweichungen von meinen entdecken.
Nun bin ich etwas ratlos... :(

EDIT: Lag wohl an den FPs. Ein TA ohne FP funzt (TA_Position).