Aller au contenu


Positioncell Avec Variables En Arguments


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

#1 elendell

elendell

    Mécano Dell'Arte


Posté 18 mars 2009 - 20:14

Bonsoir,

Je voudrais savoir si quelqu'un a déjà essayé d'utiliser PositionCell ou Position avec des variables en arguments.
(Avec succès de préférence :huhu: ).

Les MSfD 8 et 9 indiquent ceci :

Citation

Position, float_enum_x, float_enum_y, float_enum_z, float_enum_zRot
(pour les extérieurs)(floats acceptés dans les extensions)

PositionCell, float_enum_x, float_enum_y, float_enum_z, float_enum_zRot, “ID_cellule”
(pour les cellules intérieures/extérieures) (floats acceptés dans les extensions)

Notez que dans Morrowind seul, ces fonctions n’acceptent que des valeurs littérales en arguments. (cela a probablement changé avec Tribunal : pas sûr que ce soit le cas de toutes les versions ou seulement dans les extensions mais : Position/PositionCell peuvent prendre des variables de type float, mais elles doivent être LOCALES ! (info par Indigo Rage).

Avec la console, ça fonctionne très bien, même avec des variables pour donner les coordonnées. Mais j'ai beau essayer de toutes les manières possibles, par script j'obtiens toujours le même résultat : Le PNJ ou la créature est positionné à 0, 0, 0, 0.

J'ai essayé avec des PNJ/Créatures placés par PlaceAtPC ou placés dans le tescs mais le Position est toujours fait dans la cellule où se trouve déjà le PNJ/créature. Je donne les valeurs aux variables dans un script lié au PNJ ; elles sont donc locales. Par exemple :

begin Test_Rat

float xxx
float yyy
float zzz
float aaa

if ( Test_Glo == 0 )

	set xxx to 1911.532
	set yyy to 2296.441
	set zzz to -690.000
	set aaa to 1600

elseif ( Test_Glo == 1 )

	PositionCell xxx yyy zzz aaa "todd"

endif

end

(Test_Glo est une globale changée à la console mais c'est juste pour lancer la fonction quand je veux).

J'ai aussi essayé avec un script global pour lancer le "PositionCell". J'ai essayé des syntaxes différentes avec virgules et guillemets. Enfin, j'ai essayé tout ce qui me venait à l'esprit, même improbable mais il se positionne toujours à 0, 0, 0, 0. Je l'essaye bien sûr avec les extensions.

J'ai malheureusement un grand besoin d'utiliser cette fonction car ma solution de secours (SetPos) est beaucoup moins efficace qu'un PositionCell. De plus, je ne peux pas faire "SetAngle" sur des PNJ/Créatures et "Face" n'accepte pas les variables en arguments.

Si vous avez des infos sur ce problème, je suis donc preneur !

Edit : Je ne l'ai pas précisé mais les coordonnées d'essai sont libres de collision.

#2 Post-it

Post-it

    Attachant détachable adhérant sans tâcher


Posté 18 mars 2009 - 20:34

Bonjour Elendell, je pense que je ne suis pas très calé pour répondre à ton problème mais...

Spoiler

EDIT : Je viens de faire un petit script pour tester un peu ce que j'avançais est apparemment ça ne fonctionne pas non plus je rencontre le même problème le PNJ se place à 0,0,0,0 :

Begin AAA
 
  float xxx
  float yyy
  float zzz
  float aaa
  short doonce
 
  if ( OnActivate == 1 )
 
   if ( doonce == 2 )
	  return
   endif
 
   if ( doonce == 0 )
	set xxx to -512
	set yyy to -496
	set zzz to 384
	set aaa to 100
	set doonce to 1
   endif
 
   If ( doonce == 1 )
	"AAA_lil"->PositionCell, xxx, yyy, zzz, aaa, "Seyda Nihyn, auberge d'Arrile"
	set doonce to 2
   endif
 
  endif
 
  end

même si je déclare en short (au lieu de float) ça ne fonctionne pas ...

Après plusieurs essais, je comprend mieux ton problème, et je dois avouez que je ne comprend pas non plus ...

Modifié par Post-it, 18 mars 2009 - 23:58.

Y'a le Post-it et le Post-at ...

------------------------------------------------
Membre auto-proclamé des défenseurs des post-its sur forum, maintenant que je sais ce que c'est ...

#3 elendell

elendell

    Mécano Dell'Arte


Posté 19 mars 2009 - 00:28

Bonjour Post-it,

Voir le messagePost-it, le 18.03.2009 à 20:33, dit :

Avec ton script globale as-tu bien écrit cela (attention le moindre espace en trop après la flèche ou avant peut poser problème, je l'ai déjà expérimenté)
"Rat"->PositionCell, xxx, yyy, zzz, "todd"
Oui, j'ai essayé toutes sortes de syntaxes y compris celle-ci.

Citation

Donc j'essayerais comme cela : et même si le float est accepté on peut essayé sans pour voir ...

"Rat"->PositionCell, xxx, yyy, zzz, "todd"
; avec xxx = 1911
; avec yyy = 2996
; avec zzz = -690
Je crois avoir aussi essayé mais n'en suis pas sûr car j'ai essayé plein de choses. Mais de toutes façons, la variable doit être une float selon le MSfd et les coordonnées comporteront des décimales. Pour pouvoir utiliser des nombres entiers, il faudrait d'abord les arrondir avant de les donner aux variables ; ce qui serait illogique mais surtout, le résultat ne serait pas assez précis.

Citation

Une question le 0,0,0,0 c'est celui de la cellule todd ?
J'ai d'abord essayé dans la cellule où j'en ai besoin. Puis, celle-ci étant une intérieur mais avec la case "behave like exterior" cochée, j'ai essayé dans todd (au cas où ce serait la cause). Dans les 2 cas, j'obtiens les coordonnées 0 en faisant des "Getpos" après le position. Je n'y suis pas allé voir dans todd mais je suis allé au point 0 dans l'autre et la créature y était bien. Le "PositionCell" envoie au 0 de la cellule de départ qui est d'ailleurs la même que celle définie dans les arguments. Ça peut valoir le coup d'essayer une cellule de départ différente de celle d'arrivée mais je n'y crois guère. J'essayerai quand même.

Citation

EDIT : Pour le rat j'ai pensé que c'était comme un PNJ donc pas de Zrot, je pense qu'il n'y en a pas ... C'est pas un objet à moins que je me trompe...
Un PNJ a aussi un Zrot qui correspond à l'angle z exprimé en minutes d'arc.

Citation

Note that the ZRot parameter does not appear to work when PositionCell is  used on NPCs. It seems to work fine on the player and other objects though.
Avec la console, ça fonctionne aussi pour les PNJs et il me semble qu'en scripts également quand c'est exprimé en caractères numériques. Il faut juste penser à transformer l'angle en minutes d'arc.

Citation

Ce qui est bizare c'est que cela fonctionne avec la console ...
C'est bien à cause de ça que je m'obstine mais il y a d'autres cas où console et script agissent différemment.

Citation

Sinon cela peut venir de Test_Glo (il est déjà à 1), cela expliquerait que tu arrives à 0,0,0,0...
Non, je vérifie l'état des variables avant de passer à 1.


J'ai trouvé ça depuis tout à l'heure :

Citation

GhanBuriGhan, in his indispensable scripting guide, stated that it will accept local float variables (after expansion packs were installed). This I have NEVER found to be true. Don't depend on PositionCell being able to work with variables. It's very picky.
Je comprends très mal l'anglais mais il me semble que ça indique la même difficulté (impossibilité ?) que je rencontre.

Merci pour ton intérêt et tes propositions !  :huhu:

EDIT : Et ton essai que je viens de voir !

#4 alliop

alliop

    Renaissance de l'art magique.


Posté 19 mars 2009 - 06:08

Bonjour bonjour, c'est l'heure du petit déjeuner :huhu:

Côté syntaxe, celle-ci fonctionne parfaitement :
"player"->PositionCell 4 1393 -390 180 "Vivec, guilde des Mages"

Citation dit :

GhanBuriGhan], in his indispensable scripting guide, stated that it will accept local float variables (after expansion packs were installed). This I have NEVER found to be true. Don't depend on PositionCell being able to work with variables. It's very picky.
GhanBuriGhan déclare que [la fonction] acceptera des variable locales float (après installation des expansions). Je n'ai JAMAIS constaté que ce celà fût vrai. Ne vous fiez pas à la possibilité pour PositionCell de fonctionner avec des variables. C'est très capricieux.

Par contre "SetPos" (donc en extérieur) fonctionne très bien avec des locales float.
Un bout du script de la fonction "ralliement" des familiers de Nova V2 :
 
; NM_marqPos<axe> sont des globales
float xpos
float ypos
float zpos

;[.......]
		set xpos to NM_marqPosX
		set ypos to NM_marqPosY
		set zpos to NM_marqPosZ
		Player->setpos x xpos
		Player->setpos y ypos
		Player->setpos z zpos
;[.....]
End
Je suppose que tu sais déjà ça.
Je ne sais pas si ça fonctionne dans une cell intérieure qui "behave as exterior".... à vue de nez je ne pense pas, mais peut être?

Voilà les seuls grains que je peux apporter à moudre.

Modifié par alliop, 19 mars 2009 - 06:12.

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#5 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 19 mars 2009 - 06:44

j'avais essayé il y a longtemps, mais j'ai lâché par fatigue... :huhu:

j'ai remplaçé mon code par quelques lignes, plus efficaces, du genre :

Begin blabla

Short xpos
short ypos
short zpos

short State

If ( State == 0 )

	 Set xpos to 245
	 Set ypos to 877
	 Set zpos to 87
	 Set State to 1

elseif ( State == 1 ); on téléporte l'ID dans l'interieur

	 ID->Positioncell, 0 0 0 0 "Cell"
	 Set State to 2

elseif ( State == 2 )

	 Id->SetPos X xpos
	  Id->SetPos Y ypos
	  Id->SetPos Z zpos
	 Set State to -1

endif

end

voila sleeping.gif

#6 alliop

alliop

    Renaissance de l'art magique.


Posté 19 mars 2009 - 09:24

@ Snaïpe :
Ah merci! Je n'étais plus sûr que les SetPos fonctionnaient bien en intérieur et ne renvoyaient pas à des coordonnées extérieures.

@ Elendell :
Si tu cherches à créer un effet qui transporte immédiatement PJ à des coordonnées non fixes (celles d'un adversaire mobile par exemple, disons un garde qui fait une ronde, ou un ennemi qui fuit le combat), tu peux l'approcher en lui donnant temporairement une capacité "lévitation 1000".
(J'avais scripté pour Oblivion une amulette donnant une "attaque du serpent" qui fonctionnait ainsi :
il fallait "se ramasser" en position sneaking pendant 5 secondes avant de pouvoir "bondir" avec bonus de vitesse et d'attaque pendant 2 secondes -ajout/retrait de capacité-).
Bien sûr il faudra alors que le joueur tienne compte des obstacles, mais c'est déjà ça.

Sans la volonté du joueur... je ne vois pas pour l'instant (PlaceAtMe placerait le "player" elfe noir acrobate level 1 de base du tesc).

"Bienvenue à toi, lent homme lié, poussif tresseur des vitesses."
Alain Damasio


#7 elendell

elendell

    Mécano Dell'Arte


Posté 19 mars 2009 - 17:32

Bonjour,

@ alliop : Merci pour la traduction. Pour "SetPos", ça fonctionne effectivement très bien en intérieur. C'est juste qu'on ne peut pas l'utiliser pour passer d'une cellule intérieure à une autre puisque les coordonnées sont celles de la cellule où il est lancé. Mais en faisant comme Snaïpe, c'est OK.

@ Snaïpe : Ma recherche n'est pas juste de positionner un PNJ dans une autre cellule. Sinon, ton script conviendrait bien. Le PNJ ou la créature est à placer dans la même cellule où il se trouve déjà.

@ vous deux : Un peu de précision pour comprendre l'intérêt de "PositionCell" avec variables (au lieu de Setpos).

L'utilisation :

Il s'agit de détecter d'éventuelles collisions pour un Misc qui se déplace sur un trajet inconnu à l'avance. C'est obligatoirement un Misc. PNJs ou créatures servent donc de détecteurs de collision. A défaut de "PositionCell", je peux utiliser "SetPos" mais il y a deux raisons qui rendraient "PositionCell" largement préférable :

1) "SetAngle" ne fonctionne pas sur des PNJ/créatures. Si c'était le cas, il me suffirait d'un seul détecteur pour le volume principal du Misc, un parallélépipède rectangle. Il suffirait dans ce cas que le détecteur ait la même forme et de le placer à chaque frame au même endroit et selon le même angle z. Resterait à ajouter un ou deux autres détecteurs si je voulais détecter d'autres points qui ne seraient pas inclus dans le volume principal. A défaut de pouvoir choisir l'angle, il faut placer autant de détecteurs à "CollisionBox" cubique que de points susceptibles d'entrer en collision isolément. (Ou à "CollisionBox" rectangle mais dont la longueur est dans le sens vertical, comme un PNJ).

Pour donner un angle z à un PNJ, il y a bien "Face" mais celle-ci n'accepte pas non plus les variables.

2) Suivant mes essais (avec arguments numériques), "PositionCell" est plus efficace que "SetPos".
Si on tente de positionner un PNJ avec "PositionCell" dans un endroit "occupé", le PNJ est placé systématiquement à l'endroit "libre" le plus proche. Il suffit donc de vérifier à la frame suivante si la position du PNJ est bien celle qui a été donnée à la précédente. S'il n'y est pas, c'est que l'endroit n'était pas libre et qu'il y avait donc collision.

Avec "SetPos", cela dépend des cas. Dans certains, le PNJ n'est pas placé à l'endroit "occupé" et on sait donc qu'il y a collision mais dans d'autres, il est placé comme si l'endroit était libre. Et à partir du moment où le PNJ est à l'intérieur d'un static, il peut être déplacé dans ce static sans générer de collision. Pour l'entrée dans le static, cela semble dépendre des coordonnées de la position précédente du PNJ.

Peut-être est-ce parce que "SetPos" se fait en 3 opérations séparées (x, y et z) alors que "PositionCell" se fait en une seule instruction.
"PositionCell" vérifie un endroit défini par 3 axes avant d'agir alors que "SetPos x" par exemple ne vérifie pas un un point défini par 3 axes.
Et même s'il le fait en combinant x à venir avec y et z actuels, le lieu qui en résulte peut être libre alors que celui de la position finale (après les 3 "SetPos") ne l'est pas.


Si vous connaissez un moyen de donner un angle à un PNJ à partir de variables, merci de me le signaler. Ce serait déjà un progrès.
Pour "PositionCell", je crains bien que ce soit fichu. Il me reste quand même un petit doute à cause de l'affirmation du MSfD qui est généralement très fiable.

Je vais essayer d'utiliser "PlaceItem" pour voir si ça réagit comme "PositionCell" quand l'endroit est occupé. Si oui, il me faudra voir si de créer une nouvelle référence de PNJ/Créature à chaque frame peut causer un fort ralentissement du fps.

Merci pour vos réponses !

#8 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 19 mars 2009 - 17:59

Citation

Si oui, il me faudra voir si de créer une nouvelle référence de PNJ/Créature à chaque frame peut causer un fort ralentissement du fps.
Tant que tu le setdelete après, je pense pas qu'il y ait de problème.

Mais sinon c'est quoi que tu veux faire précisément ? Il y a peut-être d'autres solutions.
You look like you need a monkey!

Attention : perfectionniste paresseux.

#9 elendell

elendell

    Mécano Dell'Arte


Posté 19 mars 2009 - 18:08

Voir le messageKafou, le 19.03.2009 à 17:58, dit :

Mais sinon c'est quoi que tu veux faire précisément ? Il y a peut-être d'autres solutions.
Heu... Je ne sais pas quoi dire de plus, à part que c'est pour un véhicule qui est un Misc lorsqu'il se déplace et en activateur à l'arrêt. Il y a d'autres raisons pour cela.

#10 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 20 mars 2009 - 13:06

pour ce qui est de donner une valeur d'angle à un PNJ, J'avais mis au point trois solution, mais la 1ere est vraiment compliqué pour si peu de choses :?:

Short Angle
Short State
Short DoOnce 
Short xpos
Short ypos
Short zpos

Set xpos to ( ID->GetPos X )
Set ypos to ( ID->GetPos Y )
Set zpos to ( ID->GetPos Z )

If ( Angle == 45 )

   ID->PositionCell 0 0 0 2700 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 90 )

   ID->PositionCell 0 0 0 5400 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 135 )

   ID->PositionCell 0 0 0 8100 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 180 )

   ID->PositionCell 0 0 0 10800 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 225 )

   ID->PositionCell 0 0 0 13500 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 270 )

   ID->PositionCell 0 0 0 16200 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 315 )

   ID->PositionCell 0 0 0 18900 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

Elseif ( Angle == 360 )

   ID->PositionCell 0 0 0 0 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

endif

ça me permet d'avoir les angles principaux, et ça peut être affiné ( j'irait pas le faire à 1° près, quand même, même si c'est possible )
c'est aussi la seule solution que j'ai trouvé pour donner un angle précis au PNJs

il est donc facile de rajouter, des lignes de plus, par exemple 54°, on n'aurait qu'à ajouter les lignes :

If ( Angle == 54 )

   ID->PositionCell 0 0 0 3240 "Cell"
   ID->GetPos X xpos
   ID->GetPos Y ypos
   ID->GetPos Z zpos
   Set Angle to 0 

endif

à noter que la variable angle est a modifier via un autre script déclencheur.


les deux autres méthodes dépendent d'autre facteur.

Si par exemple, on veut que le NPC en question soit tourné vers le PJ, il suffit de lui attacher, le temps de la rotation un SetParalysis 1 ( Seconde methode, mais impossible d'attribuer un angle précis )

Après, l'autre méthode consiste a faire un Face ou un AITravel qui s'annule tout de suite ( genre 10 frames plus loin ), avec pour arguments les coordonnées d'extrémités de la cell ( Je ne sais pas si AITravel accepte des variables, mais si oui, ça devrait être précis ); seul inconvénient de cette méthode : en dehors des angles 45°,90°,135°,180°,225°,270°,315° et 360°, elle demande un calcul encore plus poussé que la 1ere méthode.


P.S. Je savais pas que les miscs avaient une collision  8)

Modifié par Snaïpe, 20 mars 2009 - 18:10.


#11 elendell

elendell

    Mécano Dell'Arte


Posté 20 mars 2009 - 20:04

Bonjour Snaïpe,

J'avais envisagé quelque chose dans le même principe que ta méthode 1 mais pour les coordonnées x et y. J'y ai renoncé car le nombre de probabilités était trop important, même en passant par des étapes "d'affinage" par milliers, centaines, etc. Mais pour les angles, c'est peut-être envisageable car avec une précision au degré, ça ne fait que 360 possibilités. Je vais y réfléchir.

La seconde méthode n'est pas utilisable dans mon cas. D'une part, "SetParalysis" ne maintiendrait pas le PNJ face au PJ si ce dernier se déplace mais d'autre part, il ne sont pas réellement sur un objet en mouvement ; c'est juste une illusion. La position du PJ suit celle de l'objet (par Get/SetPos) et celle du PNJ la suit par un calcul de trigonométrie. (Je relève la position et l'angle de l'objet puis je calcule sinus et cosinus de l'angle et je me sers du résultat pour replacer le PNJ toujours à la même position par rapport au centre de l'objet, quelques soient son angle et sa position).

Je n'ai pas compris la 3ème méthode mais de toutes façons, ni "Face" ni "AiTravel" n'accèptent les variables (j'ai essayé). Et je le regrette infiniment pour "AiTravel" car elle aurait été la fonction idéale, encore mieux que "PositionCell". En effet, si tu donnes un ordre "AiTravel" à un PNJ avec des coordonnées déjà occupées, le PNJ se fige sur place. Des lors, il aurait suffit de vérifier à la frame suivant si le PNJ aurait bougé ou non.

PS : Les Miscs n'ont pas de collision.

Merci pour tes idées !  :(

#12 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 20 mars 2009 - 20:13

Citation

J'avais envisagé quelque chose dans le même principe que ta méthode 1 mais pour les coordonnées x et y. J'y ai renoncé car le nombre de probabilités était trop important, même en passant par des étapes "d'affinage" par milliers, centaines, etc. Mais pour les angles, c'est peut-être envisageable car avec une précision au degré, ça ne fait que 360 possibilités. Je vais y réfléchir.

Et puis généralement, on peut se contenter d'incrémenter l'angle de 10 en dis, voire plus ( a moins de vouloir faire des coordonnées d'angles d'une précision redoutable :( ); personnellement, je me contente pour le moment des angles 10, 20, 30, 40, ... 360 ( mais il est vrai que des fois, lors de coordonnée précises, je soit obligé de mettre 2°, voir 1° d'incrémentation )

content de t'avoir été utile ;)




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

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