Faire apparaître ou disparaître un PNJ

C'est ici que vous pouvez poser vos questions techniques.
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Faire apparaître ou disparaître un PNJ

Message par daan »

Bonjour,

Je souhaiterai savoir comment vous procédez pour faire apparaitre ou disparaitre un NPC l’or d’une quête ?
A l’heure actuelle la seul méthode que j’ai trouvé est de lier ce PNJ a un Xmarker et d’agir sur ce dernier avec

Code : Tout sélectionner

Xmarker.disable()
Ou

Code : Tout sélectionner

Xmarker.enable()
Toutefois je me demande si, avec cette méthode, les PNJ passés en Disable() le resteront à la fin de la quête.
Je me tourne donc vers vous pour voir comment vous vous procédez.

D’avance merci pour votre aide,
Daan.
Parce qu'on a pas commencer avec Skyrim ;
faites donc un tour a cette adresse pour vous rappelez votre jeunesse:
http://www.abandonware-france.org
avec par exemple:
http://www.abandonware-france.org/ltf_a ... php?id=332
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par Gerauld »

Le mieux serait sans doute d'utiliser un reference alias pour placer l'actor :
créer un reference alias, "create reference to object" + le type d'actor + "At" et un marqueur.
Quand ta quête arrive au stage où ton PNJ doit disparaitre, tu fait un disable sur le reference alias puis un bon gros delete() des familles.
Ton PNJ ne réapparaitra pas sauf si ta quête est relancée. Et encore, ce ne sera pas le même mais un autre du même type (ce qui permet de placer un PNJ plus ou moins fort suivant le niveau du joueur).

Regarde la quête ArenaCombatQuest07Chaurus et la manière dont sont placé les chaurus (dans les reference alias).

Si ton PNJ est unique, il vaut mieux créer l'actor et le placer via l'event oninit() de la quête concernée (si elle est en "sart game enabled"). Il suffit de suivre le sujet cité ci-dessous. N'oublie pas de stocker la référence du PNJ que tu places dans une propriété si tu désires ensuite pouvoir agir dessus.

Concernant la manière de faire apparaitre un PNJ, je t'invite à consulter ce sujet : http://www.confrerie-des-traducteurs.fr ... 19&t=14812
(Ne pas oublier de faire des recherches avant de poster...)

Pour le faire disparaitre (caché) : disable()
pour le liquider : un disable() suivi d'un delete().
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par daan »

Bonjour,

Donc si j’ai bien compris :

L’alias me permet de faire apparaitre le PNJ automatiquement au début de la quête.
Par la suite je peux le supprimer via un « disable »

Dans mon cas le PNJ devrait apparaitre à un stage précis de la quête donc
Il serait plus propre de placer un Xmarker dans la cellule ou mon acteur devrait apparaitre puis créer deux propriétés au scripte de ma quête.
La première contiendrait l’acteur (PropertyActor) et la deuxième l’Xmarker (PropertyMarker).
Pour finir dans le fragment du stage ou mon acteur doit apparaitre :

Code : Tout sélectionner

PropertyMarker.PlaceAtMe(PropertyActor)
Suis-je bon jusque la ?

Questions :
Dans le fragment du stage ou mon acteur doit disparaitre je mets quoi ?
Pourquoi utiliser « PlaceAtMe » et non « PlaceActorAtMe » ?

Merci pour votre aide,
Daan
Parce qu'on a pas commencer avec Skyrim ;
faites donc un tour a cette adresse pour vous rappelez votre jeunesse:
http://www.abandonware-france.org
avec par exemple:
http://www.abandonware-france.org/ltf_a ... php?id=332
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par Gerauld »

Pour un actor, j'aurai spontanément utilisé un "placeactoratme" mais normalement, les deux devraient fonctionner...
Si l'acteur est unique pense à faire en sorte qu'il ne se retrouve pas dédoublé avec des placements successifs.
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par daan »

bonjour ,

merci pour la réponse .
et pour faire disparaitre l'actor je peux me contenter d'un "disable" sur l'alias ?

Daan
Parce qu'on a pas commencer avec Skyrim ;
faites donc un tour a cette adresse pour vous rappelez votre jeunesse:
http://www.abandonware-france.org
avec par exemple:
http://www.abandonware-france.org/ltf_a ... php?id=332
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par Gerauld »

Si tu ne dois plus utiliser du tout le personnage, fait aussi un delete() après le disable() pour le retirer des saves du jeu...
Si tu as besoin du perso après : soit tu fais un delete() et tu en places un nouveau à partir de ta quête, soit tu fais un disable qui sera suivi d'un enable puis d'un moveto pour être réutilisé sans qu'il n'y ai de perso en double.
Avatar du membre
ced909
Confrère
Messages : 151

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par ced909 »

est ce obligatoire le Disable() après un Delete() ?

Je m'explique, j'utilise Delete() dans un mod actuellement, pour supprimer une Reference Alias Optionel, suivi d'un Clear() (pour réutiliser une nouvelle ref dans cet alias)
Ma ref était supprimée et disparaissait sur le champs uniquement avec un Delete() ...
Avatar du membre
Gerauld
Confrère
Messages : 2439

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par Gerauld »

ced909 a écrit :est ce obligatoire le Disable() après un Delete() ?
C'est dans le sens inverse qu'il faut raisonner :
disable() pour cacher l'objet (et le rendre inaccessible au joueur) puis delete() pour le supprimer (s'il n'y en a plus besoin seulement ou si on a prévu de recréer l'objet au besoin).
Les suppressions n'étant pas toujours instantanées, le disable() placé avant permet de donner illusion au joueur que l'objet a été supprimé.

Un disable après un delete ne semble donc pas très logique car tu demandes à ce vieux papy russe de rendre inaccessible un objet qui n'est plus censé exister... Autant lui demander de cacher l'objet puis, en coulisses, d'essayer de éradiquer pendant que le joueur est passé à autre chose.
Le disable est donc optionnel mais présent pour palier certains soucis déjà observés.

Le fait d'avoir un objet pointé par un referencealias peut poser des soucis si on ne fait pas bien la différence entre l'objet pointé et le referencealias en terme de type d'objet (erreur courante quand on lit les questions posées sur les forums de modding).

Agir sur l'objet pointé par referencealias : si tu fait un referencealias.getref().disable(), il devrait fonctionner. MAIS, le referencealias reste sur la référence pointée, ce qui permet éventuellement de réutiliser l'objet avec un referencealias.getref().enable(). Ça c'est pour l'objet avec lequel est rempli le referencealias.
On passe par le getref() pour atteindre l'objet pointer et donc bosser sur la référence.

Concernant le referencealias en lui-même (objet qui pointe vers une référence):
-un Clear() ne fait que vider le reference alias. Donc celui-ci ne pointe plus vers l'objet (aucune action sur l'objet cependant)... Il vaut mieux être sûr d'en avoir fini avec l'objet avant de vider un referencealias ou stocké sa référence pour pouvoir agir dessus s'il existe encore.
-Un ForceRefIfEmpty permet de faire pointer le referencealias s'il est vide vers un autre objet (à utiliser après clear donc, sans effet sur les objets considérés).
-Un ForceRefTo() permet de faire pointer l'alias vers ce que l'on veut.
- De mémoire, le reste est constitué d'instructions commençant par des trucs comme trytoenable(), trytodisable()...

D'ailleurs, un referencealias.trytodisable() me semble plus élégant qu'un referencealias.getref().disable() car ce dernier risque de générer une erreur dans le log si le referencealias n'est pas rempli alors que le trytodisable() ne renverrait qu'un false dans ce cas, sans erreur.
ced909 a écrit :Je m'explique, j'utilise Delete() dans un mod actuelement, pour supprimer une ReferenceAlias Optionel, suivi d'un Clear() (pour réutiliser une nouvelle ref dans cet alias)
J'en déduis que quand tu parles d'un delete() sur un referencealias, tu parles soit d'un delete() sur l'objet pointé (référence), soit d'un trytodelete() sur le referencealias...
A ta place, j'aurai tenté un petit trytodisable sur le referencealias avant un trytodelete() suivi d'un forcerefifempty ou un forcerefto pour re-remplir l'alias (ou un arrêt/marche de quête après avoir fait le ménage si de nombreux alias sont concernés (méthode du flemmard)).

Le disable() permet juste de cacher l'objet en attendant que les conditions du delete() se réalisent dans certains cas...http://www.creationkit.com/Delete_-_ObjectReference

Pour répondre à ta question (disable() obligatoire ou non) : Obligatoire si la référence peut entrer dans l'un des cas cités par le lien ci-dessus, conseillé le reste du temps (au cas où...).
Il existe toujours plusieurs méthodes pour arriver au même résultat... Le tout est de choisir celle qui semble la plus adaptée à chaque cas particulier.
Hors-sujet
Bon, je retourne "jouer" avec des bases de données...
Avatar du membre
ced909
Confrère
Messages : 151

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par ced909 »

Merci Gerauld, j'avais mal interpreté ton Post précédent.
En ce qui me concerne pour mon mod, j'en ai absolument pas besoin du Disable() après tout les tests que j'ai fait sur mes Alias.
Gerauld a écrit :
ced909 a écrit :est ce obligatoire le Disable() après un Delete() ?
Concernant le referencealias en lui-même (objet qui pointe vers une référence):
-un Clear() ne fait que vider le reference alias. Donc celui-ci ne pointe plus vers l'objet (aucune action sur l'objet cependant)... Il vaut mieux être sûr d'en avoir fini avec l'objet avant de vider un referencealias ou stocké sa référence pour pouvoir agir dessus s'il existe encore.
-Un ForceRefIfEmpty permet de faire pointer le referencealias s'il est vide vers un autre objet (à utiliser après clear donc, sans effet sur les objets considérés).
-Un ForceRefTo() permet de faire pointer l'alias vers ce que l'on veut.
- De mémoire, le reste est constitué d'instructions commençant par des trucs comme trytoenable(), trytodisable()...
J'utilise déjà tout ceci, et je connais bien leur but.
- Clear() j'en ai besoin et je m'en sers sans pb
- ForceRefTo() m'a beaucoup aidé en le pointant sur une autre Alias d'une autre quête.

Pour t'expliquer ma situation :
- Ma quête démarre, donc une Reference Alias est utilisée et créait une Ref à un Object de type LVL Character (où dedans une panoplie d'Actor s'y trouve)
- Au démarrage de ma quête, j'appelle une fonction dont où dedans parmis d'autres ligne, je fais :

Code : Tout sélectionner

ReferenceAlias Property		FighterREF  Auto
ReferenceAlias Property	FighterAlias  Auto 
...
Fighter = FighterAlias.GetActorRef()
FighterREF.ForceRefTo (Fighter)   ; je récupère la reference actuelle pour un Alias d'une autre quête
- Lorsque j'en ai finit avec cet Alias, j'appelle une fonction qui fait un coup de :

Code : Tout sélectionner

Fighter.Delete()
FighterAlias.Clear()
FighterREF.Clear()
La quête est répètable, et me permet de réutiliser le bordel sur une nouvelle Reference, nouveau combattant.
En vérifiant les formID des anciennes Reference d'actor, à coup de prid, elles sont bien effacées et aucune ancienne Reference n'est restée visible une fois Delete()
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Faire apparaitre ou disparaitre un PNJ (NPC)

Message par daan »

Bonjour,

Bon la c’est officiel je plane ! :zen:

Mon but est de faire apparaitre un PNJ (unique) à un moment donné de la quête puis, quelques stages plus tard de le faire disparaitre.

C’est histoire d’alias reste très vague pour moi,
Je pense avoir compris qu’un alias est une sorte de pointeur que je peux faire pointer (logique ^^ ) vers plus ou moins ce que je veux notamment un PNJ.
Je peux par la suite faire appel à la référence pointée par l’alias en appelant ce dernier. (Est ce bien ca ?)
Si j’ai bien compris jusque la : pourquoi passer par l’alias plutôt que de directement par la réf ?

Ce qui me pose le plus gros problème c’est :
1) Comment définir où la référence va apparaitre ?
(J’ai bien tenté un : MonXmarker.PlaceAtMe(MonAlias) mais visiblement j’ai loupé un truc car papyrus me renvoi une erreur de compilation.)

2) Comment je fais pour faire apparaitre la ref pointer par l’alias a un moment « T » ?
Je crois savoir que les refs sont créer au lancement de la quête, est ce correcte ? Si c’est bien ca, ca voudrait dire que mon PNJ sera « créé » au tout début de ma quête. Non ?

Je m’excuse encore une fois mais cette histoire d’alias c’est vraiment pas clair pour moi.
D’avance merci aux courageux qui voudrons bien m’expliquer.

Daan.
Parce qu'on a pas commencer avec Skyrim ;
faites donc un tour a cette adresse pour vous rappelez votre jeunesse:
http://www.abandonware-france.org
avec par exemple:
http://www.abandonware-france.org/ltf_a ... php?id=332
Répondre

Retourner vers « Entraide sur le Creation Kit »