[Résolu] Changer la tenue d'un PNJ selon le lieu

Le langage des scripts.
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

Changer la tenue d'un PNJ selon le lieu

Message 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  
Modifié en dernier par Confrère_VF le 27 nov. 2019, 12:10, modifié 1 fois.
« Le terme "doubleur" est totalement erroné quand il désigne les acteurs prêtant leur voix. Il définit un entrepreneur qui a une société de doublage. » - Éric Legrand.
Mes doublages réalisés et en cours.
Avatar du membre
Tissendel
Maîtresse de Forge
Maîtresse de Forge
Messages : 1157

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

Message 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
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

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

Message 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 ?
« Le terme "doubleur" est totalement erroné quand il désigne les acteurs prêtant leur voix. Il définit un entrepreneur qui a une société de doublage. » - Éric Legrand.
Mes doublages réalisés et en cours.
Avatar du membre
Tissendel
Maîtresse de Forge
Maîtresse de Forge
Messages : 1157

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

Message 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() ^^
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

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

Message 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 !
Modifié en dernier par Confrère_VF le 17 nov. 2019, 12:00, modifié 1 fois.
« Le terme "doubleur" est totalement erroné quand il désigne les acteurs prêtant leur voix. Il définit un entrepreneur qui a une société de doublage. » - Éric Legrand.
Mes doublages réalisés et en cours.
Avatar du membre
Tissendel
Maîtresse de Forge
Maîtresse de Forge
Messages : 1157

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

Message 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
Avatar du membre
Tissendel
Maîtresse de Forge
Maîtresse de Forge
Messages : 1157

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

Message 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 ^^
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

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

Message 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) ?
« Le terme "doubleur" est totalement erroné quand il désigne les acteurs prêtant leur voix. Il définit un entrepreneur qui a une société de doublage. » - Éric Legrand.
Mes doublages réalisés et en cours.
Avatar du membre
Tissendel
Maîtresse de Forge
Maîtresse de Forge
Messages : 1157

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

Message 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:
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

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

Message 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.
« Le terme "doubleur" est totalement erroné quand il désigne les acteurs prêtant leur voix. Il définit un entrepreneur qui a une société de doublage. » - Éric Legrand.
Mes doublages réalisés et en cours.
Répondre

Retourner vers « Entraide sur les scripts »