-
Npc_ExchangeRoutine Problem
Hab hier folgendes Skript:
Code:
FUNC VOID Info_XY_Bandits_Info()
{
AI_DrawWeapon (self);
AI_Output (self,other,"Info_XY_Bandits_11_00"); //...
Npc_ExchangeRoutine (ORG_XXX_XY,"Start");
Npc_ExchangeRoutine (ORG_YYY_XX,"Start");
AI_Wait (self, 2);
AI_RemoveWeapon (self);
AI_Output(hero,self,"Info_XY_Bandits_15_00"); //...
AI_Output(self,hero,"Info_XY_Bandits_11_01"); //....
AI_Output(self,hero,"Info_XY_Bandits_11_02"); //...
self.aivar[AIV_PARTYMEMBER] = FALSE;
Npc_ExchangeRoutine(self,"FirstMeeting");
AI_StopProcessInfos(self);
};
Also: Die Routine dieser beiden NPCs soll nach der Aussage des NPCs oben (Info_XY_Bandits_11_00) wieder geändert werden in die "Start" Routine. Aber nachdem der Dialog hier vorbei ist, stehen die NPCs weiterhin einfach nur dumm rum. Idealerweise sollten sie losgehen, während der NPC noch die Waffe gezogen hat, so hätte ich es gern. Aber selbst nach dem Dialog bewegen sie sich nicht. Erst wenn ich sie einzeln anspreche, gehen sie in ihre Start-Routine über. Wo liegt der Fehler?
-
Um die beiden dazu zu bringen zur neuen Routine zu wechseln kannst du AI_ContinueRoutine benutzen (oder besser: direkt B_StartOtherRoutine wegen der enthaltenen Sicherheitsabfrage). Das würde dann aber direkt passieren wenn Info_XY_Bandits_Info() aufgerufen wird (also am Start des Gesprächs).
Wenn es erst nach einer bestimmten Dialogzeile passieren soll wäre eine Kombination mit AI_Function aus LeGo möglich:
Code:
func void forceRoutineChangeNOW(){
B_StartOtherRoutine (ORG_XXX_XY,"Start");
B_StartOtherRoutine (ORG_YYY_XX,"Start");
};
FUNC VOID Info_XY_Bandits_Info()
{
AI_DrawWeapon (self);
AI_Output (self,other,"Info_XY_Bandits_11_00"); //...
AI_Function(self, forceRoutineChangeNOW);
AI_Wait (self, 2);
AI_RemoveWeapon (self);
AI_Output(hero,self,"Info_XY_Bandits_15_00"); //...
AI_Output(self,hero,"Info_XY_Bandits_11_01"); //....
AI_Output(self,hero,"Info_XY_Bandits_11_02"); //...
self.aivar[AIV_PARTYMEMBER] = FALSE;
Npc_ExchangeRoutine(self,"FirstMeeting");
AI_StopProcessInfos(self);
};
-
Ich würde den Namen der Routine sicherheitshalber groß schreiben.
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
Geändert von NicoDE (23.04.2019 um 14:59 Uhr)
-
Okay, danke euch beiden. Der Name der Routine war so auch in den Originalskripten (der NPCs) geschrieben, deswegen dachte ich, schreibe ich es hier im Dialog auch so. Durch AI_ContinueRoutine gehen sie jetzt wie gewünscht direkt ihrer alten Routine nach. Allerdings folgt ihnen dann die Kamera hinterher, bis sie auf ihrem neuen Platz stehen und man kommt leider auch nicht mehr aus dem Dialog heraus (ohne F8), also die Kamera bleibt auf sie fokussiert und es passiert nichts mehr. Auch ein AI_StopProcessInfos(self); am Ende ändert das nicht.
Als nächstes müsste ich es dann mit B_StartOtherRoutine versuchen.
-
Alle (External-) Funktionen die mit AI_* beginnen, werden nicht sofort ausgeführt, sondern werden in die AI-Queue des betroffenen NPCs eingereiht und dann abgearbeitet. Wenn du also erst AI_ContinueRoutine(self) und dann AI_StopProcessInfos(self) ausführst, kann letzteres erst passieren, wenn der NPC seine Routine erfolgreich aufgenommen hat (was auch immer das genau bedeutet).
Reicht es vielleicht schon, AI_StopProcessInfos vor AI_ContinueRoutine aufzurufen?
-
Danke Lehona. Es scheint jetzt zu funktionieren. Die Kamera folgt immernoch den beiden Banditen, bis sie ihre Routine wieder eingenommen haben. Aber das wirkt eigentlich ganz cool. Noch besser wäre es, wenn die Kamera ihnen nur ~3 Sekunden folgen würde. Aber das wird ohne Trickserei mit Lego wohl nicht möglich sein.
Neues Problem:
Code:
AI_AlignToWP (self);
AI_PointAt(self,"WP_XX");
AI_Output(self,other,"Info_XY_Scavenger_11_01"); //Siehst du XY da drüben?
AI_StopPointAt(self);
//AI_AlignTo... // Florian: TODO: XZ soll sich hier erst wieder zum Spieler zurückdrehen. Wie?
AI_Output(self,other,"Info_XY_Scavenger_11_02"); //....
AI_Output(self,other,"Info_XY_Scavenger_11_03"); //....
AI_StopProcessInfos(self);
Also zuerst will ich, dass er sich in eine bestimmte Richtung dreht, wo er hinzeigt, dann soll er sich aber erst zum Spieler zurückdrehen, bevor er weiter spricht. Wie ist das machbar? Kann man ihn sich auch zu einem bestimmten NPC oder Monster drehen lassen statt dieses "AlignToWP", was weniger präzise ist?
-
Code:
AI_TurnToNpc(self, hero);
Versuch es mal damit.
-
Wunderbar! Danke. Gibt es auch eine Funktion, die es ermöglicht, dass ein NPC, der eine important Info hat, dich nicht aus einer zu weiten Entfernung anspricht, sondern nur wenn du ca. 1,5m vor ihm stehst oder so?
-
Du könntest als Bedienung für den Dialog ja den Abstand mit GetDistToNPC abfragen, oder?
-
Das werde ich ausprobieren, danke Fisk. Da lässt sich ja nur mit Daedalus schon ganz schön viel machen.
-
Code:
FUNC int Org_XXX_XYX_First_Condition()
{
if ( Npc_KnowsInfo(hero,Info_XY_Outlook))
&& (Npc_GetDistToNpc( other, self ) < 500)
{
return 1;
};
};
Ich hab das jetzt so versucht. Neben < 500 habe ich auch < 1000 getestet. Es machte keinerlei Unterschied. Hat jemand eine Idee?
-
Zitat von lali
Code:
FUNC int Org_XXX_XYX_First_Condition()
{
if ( Npc_KnowsInfo(hero,Info_XY_Outlook))
&& (Npc_GetDistToNpc( other, self ) < 500)
{
return 1;
};
};
Ich hab das jetzt so versucht. Neben < 500 habe ich auch < 1000 getestet. Es machte keinerlei Unterschied. Hat jemand eine Idee?
Die Zahl sind Zentimeter, daher sind 500 immer noch 5 Meter. Vielleicht mal eine kleinere Zahl probieren für einen sichtbaren Unterschied?
-
Zitat von lali
Code:
FUNC int Org_XXX_XYX_First_Condition()
{
if ( Npc_KnowsInfo(hero,Info_XY_Outlook))
&& (Npc_GetDistToNpc( other, self ) < 500)
{
return 1;
};
};
Was anderes: Bei solch einer Abfrage besteht auch immer das Problem(falls die Distanz eher klein gewählt ist) das der Spieler den NPC anspricht und keine Dialogoption hat(weil er halt als zu weit weg erkannt wird). Ich würde bei einer solchen Distanzabfrage immer zusätzlich abfragen ob der NPC in ZS_TALK ist und falls ja: Distanzabfrage ignorieren und Dialog einfach trotzdem verfügbar machen. Beispiel:
Code:
FUNC INT DIA_Kdf_213_Feris_Ende_condition ()
{
IF (Npc_KnowsInfo(other, DIA_None_830_Geist_ruhig))
&& (Npc_getDistToNPC(self, other) < 310 || NPC_IsInState(self, ZS_Talk)) {
return TRUE;
};
};
-
AI_ContinueRoutine sollte man nicht für den Npc benutzen, der sich gerade im Dialog befindet. In dem Fall hängt der sich komplett auf, geht zu seinem Tagesablaufstart und beendet den Dialog nicht.
Normalerweise reicht es für den im Dialog befindlichen Npc, einfach Npc_ExchangeRoutine zu benutzen. Wenn der mit ZS_Talk durch ist, macht der dann automatisch schon das richtige.
"Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
-Korallenkette
-
Aber im Skript oben wars ja so. Und es hat nicht funktioniert.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|