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 3 von 3
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    NPCs kehren erst zu ihrem Wegpunkt zurück, bevor sie in einen anderen Zustand wechseln

    Hallo,
    ich versuche schon seit gestern dieses blöde Problem zu lösen, das ich momentan habe.
    Ich möchte, dass NPC's mit einer bestimmten Gilde in den Zustand ZS_Flee_Endfight wechseln, sobald sie einen Feind mit einer bestimmten Gilde wahrnehmen. Das funktioniert so weit auch ganz gut. Problem ist allerdings, dass die NPCs, sobald sie ZS_Flee_Endfight_End erreicht haben und auf den Rückweg zu ihrem eigentlichen Wegpunkt sind, um dort wieder ihren Tagesablauf auszuführen, nicht sofort wieder in den Zustand ZS_Flee_Endfight zu wechseln scheinen, sobald sie wieder einen Feind mit dieser bestimmten Gilde wahrnehmen können. Erst wenn sie wieder an ihrem eigentlichen Wegpunkt sind und dort den Feind wahrnehmen, wechseln sie auch wieder in den Zustand.

    Prüfen lasse ich das in der B_AssessEnemy, dort wird auch in den Zustand gewechselt:

    Code:
    func int B_AssessEnemy()
    {
    	// EXIT IF...
    	
    	if (self.guild == GIL_VLK)
    	{	
    		if (other.guild == GIL_SLD)
    		{
    			if (!Npc_IsInState (self, ZS_Flee_Endfight))
    			{
    				AI_StandUpQuick	  (self);
    				
    				Npc_SetTarget (self, other);
    	
    				AI_TurnToNPC  (self, other);
    			
    				AI_StartState (self, ZS_Flee_Endfight, 0, "");
    			};
    			
    			return FALSE;
    		};
    	};

    Der Zustand sieht so aus:

    Code:
    func void ZS_Flee_Endfight (){
    	Npc_PercDisable (self, PERC_ASSESSMURDER);
    	Npc_PercDisable (self, PERC_ASSESSTHEFT);
    	Npc_PercDisable (self, PERC_ASSESSENTERROOM);
    	Npc_PercDisable (self, PERC_ASSESSFIGHTSOUND);
    	Npc_PercDisable (self, PERC_DRAWWEAPON);
    	Npc_PercDisable (self, PERC_ASSESSTALK);
    	
    	
    	self.aivar[AIV_FLEEINGNPC] = TRUE;
    
    
    	//	B_ValidateOther();
    		
    	// DIV_ClearAIState (self);
    
    
    	// AI_StandUpQuick		(self);
    	AI_SetWalkmode 	(self, NPC_RUN);
    	
    	// AI_TurnToNPC  (self, other);
    	
    	AI_Dodge (self);
    	
    	AI_Wait (self, 0.2);
    	
    	AI_PlayAni (self, "R_SCRATCHHEAD");
    
    
    	AI_Wait (self, 0.3);
    
    
    	B_Say (self, other, "$RUNAWAY"); //Nichts wie weg!
    	
    	if (!Npc_IsInFightMode (self, FMODE_NONE))
    	{
    		AI_RemoveWeapon (self);
    	};
    	
    	Npc_GetTarget (self); // other = target
    	
    	AI_Flee (self);
    	
    	Print ("ZS_Flee_Endfight wird ausgeführt!");
    };
    
    
    func int ZS_Flee_Endfight_Loop ()
    {
    	Npc_GetTarget (self); // other = target
    	
    	if (Npc_GetDistToNpc(self, other) >= 3500) || (C_NpcIsDown (other))
    	{
    		AI_StandUpQuick (self);
    		
    		Npc_ClearAIQueue (self);
    		
    		return LOOP_END;
    		
    		Print ("Abstand zum Feind groß genug ODER NPC ist am Boden! --> ZS_Flee_Endfight_End");
    		
    	} else {
    	
    		AI_Flee (self);
    		
    		return LOOP_CONTINUE;
    	};
    };
    
    
    func void ZS_Flee_Endfight_End ()
    {
    	self.aivar[AIV_FLEEINGNPC] = FALSE;
    
    
    	AI_StandUpQuick (self);
    	AI_PlayAni (self, "T_SEARCH");
    	
    	Npc_PercEnable  	(self, PERC_ASSESSMURDER,	  B_AssessMurder);
    	Npc_PercEnable  	(self, PERC_ASSESSTHEFT,	  B_AssessTheft);
    	Npc_PercEnable  	(self, PERC_ASSESSENTERROOM,  B_AssessPortalCollision);
    	Npc_PercEnable  	(self, PERC_ASSESSFIGHTSOUND, B_AssessFightSound);
    	Npc_PercEnable  	(self, PERC_DRAWWEAPON, 	  B_AssessDrawWeapon);
    	Npc_PercEnable  	(self, PERC_ASSESSTALK, 	  B_AssessTalk);
    	Npc_PercEnable 		(self, PERC_ASSESSMAGIC,	  B_AssessMagic);
    	Npc_PercEnable 		(self, PERC_ASSESSDAMAGE,	  B_AssessDamage);
    	Npc_PercEnable 		(self, PERC_ASSESSTHREAT,	  B_AssessThreat);
    	Npc_PercEnable	    (self, PERC_ASSESSWARN,	  	  B_AssessWarn);
    	Npc_PercEnable	 	(self, PERC_ASSESSQUIETSOUND, B_AssessQuietsound);
    	Npc_PercEnable	 	(self, PERC_ASSESSENEMY, 	  B_ASSESSENEMY);
    	
    	Print ("ZS_Flee_Endfight_End wird ausgeführt!");
    };

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Wenn in den g2 Skripten ein neuer Zustand gestartet wird, wird für gewöhnlich erst noch die AIQueue geleert und die perceptions weggehauen(weil die dann vom Zustand neu gesetzt werden).
    Beispiel:
    Code:
    Npc_ClearAIQueue	(self);
    B_ClearPerceptions	(self);
    AI_StartState 		(self, ZS_ReactToWeapon, 0, "");

    Wie wäre es hiermit?:
    Code:
    func int B_AssessEnemy()
    {
    	// EXIT IF...
    	
    	if (self.guild == GIL_VLK)
    	{	
    		if (other.guild == GIL_SLD)
    		{
    			if (!Npc_IsInState (self, ZS_Flee_Endfight))
    			{
    				Npc_ClearAIQueue	(self);
    				//B_ClearPerceptions	(self); // wenn du die perceptions in ZS_Flee_Endfight() neu setzten würdest
    				AI_StandUpQuick	  (self); // evt. in ZS_Flee_Endfight() verschieben
    				
    				Npc_SetTarget (self, other);
    	
    				AI_TurnToNPC  (self, other); // evt. in ZS_Flee_Endfight() verschieben
    			
    				AI_StartState (self, ZS_Flee_Endfight, 0, "");
    			};
    			
    			return FALSE;
    		};
    	};
    Geändert von Cryp18Struct (15.04.2019 um 14:03 Uhr)

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Wenn in den g2 Skripten ein neuer Zustand gestartet wird, wird für gewöhnlich erst noch die AIQueue geleert und die perceptions weggehauen(weil die dann vom Zustand neu gesetzt werden).
    Beispiel:
    Code:
    Npc_ClearAIQueue    (self);
    B_ClearPerceptions    (self);
    AI_StartState         (self, ZS_ReactToWeapon, 0, "");

    Wie wäre es hiermit?:
    Code:
    func int B_AssessEnemy()
    {
        // EXIT IF...
        
        if (self.guild == GIL_VLK)
        {    
            if (other.guild == GIL_SLD)
            {
                if (!Npc_IsInState (self, ZS_Flee_Endfight))
                {
                    Npc_ClearAIQueue    (self);
                    //B_ClearPerceptions    (self); // wenn du die perceptions in ZS_Flee_Endfight() neu setzten würdest
                    AI_StandUpQuick      (self); // evt. in ZS_Flee_Endfight() verschieben
                    
                    Npc_SetTarget (self, other);
        
                    AI_TurnToNPC  (self, other); // evt. in ZS_Flee_Endfight() verschieben
                
                    AI_StartState (self, ZS_Flee_Endfight, 0, "");
                };
                
                return FALSE;
            };
        };
    So einfach ist es also... Funktioniert nun perfekt, vielen Dank!

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