Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 8 von 8
  1. Beiträge anzeigen #1 Zitieren
    Ritter Avatar von lionheart1
    Registriert seit
    Oct 2010
    Ort
    Rheinland-Pfalz
    Beiträge
    1.124
     
    lionheart1 ist offline

    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?

  2. Beiträge anzeigen #2 Zitieren
    Veteran Avatar von Kalten666
    Registriert seit
    Nov 2008
    Ort
    Graz/Steiermark/Österreich
    Beiträge
    657
     
    Kalten666 ist offline
    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

  3. Beiträge anzeigen #3 Zitieren
    Ritter Avatar von lionheart1
    Registriert seit
    Oct 2010
    Ort
    Rheinland-Pfalz
    Beiträge
    1.124
     
    lionheart1 ist offline
    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;
    	};
    };

  4. Beiträge anzeigen #4 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    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).

  5. Beiträge anzeigen #5 Zitieren
    Ritter Avatar von lionheart1
    Registriert seit
    Oct 2010
    Ort
    Rheinland-Pfalz
    Beiträge
    1.124
     
    lionheart1 ist offline
    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?

  6. Beiträge anzeigen #6 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Zitat Zitat von lionheart1 Beitrag anzeigen
    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.

  7. Beiträge anzeigen #7 Zitieren
    Ritter Avatar von lionheart1
    Registriert seit
    Oct 2010
    Ort
    Rheinland-Pfalz
    Beiträge
    1.124
     
    lionheart1 ist offline
    Dann probiere ich das. Danke für deine Hilfe.

  8. #8 Zitieren
    Illari
    Gast
     
    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
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide