Aller au contenu


Les Caprices De Positioncell


  • Veuillez vous connecter pour répondre
11 réponses à ce sujet

#1 abg

abg

    L'ABG pour les civilisés


Posté 17 avril 2010 - 15:42

Suite à un débat initié dans une autre enfilade (Quête de Kaletha), je reporte ici quelques éléments dans l'espoir que d'autres moddeurs scripteurs puissent nous aider à y voir plus clair.

Attention c'est long...

Résumé : la commande positioncell appliquée à un PNJ abouti parfois à un étrange bug : Le PNJ se retrouve "statufié" à l'issue de la téléportation :
Capture d'Elendell : http://img179.imageshack.us/img179/3268/photo1260.th.png

Mes hypothèses :

Voir le messageabg, le 17 avril 2010 - 08:15, dit :

Ce bug "du PNJ statufié" que tu signales Elendell est lié à la commande Positioncell. On le rencontre entre autres dans le mod "Animation Citadine" qui utilise aussi des positioncell :
Il se produit lorsque la position d'arrivée du PNJ est dans une cell contiguë à celle du PJ mais trop loin pour que s'activent les package IA et les animations. Le PNJ se "débloque" aussi lorsque l'on franchit une porte (loaddoor).

Ici j'ajouterai même que ça semble aboutir parfois à la mort du PNJ. Mais il est possible que ce soit lié à une trop grande différence d'altitude entre position de départ et d'arrivée (bug similaire à celui des compagnons qui se prennent des dégâts de chute en passant une loaddoor). Bref, un autre bug...

Je pousse plus loin mon raisonnement au risque de me fourvoyer :)

Voir le messageabg, le 17 avril 2010 - 09:11, dit :

Imagine une grille de 9 cases (la cell où se tient le PJ et les 8 contigües). A l'intérieur inscrit un cercle centré sur le PJ : C'est la zone d'activité des PNJs et créatures, là où sont jouées les animations et les packages IA. Si Positioncell envoie le PNJ à l'extérieur de ce cercle : il va se retrouver figé. Mais le disable/enable ne pourra rien pour lui sauf si l'on attend que le PJ se soit rapproché (et que le PNJ se retrouve donc dans le cercle) pour envoyer cette paire de commandes...
[...]
J'ai aussi quelques incertitudes sur le rayon exact d'exécution de l'IA et des animations (je me demande même s'il n'y a pas 2 cercles, voir 3 en comptant le champ de vision  :eek: )

Un artefact visuel qui doit être lié à ça : lorsque l'on joue avec le champ de vision réglé au maximum (pas testé avec FPS Opt) il est fréquent que l'on voit des créatures ou des PNJs "statufiés" à la limite du champ de vision. C'est flagrant avec les levelled creature car les "Singes Ninjas" du TESCS sont volontairement placés au dessus du sol (pour éviter aux braillards et autre netchs d'être coincés d'office). Le jeu les débloque lui-même lorsque l'on s'approche...

Mais Elendell apporte de nouveaux éléments :

Voir le messageelendell, le 17 avril 2010 - 14:13, dit :

Après avoir lu ton dernier message, j'ai voulu réessayer la manip indiquée à papa, pour te donner plus de précisions. Étonnamment, le "PositionCell" ne se faisait plus. Après plusieurs essais, il s'est avéré qu'en relançant totalement le jeu, le "PositionCell" du script fonctionnait ou non de manière aléatoire. S'il ne fonctionnait pas, il fallait relancer le jeu (juste la sauvegarde ne suffisait pas). Quand il fonctionnait, le résultat était toujours le même (je devais faire disable/enable). Mais même si le "PositionCell", les "AiTravel" et le "SetFight" se faisaient, le "ForceSneak" du script lui, ne se faisait jamais.

Après vérification des scripts, il s'est avéré que le "PositionCell" se faisait sur un PNJ "disabled" et qu'il était ensuite rendu "enabled" (dans la même frame). J'ai changé cet ordre en faisant d'abord le "enable" (dans un autre script et la frame précédente), puis avec ce script, le "PositionCell" du PNJ déjà "enabled".

De cette manière tout fonctionne normalement et il n'y a plus le bug du personnage figé.

Je passe sur les sauvegardes/rechargement : On sait qu'il faut autant que possible quitter le jeu avant de charger sous peine de garder des paramètres hors-saison...
Elendell : ce qui me manque ce sont les infos suivantes :
-Distance du PNJ lorsqu'il réapparait
-Réglages distance de vue et distance IA (Attention à FPSOpt qui joue avec les deux si je me souviens bien...)

Pour terminer voilà ce que dit Wrye (mod "Living Cities Of Vvardenfell" dont "Animation Citadine" disponible sur Wiwiland est une vieille version) :

Citation

Floating NPCs

•  You may see NPCs floating up in the air, in front of buildings that they should be behind, drawn without atmospherics, etc. The problem here is Morrowind not properly adapting to objects being brought into the current viewable area.

•  Solution: Change cells. Crossing an exterior cell boundary seems to be sufficient to fix the drawing problem, but often doesn't fix the floating problem. However, ducking into an interior cell and then returning will always fix both problems.

(LCV utilise massivement des Positioncell pour déplacer les PNJs selon l'heure...)

L'UESP et le MSfD évoquent divers problèmes liés à cette commande mais rien qui semble en rapport avec ce bug des "PNJs statufiés"

Alors il y a-t'il des moddeurs dans la salle qui se sont amusés avec positioncell  :cry:
Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance

#2 elendell

elendell

    Mécano Dell'Arte


Posté 17 avril 2010 - 18:34

Voir le messageabg, le 17 avril 2010 - 15:42, dit :

Elendell : ce qui me manque ce sont les infos suivantes :
-Distance du PNJ lorsqu'il réapparait
Je ne suis pas sûr du sens de ta question, alors je précise les faits (sans ma correction) :

Avant le "PositionCell", le PNJ est dans une cell intérieure de stockage et "disabled". Quand le PJ passe à < 256 d'un activateur, le script de cet activateur déclenche une MB à bouton et lance un script global qui fait le "PositionCell", téléportant le PNJ dans une cell extérieure contigüe à celle du PJ, avant de le rendre "enabled" (dans le même bloc mais pas forcément la même frame, à cause de la MB). Suivant la vitesse de déplacement du PJ, la distance du PNJ avec lui quand le joueur clique sur OK de la MB varie entre 2526 et 2555 unités.

Le PNJ ne apparait pas mais apparait (figé et noir) et il est visible à travers les statics et le terrain qui sont entre les deux. Si je fais disable/enable sur le PNJ, cela relance la machine. C'est à dire que le PNJ n'est plus figé et commence son déplacement scripté mais en même temps, il n'est plus visible de la position du PJ puisqu'il se retrouve masqué par les statics et le terrain comme cela doit l'être.

Voir le messageabg, le 17 avril 2010 - 15:42, dit :

-Réglages distance de vue et distance IA (Attention à FPSOpt qui joue avec les deux si je me souviens bien...)
J'ai essayé toutes les combinaisons de mini à maxi, autant de la profondeur du champ de vision que de la distance IA, avec toujours le même résultat. Le résultat est également le même avec ou sans FPSOptimizer.


A part ça, le fait que le problème du "PositionCell" de ce script se résout comme je l'ai fait ("enable" avant "PositionCell") n'est pas obligatoirement contradictoire avec ton hypothèse. Même si dans ton hypothèse "disable/enable" ne changerait rien alors que dans ce cas, cela agit à chaque fois, sans que le PJ se rapproche.

"PositionCell" est une fonction qui agit très bizarrement et qui est sujette à des bugs divers. Cela peut donc être un cas différent que celui que tu as observé dans d'autres modules. Voici quelques cas déjà reportés avec cette fonction :

- PNJ qui se fige de manière aléatoire.

- Impossible de mettre des variables en arguments, alors que certains y sont parvenus (MSfD8).

- Un cas très proche dans le rendu visuel avec celui de Kalendaar. En cherchant à résoudre le bug de ce sujet, j'avais eu plusieurs résultats dont certains très "amusants" comme la transformation du PNJ en toupie mais certains essais me donnaient presque le même résultat que le bug de Kalendaar (PNJ figé et noir). La différence était que le PNJ était "incrusté" dans mon champ de vision quelque soit l'endroit où je regardais alors que là, non.

- "PositionCell" a par contre une utilité secondaire très importante qu'il importe de souligner : Elle permet de résoudre le bug des 72h dans certains cas. On peut grâce à cette fonction faire un "ForceGreeting" sur un PNJ au delà de 72h de séparation mais aussi faire un détecteur de rechargement de sauvegarde pour Morrowind seul. "PositionCell" a donc également quelques caprices utiles...  :)

#3 abg

abg

    L'ABG pour les civilisés


Posté 17 avril 2010 - 22:22

Voir le messageelendell, le 17 avril 2010 - 18:34, dit :

Voir le messageabg, le 17 avril 2010 - 15:42, dit :

-Distance du PNJ lorsqu'il réapparait
Je ne suis pas sûr du sens de ta question, alors je précise les faits (sans ma correction) :
[...]
Suivant la vitesse de déplacement du PJ, la distance du PNJ avec lui quand le joueur clique sur OK de la MB varie entre 2526 et 2555 unités.

Oui, c'est ce que je voulais savoir... et qui renverse ma théorie du PNJ téléporté hors du "cercle de l'IA"  :eek:

elendell dit :

Le PNJ ne apparait pas mais apparait (figé et noir) et il est visible à travers les statics et le terrain qui sont entre les deux.

Deuxième symptôme du bug; le premier étant la "pétrification"...

elendell dit :

- PNJ qui se fige de manière aléatoire.

Exactement le même bug. Je l'ai croisé avec le même type de script que Dératiseur, puis avec "Living Cities...". Je vais regarder si ta technique du disable/enable permettrait d'éliminer ce maudit bug de LCV (faudra un peu de temps de test vu le caractère relativement aléatoire de ce problème)

elendell dit :

- Un cas très proche dans le rendu visuel avec celui de Kalendaar. En cherchant à résoudre le bug de ce sujet, j'avais eu plusieurs résultats dont certains très "amusants" comme la transformation du PNJ en toupie mais certains essais me donnaient presque le même résultat que le bug de Kalendaar (PNJ figé et noir). La différence était que le PNJ était "incrusté" dans mon champ de vision quelque soit l'endroit où je regardais alors que là, non.

C'est toujours exactement le même bug (avec peut-être une manifestation visuelle différente mais il est probable que causes et remèdes soient les mêmes...)
Pour le PNJ "en toupie", c'est par contre tout à fait autre chose. Wrye les appelle "Jiggy Dancer" ou très joliment "Derviches de Dagoth" dans LCV  :) Selon mes expériences ça se produit souvent lorsque :
- Le PNJ est dans une cell dotée d'un pathgrid
- Qu'il s'approche de la frontière avec une autre cell pareillement équipée.
A un moment qui reste à définir l'IA ne parvient pas à trancher entre un cap (suivi de segment de pathgrid) et un autre. Ça se produit même avec des PNJs absolument non-scriptés issus du jeu de base (bons endroits pour faire du "Jiggy Dancer Spoting"  :P  : Gnisis, entre le village et Fort Darius. Sadrith Mora entre la ville et le Complexe du Serval...)

elendell dit :

- "PositionCell" a par contre une utilité secondaire très importante qu'il importe de souligner : Elle permet de résoudre le bug des 72h dans certains cas. On peut grâce à cette fonction faire un "ForceGreeting" sur un PNJ au delà de 72h de séparation mais aussi faire un détecteur de rechargement de sauvegarde pour Morrowind seul. "PositionCell" a donc également quelques caprices utiles...  :cry:

Astuces que je mets dans ma besace  :P
T'ai-je jamais dis que je n'aimais pas appeler l'amnésie des 72 h "bug" ? Exactement pour la même raison : il y a des astuces qui en tirent profit  :( (Mesurer un intervale de 3 jours entre 2 visites à un PNJ, besoin de laisser un PNJ "se ressourcer" et oublier les offenses, laisser le jeu effacer lui-même certaines choses comme une capacité ou un "modstat" donné par script...etc. Un certain projet MR sur lequel je travaille ne marcherait tout simplement pas sans l'amnésie des 72 h  ;) )
Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance

#4 Spitoven

Spitoven

Posté 12 janvier 2015 - 12:35

Bonjour à tous.

Je n'arrive pas à faire fonctionner mon PositionCell. Ce n'est pourtant pas le premier que j'utilise et les autres fonctionnent.

La ligne défectueuse est la suivante :

Citation

"smuggler horintar"->PositionCell, 4695, 6270, 1100, 12000, "Norenen-dur, basilique des Murmures Divins"

J'ai beau la lire et la relire, je n'y vois pas d'erreur. Au cas où, je vous mets le script entier :

Spoiler

Chaque autre ligne du script fonctionne parfaitement. C'est à n'y rien comprendre. J'avais séparé le PositionCell du reste exprès pour qu'il n'entre pas en conflit avec d'autres fonctions, car il ne fonctionnait déjà pas lorsqu'il était intégré au paragraphe du dessous.

Merci pour votre aide.

PS : Le script est attaché au PNJ sur lequel le PositionCell est censé s'appliquer. Est-ce que ça peut poser problème ?

Modifié par Spitoven, 12 janvier 2015 - 13:14.

Image IPB

#5 Troglodyte

Troglodyte

Posté 12 janvier 2015 - 14:13

Non, cela ne devrait pas poser problème, je le fais moi-même et ça marche. En revanche je ne comprend pas ce que signifie la dernier chiffre, "12000". Cela désigne la rotation du personnage il me semble, hors un tour complet va jusqu'à 360 degrés. Habituellement ça ne dérange pas de lui faire faire plusieurs tours, mais avec un chiffre si élevé, je ne sais pas.

#6 Spitoven

Spitoven

Posté 12 janvier 2015 - 18:05

C'est une valeur normale pour un NPC, comme expliqué sur cette page : http://www.uesp.net/...es3Mod:Position

De toutes façons, au départ je l'avais laissé à 0, et ça ne fonctionnait déjà pas.

Merci pour ta réponse :)
Image IPB

#7 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 12 janvier 2015 - 21:19

C'est peut-être une de ces abominations qui surviennent quand le nom de la cell est plus long que 31 caractères. A tester, en tout cas.

#8 Troglodyte

Troglodyte

Posté 13 janvier 2015 - 13:46

Je sais que ça n'aide pas beaucoup mais il arrive parfois qu'un script ne fonctionne pas pour aucune raison particulière.

La fois où ça m'est arrivé, j'ai copié le contenu du script, effacé le script, créé un tout nouveau script et collé. Et ça a marché. C'est triste, hein ? xD

(Je sens que je vais souffrir le jour où je testerai mon mod moi.)

Modifié par Troglodyte, 13 janvier 2015 - 13:48.


#9 Spitoven

Spitoven

Posté 30 janvier 2015 - 23:01

Merci pour vos réponses, je n'ai pas trouvé de solution pour l'instant mais je vous tiens au courant.
Image IPB

#10 Troglodyte

Troglodyte

Posté 30 septembre 2015 - 16:08

Bonjour à tous.

J'ai un problème de personnage figé, mais à la limite, ça c'est pas grave, vu qu'ils sont censés être "paralysés par la peur".
En revanche je rame depuis plusieurs jours sur un autre problème lié à la fonction positioncell. Je veux redéplacer ces personnages, plus un autre. Positioncell ne m'a jamais posé de problème, mais il semble qu'utilisé avec "cellchanged", il ne fonctionne pas : les personnages ne se téléportent pas du tout où on les attend. Voilà le modèle que j'utilise pour les trois personnages en question.

Citation

Begin Bus_rassecscript

short companion

if ( MenuMode == 1 )  
return   
endif

set companion to 1

if ( getjournalindex, bus_recrutement == 20 )
PositionCell, 32 159 -81 180, "L'Elfe des Mers, niveau supérieur"
sethello 0
endif

if ( getjournalindex bus_evasion == 70 )
if ( cellchanged == 1 )
positioncell, 127 -516 -228 15, "Sanglargrad, fosse"
sethealth 0
endif
endif

end bus_rassecscript

J'ai toujours la possibilité de disable ces personnages et d'enable leurs sosies, ça m'arrive parfois, mais j'ai déjà tout programmé pour que ce soit leur ID qui soit pris en compte et pas un autre. Y a-t-il un problème que je n'ai pas détecté, une façon de résoudre cette équation ? L'idée est de quitter les personnages pour les retrouver ailleurs dans une autre quête.

Merci d'avance.

En prime je poste les scripts des deux autres personnages, au cas où.

Citation

begin bus_platypusscript

float px
float py
float pz

if ( MenuMode == 1 )  
return   
endif

if ( GetCurrentAIPackage == 3 )
if ( GetDistance, Player > 1024 )
  set px to ( player-> GetPos, x )   
  set py to ( player-> GetPos, y )
  set pz to ( player-> GetPos, z )
  SetPos, x, px
  SetPos, y, py
  SetPos, z, pz
endif
endif

if ( getjournalindex bus_evasion == 70 )
if ( cellchanged == 1 )
positioncell 381 -183 -170 0 "Sanglargrad, fosse"
setfight 100
endif
endif

if ( getjournalindex bus_trahison >= 70 )
if ( ondeath )
journal, bus_trahison, 80
forcegreeting
endif
endif

end bus_platypusscript

Citation

Begin Bus_aimeparlapluiescript

short companion

if ( MenuMode == 1 )  
return   
endif

set companion to 1

if ( getjournalindex, bus_recrutement >= 20 )
PositionCell, -94 146 -81 180, "L'Elfe des Mers, niveau supérieur"
sethello 0
endif

if ( getjournalindex bus_evasion == 70 )
if ( cellchanged == 1 )
positioncell, -86 -486 -228 180, "Sanglargrad, fosse"
setfatigue 0
addspell "immune to fire"
addspell "immune to poison"
endif
endif

if ( getjournalindex bus_trahison >= 90 )
sethealth 0
endif

end bus_aimeparlapluiescript

(Pas pure soucis d'exprimer ma lassitude à des gens susceptibles de la comprendre je précise que ça fait trois séances de plusieurs heures que je travaille sur ce problème et que je suis assez frustré à la perspective de devoir revoir mes scripts et mes dialogues pour créer des doubles de ces trois personnages plutôt que de faire marcher ce tout bête et simple script. :( )

Modifié par Troglodyte, 30 septembre 2015 - 16:51.


#11 Nerwal

Nerwal

    SAMU Kalendaarien


Posté 30 septembre 2015 - 18:07

Déjà je n'utiliserais jamais CellChanged dans un script, à moins d'y être absolument obligé.
CellChanged est une source bien connue de problèmes : cf http://wiwiki.wiwila...S_:_CellChanged et http://www.uesp.net/...hanged_function

#12 Troglodyte

Troglodyte

Posté 03 octobre 2015 - 18:50

Wow, en effet. Il faut que je trouve un autre moyen de déclencher le PositionCell en l'absence du joueur.

Il me semble cependant qu'il ne marche pas s'il n'est pas attaché au personnage qui doit justement bouger ?

Edit : voici la version finale... ma save est un peu sale donc deux des personnages ne se trouvent pas où ils devraient être mais avant que j'ajoute le Done, ils se trouvaient à leur place, mais ils étaient repositionnés en boucle car je n'avais pas pris la précaution de faire en sorte que le script ne se déclenche qu'une fois. Je pars donc du principe que ça marche même si je ne suis pas en mesure de le tester dans des conditions idéales. Je vais continuer le test en faisant comme si ça avait marché, il n'y a pas de raison que ça ne marche pas (n'est-ce pas ? :/ ).
J'ai donc mis ce paragraphe sur un personnage "porteur" que le joueur doit forcément rencontrer. J'en ai même profité pour déplacer un personnage de plus...


Citation

if ( getjournalindex bus_evasion == 80 )
if ( done == 0 )
better_uvirith_s_platyp->positioncell 381 -183 -170 0 "Sanglargrad, fosse"
better_uvirith_s_platyp->setfight 100

better_uvirith_s_rassec->positioncell, 127 -516 -228 15, "Sanglargrad, fosse"
better_uvirith_s_rassec->sethealth 0

better_uvirith_s_aime->positioncell, -86 -486 -228 180, "Sanglargrad, fosse"
better_uvirith_s_aime->setfatigue 0
better_uvirith_s_aime->addspell "immune to fire"

better_uvirith_s_ragras->PositionCell, -320 1344 -387 132, "Tel Uvirith, Sadrith Bzarkensthand"

set done to 1
endif
endif


Donc si, placer le Positioncell sur un personnage tiers marche...

Modifié par Troglodyte, 03 octobre 2015 - 18:51.





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)