-
NPC soll beim Dialog sitzenbleiben
Hallo Leute,
ich bin ein bisschen am modden und wollte einen Dialog mit einem NPC führen, der auf einem Stuhl sitzt. Ich möchte gerne das er während des Gesprächs sitzenbleibt. Doch bei jedem zweiten Klicken des Dialogs steht er auf. Wie kann ich das steuern das er auf dem Stuhl hocken bleibt?
Hängt das vielleicht mit den Random-Anis in der ZS_Sit_Chair zusammen?
-
Sei gegrüßt, lionheart1!
Ha! Wenn mir dazu schon ausnahmsweise etwas einfällt, muß ich das natürlich gleich loswerden.
Zumindest für Gothic I gibt es ein Beispiel im Originalspiel, ganz am Anfang:
Der Dialog ganz am Anfang mit Whistler, wenn er einen beauftragt, sich bei Fisk das Schwert für ihn zu holen: er bleibt auf seiner Bank während des gesamten Dialogs sitzen.
Möge Adanos dich ans Ziel schwemmen!
Kalten666
-
Dank dir. Ich habe den TA gefunden den Whistler benutzt. Da das Script aber ganz anders aussieht wie in Gothic 2 werde ich nicht ganz schlau draus.
Hast du ne Ahnung welcher Befehl für das sitzenbleiben wichtig ist und ob man den auch für Gothic 2 benutzen kann?
Code:
func void ZS_SitAround()
{
PrintDebugNpc(PD_TA_FRAME,"ZS_SitAround");
B_SetPerception(self);
self.senses_range = HAI_DIST_ASSESS_MONSTER;
self.senses = SENSE_SEE | SENSE_HEAR | SENSE_SMELL;
Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessSC);
Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk);
if(Npc_GetDistToWP(self,self.wp) > PERC_DIST_FLEE)
{
PrintDebugNpc(PD_TA_CHECK,"...zu weit weg vom TA-Startpunkt!");
AI_Standup(self);
AI_SetWalkMode(self,NPC_WALK);
AI_GotoWP(self,self.wp);
};
};
func int ZS_SitAround_Loop()
{
var int sitreaktion;
PrintDebugNpc(PD_TA_LOOP,"ZS_SitAround_Loop");
if(!C_BodyStateContains(self,BS_SIT))
{
PrintDebugNpc(PD_TA_CHECK,"...NSC sitzt noch nicht!");
if(Wld_IsMobAvailable(self,"BENCH"))
{
PrintDebugNpc(PD_TA_CHECK,"...Bank gefunden!");
AI_UseMob(self,"BENCH",1);
self.aivar[AIV_HangAroundStatus] = 2;
}
else if(Wld_IsMobAvailable(self,"CHAIR"))
{
PrintDebugNpc(PD_TA_CHECK,"...Stuhl gefunden!");
AI_UseMob(self,"CHAIR",1);
self.aivar[AIV_HangAroundStatus] = 3;
}
else if(Wld_IsMobAvailable(self,"SMALL THRONE"))
{
PrintDebugNpc(PD_TA_CHECK,"...kl. Thron gefunden!");
AI_UseMob(self,"SMALL THRONE",1);
self.aivar[AIV_HangAroundStatus] = 4;
}
else if(Wld_IsFPAvailable(self,"SIT"))
{
PrintDebugNpc(PD_TA_CHECK,"...FP 'SIT' gefunden!");
AI_GotoFP(self,"SIT");
AI_AlignToFP(self);
AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SIT);
self.aivar[AIV_HangAroundStatus] = 1;
}
else if(self.aivar[AIV_HangAroundStatus] < 1)
{
PrintDebugNpc(PD_TA_CHECK,"Einfach so sitzen...");
AI_AlignToWP(self);
AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SIT);
self.aivar[AIV_HangAroundStatus] = 1;
};
}
else
{
sitreaktion = Hlp_Random(100);
PrintDebugInt(PD_TA_DETAIL,"...Zufallsani-Wurf: ",sitreaktion);
if(sitreaktion >= 95)
{
B_Pee(self);
}
else if(sitreaktion >= 90)
{
if(self.aivar[AIV_HangAroundStatus] == 3)
{
AI_PlayAniBS(self,"R_CHAIR_RANDOM_1",BS_SIT);
}
else if(self.aivar[AIV_HangAroundStatus] == 2)
{
AI_PlayAniBS(self,"R_BENCH_RANDOM_1",BS_SIT);
};
}
else if(sitreaktion >= 85)
{
if(self.aivar[AIV_HangAroundStatus] == 3)
{
AI_PlayAniBS(self,"R_CHAIR_RANDOM_2",BS_SIT);
}
else if(self.aivar[AIV_HangAroundStatus] == 2)
{
AI_PlayAniBS(self,"R_BENCH_RANDOM_2",BS_SIT);
};
}
else if(sitreaktion >= 80)
{
if(self.aivar[AIV_HangAroundStatus] == 3)
{
AI_PlayAniBS(self,"R_CHAIR_RANDOM_3",BS_SIT);
}
else if(self.aivar[AIV_HangAroundStatus] == 2)
{
AI_PlayAniBS(self,"R_BENCH_RANDOM_3",BS_SIT);
};
}
else if(sitreaktion >= 75)
{
if(self.aivar[AIV_HangAroundStatus] == 3)
{
AI_PlayAniBS(self,"R_CHAIR_RANDOM_4",BS_SIT);
}
else if(self.aivar[AIV_HangAroundStatus] == 2)
{
AI_PlayAniBS(self,"R_BENCH_RANDOM_4",BS_SIT);
};
};
};
AI_Wait(self,1);
return LOOP_CONTINUE;
};
func void ZS_SitAround_End()
{
PrintDebugNpc(PD_TA_FRAME,"ZS_SitAround_End");
self.senses_range = HUM_DEF_SENSES_RANGE;
self.senses = HUM_DEF_SENSES;
if(self.aivar[AIV_HangAroundStatus] == 1)
{
AI_PlayAni(self,"T_SIT_2_STAND");
self.aivar[AIV_HangAroundStatus] = 0;
}
else if(self.aivar[AIV_HangAroundStatus] == 4)
{
AI_UseMob(self,"SMALL THRONE",-1);
self.aivar[AIV_HangAroundStatus] = 0;
}
else if(self.aivar[AIV_HangAroundStatus] == 2)
{
AI_UseMob(self,"BENCH",-1);
self.aivar[AIV_HangAroundStatus] = 0;
}
else if(self.aivar[AIV_HangAroundStatus] == 3)
{
AI_UseMob(self,"CHAIR",-1);
self.aivar[AIV_HangAroundStatus] = 0;
};
};
-
Standardverhalten in gothic 2 sollte sein das der NPC sitzen bleibt, falls er den hero sehen kann.
Das wird in der B_AssessTalk() weit unten geregelt:
Code:
// ------ NSC bleibt sitzen oder steht in Ruhe auf bzw. beendet Mobsi in Ruhe -----------------
if (C_BodyStateContains(self, BS_SIT))
{
if (self.aivar[AIV_NpcStartedTalk] == TRUE)
{
AI_StandUpQuick (other); //Spieler anhalten
}
else
{
AI_StandUp (other); //Spieler anhalten
};
if (Npc_CanSeeNpc(self, other))
{
AI_StartState (self, ZS_Talk, 0, ""); //sitzenbleiben
}
else //nicht sehen
{
//HACK: Im ObservePlayer kann ein NSC sitzen, ohne daß in der END-Routine des ZS sauber aufgestanden wird (klar, denn ZS_ObservePlayer_End hat kein StandUp o.ä. - darf dies auch nicht haben)
if (Npc_IsInState (self, ZS_ObservePlayer))
{
AI_StandUp (self);
};
AI_StartState (self, ZS_Talk, 1, ""); //aufstehen
};
return;
}
else //nicht sitzen
[...]
Da könntest du Veränderungen vornehmen, so das dieser NPC immer sitzen bleibt. (Ist halt die Frage wie sinnvoll das ist, falls man sich ingame so positionieren kann das man hinter dem sitzenden NPC steht, wäre es wahrscheinlich nicht verkehrt das er da aufsteht und sich zum hero dreht).
-
Danke. Mit dem Script komme ich besser klar.
Der NPC sieht den Hero, steht aber manchmal trotzdem auf. Aber wenn ich das richtig verstehe sollte er im ZS_ObservePlayer auf jeden Fall sitzen bleiben? Wie kann ich den NPC dazu bringe das er im ObservePlayer ist?
-
Zitat von lionheart1
Aber wenn ich das richtig verstehe sollte er im ZS_ObservePlayer auf jeden Fall sitzen bleiben?
Nein, diese extra Behandlung von ZS_ObservePlayer ist dafür da, das er da auch aufsteht.
Ich würde testweise einfach mal das hier machen:
Code:
if (Npc_CanSeeNpc(self, other) || Hlp_GetInstanceID(self) == XXX_YYY_DeineNPCInstanz)
{
AI_StartState (self, ZS_Talk, 0, ""); //sitzenbleiben
}
Das sollte dann dazu führen das dieser eine NPC immer sitzen bleibt, egal ob er den Spieler sehen kann oder nicht.
Falls das funktioniert kann man dann anschließend noch über Verschönerungen etc. nachdenken.
-
Dann probiere ich das. Danke für deine Hilfe.
-
19.05.2019 20:20
#8
Hättet ihr da zufällig ein Skript mit einem Fix für DIA_PAL_250_Garond.d?
Bin mir nicht ganz sicher wo man dort die zeilen von @Cryp18Struct eintragen soll damit er nicht beim ersten Dialog aufsteht
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|