Page 1 sur 3

Changer la tenue d'un PNJ selon le lieu

Posté : 16 nov. 2019, 00:04
par Confrère_VF
Bonsoir,

Je cherche depuis quelques temps le moyen de modifier l'outfit d'un PNJ en fonction d'où il se trouve. Les deux outfits sont créés, aucun problème avec ça. Dans mon cas, j'aimerais que le perso enfile une tenue particulière quand il sort de chez lui.
Pour l'instant, je n'ai concentré mes recherches que sur les fichiers de Serana, qui enfile une capuche à chaque fois qu'elle se trouve au soleil. C'est ce qui se rapproche le plus de ce que je veux faire. Malheureusement, mes recherches ont été peu concluantes jusqu'à présent...

Du coup, je voulais savoir si ça venait d'un Package, d'un script ou d'autre chose, voir au moins vers quoi je peux m'orienter.

Merci !

Voici le script tel qu'il devrait être écrit. Un grand merci à Tissendel !
Armor Property TenueIntérieure Auto
Armor Property TenueExtérieure Auto

Event OnCellAttach()

	Cell CelluleIntérieure = Self.GetParentCell()
	If CelluleIntérieure.IsInterior()

		If !Self.IsEquipped(TenueIntérieure)
			Self.EquipItem(TenueExtéreure)
		endif

	else

		If !Self.IsEquipped(TenueExtérieure)
			Self.EquipItem(TenueIntérieure)
		endIf

	endIf

endEvent  

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 16 nov. 2019, 19:13
par Tissendel
Salut,

Il y a plusieurs solutions pour faire ce genre de chose. Soit un script sur le PNJ soit des activateurs sur les lieux en questions.

Si tu as des endroits bien spécifiques, tu peux placer des activeurs qui feront changer de tenue le PNJ lorsqu'il passera dedans. C'est le plus simple mais oblige à placer des activateurs partout où tu veux. Tu aurait un code du genre a ajouter a chaque activateurs.
Event OnTriggerEnter(ObjectReference akActionRef)
    If akActionRef== TonPNJ
         TonPNJ.UnequipAll()
         TonPNJ.EquipItem(TaTenue)
    endif
endEvent
Apres si tu entend par "Chez toi" toutes tes maisons et que tu en as beaucoup. On doit pouvoir utiliser un Event OnCellAttach ou OnCellLoad pour détecter le changement de cellule ( A vérifier j'ai jamais essayé ). Ensuite tu contrôle dans quelle cellule tu es pour savoir si tu dois changer de vêtements. Soit tu défini une liste de cellules soit tu regarde si le propriétaire de la cellule est le Player.
Ca donnerais un truc du genre à attacher sur le PNJ :
Event OnAttachedToCell()
    Cell Celulle = Self.GetParentCell()
    If Ceullule == .....
         ....

   OU

   Cell Celulle = Self.GetParentCell()
   If Celulle.GetActorOwner == PlayerRef
      ...
      .....

endEvent

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 16 nov. 2019, 20:07
par Confrère_VF
Merci de la réponse !
Quand je dis "chez lui", c'est vraiment chez lui : il a sa propre maison et une seule, ce n'est pas chez moi.
Et techniquement je veux le faire se couvrir quand il sort mais pas en intérieur (donc chez lui, à l'auberge etc.) Je pense pour le coup que le plus simple serait la deuxième solution : le PNJ va soit chez lui, soit à l'auberge soit dans un magasin. Le reste du temps, il se promène en ville (enfin, en principe : je dois encore programmer ça^^ )

Que veulent dire les points dans le deuxième cadre ?

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 16 nov. 2019, 22:13
par Tissendel
les .... c'est genre blablabla xD La suite du code quoi.

Ha ok, une tenue intérieure et une extérieure. Encore plus simple car il suffit de de faire : if Cellule. IsInterior() ^^

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 16 nov. 2019, 22:28
par Confrère_VF
D'accord, merci beaucoup. Mais pardonne ma nullitude dans le domaine, j'écris le script comment (exactement) ? Et je le place où par rapport au PNJ ?

Est-ce que j'écris
if PNJOutfit.IsInterior ()
ou bien
if PNJOutfit.IsInterior (MaisonDuPNJ)
ou autre chose ?

Et comment faire pour l'extérieur du coup ? (PNJOutfitOutdoor)



Note aux admins : Du coup si c'est du script, peut-être que le sujet peut être déplacé dans la bonne rubrique ? Merci !

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 17 nov. 2019, 11:22
par Tissendel
Ha ok, autant pour moi, je pensais que tu maîtrisais un peu les scripts alors je suis rentrée dans le détails ;)

Dans ce cas je peux t'écrire le script mais j'aurais besoin de quelques infos en plus.

Tu as donc 2 tenues, une intérieure et une extérieure. Je suppose que ces tenues ont différentes parties ( tenue, bottes, gants, etc... ). Peut tu me dire exactement. De même, y a t'il des armes aussi à équiper/déséquiper ?

Pour savoir comment créer un script, tu peux regarder ici : viewtopic.php?f=387&t=12826
Dans ton cas, tu vas mettre le script directement sur ton PNJ. Donc dans ton Actor, cadre scripts :

Image

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 17 nov. 2019, 23:14
par Tissendel
Voila le script à faire.
Scriptname cvfChangeTenuePNJ extends Actor  

;Pour le nom de script, je met toujours un préfixe devant. Moi j'utilise  "Tiss" pour mes scripts, ici j'ai mit cvf pour ton pseudo. C'ets juste une précaution au cas où un autre moddeur ferais une fonction "ChangeTenuePNJ" afin que ca fasse pas conflit.
;Donc en fait il faut bien "extends Actor" pour avoir accès aux foncions d'équipement

Armor property TenuePNJinterieure auto 
Armor property TenuePNJexterieur auto 

;Ici on définie des properties. C'est des variables auxquelles on assignera des objets du CK ( ici des Armor ) plus tard
;On a besoin que de 2 tenues puisque seules la partie "corps" change
 
Event OnCellAttach()
  ;Si j'ai bien compris l'event OnCellAttach s’exécute chaque fois que l'Actor est attaché à une cellule. Donc ca devrait s'executer chaque fois que le PNJ change de cellule.
  
  Cell Cellule = Self.GetParentCell()  ;Fonction qui permet de récupérer la cellule dans laquelle se trouve l'Actor.
  If Cellule.isinterior() ;On teste si la cellule est un intérieur ou pas
      
      If !Self.IsEquipped(TenuePNJinterieure) ;Si l'Actor n'a pas la tenue équipée
        Self.EquipItem(TenuePNJinterieure)   ;On lui équipe
      endIf
      
  else ;SInon
     
      If !Self.IsEquipped(TenuePNJexterieur)  ;Si l'Actor n'a pas la tenue équipée
      	Self.EquipItem(TenuePNJinterieure)   ;On lui équipe
      endIf  
      
  endIf
  
  
endEvent
Voila, j'espère que ça marche xD

N'hésite pas si tu comprends tu aimerais plus d'explications ^^

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 18 nov. 2019, 00:10
par Confrère_VF
J'ai failli me perdre à la deuxième étape XD Il fallait dire qu'après avoir entré la première ligne, il fallait faire "Edit Source" sur le script^^

Par contre, là je ne comprends pas :
Hors-sujet
Cell Cellule = Self.GetParentCell() ;Fonction qui permet de récupérer la cellule dans laquelle se trouve l'Actor.
Et aussi, tu marques "EquipItem", mais moi ce que je veux ce n'est pas un objet, c'est un Outfit (ou alors c'est la même chose dans les scripts) ?

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 18 nov. 2019, 11:58
par Tissendel
j'avais justement rajouté dans le tuto "Pour ensuite pouvoir écrire le script, clique-droit -> Edit Source" :P

"récupérer la cellule", comment expliquer ?

Les fonctions peuvent retourner ( c'est le terme exact ) une variable. GetParentCell() par exemple retourne une variable cellule ( La celulle à laquelle est attaché l'Actor, donc celle dans laquelle le PNJ se trouve )
En faisant "Cell Cellule" on créé une variable du nom de Cellule et de Type Cell
Donc "Cell Cellule = Self.GetParentCell()" créer une variable de type Cell à laquelle on va assigner la cellule où se trouve le PNJ.
C'est ce qui va nous permettre ensuite d'utiliser la fonction IsInterior() sur cette variable Cellule pour savoir si elle est en intérieur ou non,

EquipItem() es un fonction qui va équiper un item. Un item ca peut être plein de chose, tenue, arme, potion, nourriture. Dans le cas d'une tenue ou d'une arme ça l'équipe sur l'Actor, une potion ou de la nourriture fera boire/manger l'Actor

J'espère que j'arrive à être compréhensible :xD:

Re: Changer la tenue d'un PNJ selon le lieu

Posté : 19 nov. 2019, 11:32
par Confrère_VF
J'avoue que j'ai du mal à comprendre cette histoire de cellules^^ C'est peut-être le vocabulaire, je sais pas... Docteur Mobius, j'ai besoin de mentats !
Pour EquipItem, je crois que j'ai compris.

Alors j'ai fait le script comme tu l'as dit, après quelques ratés j'ai réussi à le compiler correctement, mais ça ne fonctionne pas : j'ai testé en téléportant le PNJ à l'extérieur, mais il garde sa tenue d'intérieur :/

J'ai un autre problème assez gênant (mais je pense pas que ce soit dans la bonne catégorie), le PNJ disparaît parfois. C'est arrivé quand j'ai attendu, mais ça arrive parfois aussi quand je change de cellule. Et parfois, il revient quant je ressors et rerentre :sourcil: Mais il faudra peut-être faire un autre sujet spécifique.