Waypoints Post_tag

Répondre
Partager Rechercher
Salut à tous !

J'ai quelques petits problèmes qui me rendent fou avec les waypoints.

Quelques trucs classiques du style: les nPc ne passent pas par les waypoints demandés, ou les parcours dans le sens inverse, mais sur lesquels je ne reviendrait pas (le problème n'étant pourtant pas résolu) car cela a déjà été débattu sur ce forum.

Mon problème vient de l'utilisation du waypoint de type "POST_tag". Théoriquement, si j'ai bien tout compris, cela sert à avoir une créature mobile qui revient à son point de départ. Or pas de problème en ce qui concerne la mobilité, mais lorsque le combat est désengagé, aucun retour à la position d'origine . J'ai codé le tout comme sous NWN1 pourtant ...

Si quelqu'un à une idée, c'est en train de me rendre dingue
tu as essayé de quitter la zone et d'y retourner ensuite ?

Moi pareil, cela marche une fois sur 2 aussi, et des fois il suffit que je parte puis revienne pour que le PNJ retourne à son WP de post
Citation :
tu as essayé de quitter la zone et d'y retourner ensuite
Non effectivement, je n'ai pas essayé, mais cela risque de gêner le jeu dans le module plus tard car plusieurs joueurs sont présents en même temps. Je vais tester quand même.

Citation :
Il faut aussi lui donner l'instruction de retourner à son WP sur son script de perception
Effectivement, je ne pense pas avoir activé cela. Quelle instruction est ce que je dois utiliser ?

Sur le script de la perception du PNJ, il faut mettre la fonction WalkWayPoint (un truc du genre, je n'ai pas tout en tête), l'aide de l'interface de script pourra te donner les détails de cette fonction.

Sinon post ton script de perception et on va regarder ça

Edit: J'ai aussi des problèmes de perception, elle est encore plus bizarre que sur NwN1 :/
Au niveau du script de perception, j'utilise le script de base de NWN2 (nw_c2_default2).
Par contre d'après ce que j'ai vu, la commande nw_i0_generic est placée en commentaire et d'après la modif effectuée, l'appel aux WalkWayPoints a été supprimée.

Alors là, je comprends pourquoi il y a tant de problèmes avec les walkspoints. Malheureusement, je ne suit pas un as du script....

J'imagine que je dois activer le nw_i0_generic
Puis dans le "ReactToSeenCreature" placer la commande WalkWayPoints, mais où exactement ?

Bref, je suis un peu perdu ...
Je t'ai rajouté des WalkWaypoints(); aux différents types de détection et à la détection générale. J'ai pas testé par contre.

Code:
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT2
/*
  Default OnPerception event handler for NPCs.

  Handles behavior when perceiving a creature for the
  first time.
 */ 
//:://////////////////////////////////////////////////
// ChazM - 4/21/05 modified so NPC's can stay focused
// ChazM 1/6/06 removed call to WalkWayPoints()
// ChazM 3/6/06 Added exit condition if object is script hidden
// ChazM - 1/26/07 - EvenFlw modifications, further reorganized 

#include "nw_i0_generic"
#include "ginc_behavior"

// If we see a PC, and we're supposed to be ambient, then set flag active. 
void RunAnimation(object oPercep) {WalkWayPoints();
	if (!GetIsInCombat() 
		&& !GetIsEnemy(oPercep)
		&& !IsInConversation(OBJECT_SELF)) 
   	{
   		if(GetIsPC(oPercep) &&
            (GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)
            || GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)
            || GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)
            || GetIsEncounterCreature()))
        {
            SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE);
        }
	}
}

void ReactToSeenCreature(object oPercep)
{	
	WalkWayPoints();
	// if I saw a PC, maybe I should say something.
	if(GetIsPC(oPercep)) 
	{
		if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION))
		 	SpeakOneLinerConversation();
		if(!GetIsInCombat() && !GetIsEnemy(oPercep) && GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION))
		 	ActionStartConversation(OBJECT_SELF);
	}
	
	// Special behavior
	if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) 
	{
		DetermineSpecialBehavior();
	} 
	else if(GetIsEnemy(oPercep)) // an enemy, and I don't have special behavior
	{
		if(!GetHasEffect(EFFECT_TYPE_SLEEP)) 
		{
		 	SetFacingPoint(GetPosition(oPercep));
		 	SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
		 	if(!GetIsInCombat())
		     	DetermineCombatRound();
		}
	}

}


void ReactToHeardCreature(object oPercep)
{
	if(GetIsEnemy(oPercep))
	{
		SetLocalInt(OBJECT_SELF, "EVENFLWSEARCH", 1);
		if (GetDistanceToObject(oPercep) <= 7.0
			&& !GetIsInCombat() )
		{
			if(TalentSeeInvisible()) 
			{
				__TurnCombatRoundOn(TRUE);
				__TurnCombatRoundOn(FALSE);
			} 
			else 
			{
				// either look around...
				if(d2()==1) 
				{
					ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.5);
					ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.5);
					ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 0.5);
					WalkWayPoints();
				} 
				else // or move toward what I heard
				{
					ActionMoveToLocation(GetLocation(oPercep), TRUE);
					float delay=IntToFloat(7+d8())/10.f;
					DelayCommand(delay, DetermineCombatRound());
				}
			}
		}
	} 
}

void ReactToVanishedCreature(object oPercep)
{
	if(GetIsEnemy(oPercep)) 
	{
		SetLocalInt(OBJECT_SELF, "EVENFLWSEARCH", 1);
		if (!GetIsObjectValid(GetAttackTarget())) 
		{
			ActionMoveToLocation(GetLocation(oPercep), TRUE);
			float delay=IntToFloat(7+d8())/10.f;
			DelayCommand(delay, DetermineCombatRound());
		}
		if (GetAttemptedAttackTarget() == oPercep 
			|| GetAttackTarget() == oPercep) 
		{
			if (GetArea(oPercep) != GetArea(OBJECT_SELF) 
				|| GetHasSpellEffect(SPELL_ETHEREALNESS, oPercep)) 
			{
				ClearAllActions();
				DetermineCombatRound();
			} 
			else 
			{
				if(TalentSeeInvisible()) 
				{
					__TurnCombatRoundOn(TRUE);
					__TurnCombatRoundOn(FALSE);
				}
				ActionMoveToLocation(GetLocation(oPercep), TRUE);
				float delay = IntToFloat(7+d8())/10.f;
				DelayCommand(delay, DetermineCombatRound());
			}
		}
	} 
}

void main()
{
    if (GetAILevel() == AI_LEVEL_VERY_LOW) 
		return;
	if (GetScriptHidden(OBJECT_SELF))
		return;
		
    int iFocused 		= GetIsFocused();
    object oPercep 		= GetLastPerceived();
    int bSeen 			= GetLastPerceptionSeen();
    int bHeard 			= GetLastPerceptionHeard();
	int bVanished		= GetLastPerceptionVanished();
    //int bInaudible		= !bHeard && !bSeen && !bVanished;
	
	if (iFocused <= FOCUSED_STANDARD 
		&& GetIsObjectValid(oPercep) 
		&& GetObjectType(oPercep)==OBJECT_TYPE_CREATURE) 
	{
	    if(bSeen) 
		{
			ReactToSeenCreature(oPercep);
    	} 
		else if(bHeard) 
		{
			ReactToHeardCreature(oPercep);
    	} 
		else if(bVanished) 
		{
			ReactToVanishedCreature(oPercep);
    	}
		else
		{
			WalkWayPoints();
		}
	 	RunAnimation(oPercep);
	} // end if focused
    if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen())
    {
        SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_PERCEIVE));
    }
}
Malheureusement sans succès .

J'ai essayé de regarder comment étaient définis les scripts d'origine, mais la fonction GetIsPostOrWalking a disparue de NWN2.

Je vais voir pour créer moi-même mon script pour la perception.
le WalkWayPoint a été remanié si je me souviens bien.
vous êtes sûr que la bibliothèque qui l'utilise est bien nw_i0_generic ? je croyais que c'était x0_i0_walkway qui le reprenait ?


(bon en cherchant en même temps sur l'éditeur voilà ce que j'ai trouvé)

Code PHP:

// HEAVILY REVISED!
// The previous version of this function was too little
// bang-for-the-buck, as it set up an infinite loop and
// made creatures walk around even when there was no one
// in the area.
//
// Now, each time this function is called, the caller
// will move to their next waypoint. The OnHeartbeat and
// OnPerception scripts have been modified to call this
// function as appropriate.
//
// However, also note that the mobile ambient animations
// have been heavily revised. For most creatures, those
// should now be good enough, especially if you put down
// some "NW_STOP" waypoints for them to wander among.
// Specific waypoints will now be more for creatures that
// you really want to patrol back and forth along a pre-set
// path.
//void WalkWayPoints(int nRun = FALSE, float fPause = 1.0, string sWhoCalled="no param");
//void WalkWayPoints(int nRun = FALSE, float fPause = 1.0, int bKickStart=TRUE, string sWhoCalled="no param");
void WalkWayPoints(int bKickStart=FALSEstring sWhoCalled="unknown"int bForcResumeOverride=FALSE); 
Pour ma part je n'ai pas de problème avec les WP_POST ... les pnjs vont à leur WP d'origine quand le serveur veut bien leur assigner une action dans leur liste (c'est à dire quand je n'ai pas 236 autres PNJs qui doivent faire quelque chose à côté)
Citation :
les pnjs vont à leur WP d'origine quand le serveur veut bien leur assigner une action dans leur liste (c'est à dire quand je n'ai pas 236 autres PNJs qui doivent faire quelque chose à côté)
Oui c'est peut-être ça le problème. J'ai 6 groupes de 4 créatures qui suivent des waypoints (et qui le font mal d'ailleurs ... certaines se perdent etc ...), 30 créatures fixes avec un waypoint de type POST et 4 créatures mobiles avec un waypoint de type POST.

Peut-être un peu beaucoup pour NWN2 non ?

J'ai eu un affreux doute hier car il faisait nuit dans mon module et que les waypoints étaient programmés pour le jour (je sais, je sais, erreur de débutant ...), mais non, rien y fait.
Du coup je reprogramme tout calmement et proprement
Bonsoir,
je me permets de remonter ce sujet qui semble somme toute assez similaire au problème auquel je dois faire face actuellement. Il concerne le déplacement des PNJs soldats pour une "ronde". Voici les symptômes :
- dans une zone A, tous les PNJs suivent la bonne trajectoire
- dans une zone B, il n'y a qu'un PNJ qui refuse de bouger
- dans une zone C, certains bougent et d'autres non

Je précise que j'utilise la fonction "créer un waypoint" quand on fait un clic droit sur un PNJ, que je m'assure que le WP est bien dans la direction que doit prendre le PNJ à chacun et qu'il soit placé au premier ou dernier WP de la ronde, il ne bouge toujours pas. Les WP sont toujours tous en zone marchable, et même si la trajectoire entière l'est, cela ne change toujours rien.

Voici les tests que j'ai effectué :
- le PNJ de la zone B est identique à l'un de la zone A (tout est identique, jusqu'au tag) : le PNJ de la zone B ne bouge toujours pas.
- j'ai supprimé le PNJ de la zone B, recalculé la zone, mis un autre PNJ, recalculé : toujours aucun mouvement.
- dans la zone B toujours, j'ai pris ce PNJ changé, supprimé tout son trajet et replacer des WP autrement, toujours aucun mouvement
- dans la zone C, lorsque les PNJs avaient été placés, ils bougeaient sans aucun problème. Depuis que j'ai ajouté la musique dans la zone, ils ne le font plus pour certains, d'autres bougent encore.
- j'ai supprimé les .trx des zones posant problème et recalculé : toujours aucun mouvement pour les mêmes créatures.
- j'ai changé le script default2 sur le onpercept des créatures en prenant l'une des deux autres "version" sans aucun effet toujours.
- il n'y a aucun problème de tag de WP ou de créature.
- les créatures ne sont pas le problème puisqu'elles effectuent leur ronde sur une zone mais pas l'autre, et puisque certaines tournaient mais ne tournent plus.

Je dois bien avouer que je suis à court d'idées et que je suis prêt à prendre chaque piste que vous pourriez avoir.

Je vous remercie par avance pour votre aide et attends avec impatience vos éclairages.
__________________
Si les PNJ sont dans des zones différentes, il faut absolument que les tags (PNJ et Waypoints) soient différents. Sinon NWN2 va essayer de faire bouger le PNJ de la zone B dans la zone A et forcément n'y arrivera pas.

Toute la logique des tags, variables locales, etc... est au niveau du module pas de la zone.

Pour la musique, je ne vois pas.
Pour certains PNJs, il est possible effectivement que le tag y soit pour quelque chose, je vais donc immédiatement essayé de changer cela.

Par contre il reste ces PNJs "mystère" où je suis sure qu'ils n'ont pas 2 fois le même tag, qui bougeaient autrefois, et qui ne bougent plus. Dans le doute, je vais aussi modifier leur tag, au cas où cela changeait quelque chose par miracle.

Je vous remercie pour votre aide et vous tiendrai au courant très prochainement.

Edit : Et bien... aussi simple que cela vous parut, il m'a suffit de changer absolument tous les tags ! Assez mystérieux pour les créatures qui n'étaient pas en double sur le module, l'essentiel reste que cela fonctionne et je vous remercie profondément !
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés