[Résolu] Créer un chambellan

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

Créer un chambellan

Message par Confrère_VF »

Bonsoir,

Maintenant que j'ai enfin pu faire en sorte d'y arriver, me voilà à la tâche probablement la plus compliquée avec une de mes prêtresses, à savoir la faire devenir chambellan.

Histoire de faire gagner du temps à tout le monde, la quête vanilla correspondante est nommée BYOHHouseStewardOffer.
Elle dispose de 3 Stage avec chacun un script :

Stage 10 : c'est quand on amène un compagnon avec nous jusqu'à notre manoir et qu'il se met à dire que "ce serait bien que quelqu'un tienne cette belle maison".
► Afficher le texte
Stage 100 : quand on dit à notre compagnon "ça marche, signez ici".
► Afficher le texte
Stage 200 : euh, je sais pas trop quand ça a lieu...
► Afficher le texte
Je remets également un rappel des noms des différents manoirs :
BYOHHouse1 = Epervine
BYOHHouse2 = Morthal
BYOHHouse3 = Aubétoile


Je pense me baser sur ces scripts, mais je ne vais pas les changer. Surtout pour éviter de casser le jeu. Donc pour que je puisse faire ma tambouille dans mon coin, j'ai fait une nouvelle Quest dans mon mod intitulée PDBLuciniaSteward.

Le problème, c'est que dans le jeu de base, il faut amener le compagnon avec nous pour lui montrer la maison et qu'il se propose de lui-même pour être chambellan. Dans mon cas, c'est notre personnage qui propose à Lucinia d'être chambellan, alors qu'elle est dans sa grotte en train de se cacher. Il y aurait trois choix de dialogue (un pour chaque manoir dispo). Grosso-modo, le dialogue ferait ça (en admettant qu'on ait les 3 domaines) :
Joueur
J'ai un manoir et il me faut un chambellan.

Lucinia
Où ça ?

Joueur
> Epervine
> Aubétoile
> Morthal
Je ne comprends pas tout à fait le fonctionnement de ces scripts vanilla, encore une fois probablement par manque de vocabulaire. Ce que je sais, c'est qu'il va probablement falloir demander, si on engage Lucinia, de terminer la Quest BYOHHouseStewardOffer en même temps que PDBLuciniaSteward (au moins pour le manoir en question).

Je ne sais pas combien de Stages ce mod va demander. Pour l'instant j'en suis à deux (0 et 10), mais peut-être qu'il va falloir en ajouter.

Je sais pas si c'est très clair, ce que je raconte^^ Donc pour résumer :
- On a construit une maison assez grande
- Cela fait apparaître une nouvelle option de dialogue quand on va parler à Lucinia
- On lui donne la maison qu'on veut qu'elle occupe
- Elle s'y rend après avoir accepté (je ne sais pas encore si je la fais se déplacer (elle est loin, dans la mine abandonnée près de Faillaise et du fort de la GdA) ou si je la fais se téléporter quand elle sort de la cellule)

Je n'attends pas qu'on me sorte le script tout fait (ça risque de prendre un peu de temps), mais déjà m'aider à comprendre ceux donnés ci-dessus, ce qu'ils signifient exactement. Et à partir de là, ce sera probablement plus facile d'avancer.
« 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: Créer un chambellan

Message par Tissendel »

Je connais pas trop comment sa fonctionne, j'ai jamais construit de maison avec Heartfire.

J'ai regardé un eu et de ce que je vois.

A priori c’est la quête BYOHHouseBuilding qui s'occupe de tout ce qui est une bonne nouvelle car tu devrait pouvoir faire ça sans toucher aux quêtes vanilla.

Au stage 100, la fonction HireSteward de la quête BYOHHouseBuilding est appelée ( avec 0,1 ou 2 pour les maisons BYOHHouse1, BYOHHouse2 ou BYOHHouse3 et la reference de l'acteur ). Cependant pour être sûr que le joueur possède bien la maison le script semble vérifier que le joueur est bien dans la maison. Pour toi il faudra trouver une autre astuce.

Voila le code de la fonction
function HireSteward(Int houseIndex, actor akNewSteward)

	HouseStewards[houseIndex].ForceRefTo(akNewSteward as objectreference)
	(HouseQuests[houseIndex] as byohhousescript).bHaveSteward = true
	DialogueFollower.DismissFollower(0, 0)
endFunction
La fonction attache l'acteur qui va être chambellan a un alias, marque la maison comme possédantr un chanbellan et libère le follower.

Dans le jeu, le futur chambellan doit d'abord un follower. Evidemment ça peut se contourner mais la fonction HireSteward renvoi le follower se qui risque de poser problème si on a un follower au moment de parler à Lucinia

Le stage 200 fait rentrer le chambellan dans une faction (BYOHHouseStewardNoForcegreet). la plus part du temps le fait d'être dans une faction est utilisé pour débloquer des dialogues. On peux imaginer que c'est le cas ici.

Pour résumer, tout cela semble reproductible dans une nouvelle quête. Il va falloir ajouter en properties HouseStewards et HouseQuests pour pourvoir se passer de la fonction HireSteward et les affecter comme dans la quête BYOHHouseBuilding.

Il y aurait donc ça a mettre :

quest[] property HouseQuests auto
referencealias[] property HouseStewards auto
faction property BYOHHouseStewardNoForcegreet auto

Voila déjà, j'espère que c'est pas du charabia et que j'ai bien compris comment ça fonctionne xD
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

Re: Créer un chambellan

Message par Confrère_VF »

Merci pour la réponse ! C'est un peu complexe mais en prenant du temps à bien lire ça devrait le faire^^ Mais ne pense pas te débarrasser de moi si facilement !
Tissendel a écrit : 01 sept. 2020, 20:16 Cependant pour être sûr que le joueur possède bien la maison le script semble vérifier que le joueur est bien dans la maison. Pour toi il faudra trouver une autre astuce.
Alors par expérience (mais c'était sur version LE, le mod sera exclusivement SSE) il n'y a pas besoin d'être à l'intérieur. Si je me souviens bien (même si ça remonte), quand j'avais amené Mjoll, elle a dit qu'elle voulait bien être chambellan en arrivant devant la maison, mais on était encore dehors. Du coup à vérifier sur une nouvelle maison, mais ça devrait être possible de le faire en dehors (simplement en virant Int houseIndex ?)
Tissendel a écrit : 01 sept. 2020, 20:16 la fonction HireSteward renvoi le follower se qui risque de poser problème si on a un follower au moment de parler à Lucinia
A la rigueur, pour ça, on peut toujours mettre un dialogue à Lucinia (genre "Je vais y réfléchir") quand on a un compagnon. C'est pas compliqué. Eventuellement rajouter un petit message en haut à droite du genre "Vous devez virer votre compagnon" ou, pour ceux qui n'ont pas peur des spoils, préciser carrément dans le LM.

Pour le reste, je vais essayer ce que tu as dit, même si j'ai peur de me perdre dans le processus^^
« 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: Créer un chambellan

Message par Tissendel »

Pour la vérification d'être du lieu, c'est moi qui est supposé que c'est l’intérieur, ça peut effectivement être les alentours. Ce que je voulais dire c’est que la quête semble vérifier ça pour s'assurer que le joueur à bien acheté et construit la maison. De ton coté, dans tes dialogues, il faut trouver un autre moyen de le vérifier avant de proposer à Lucinia d'être chambellan d'une maison que le joueur n'a pas. J'ai pas regarder en détail mais chaque maison possède sa propre quête. Je pense qu'il suffit pour chaque dialogue de poser une condition sur le stage de ces quêtes.

Pour le follower, ce que je voulais dire c'est que la quête vanilla fait comme ça. Mais clairement on peux passer outre.
La quête BYOHHouseStewardOffer appelle la fonction HireSteward qui posera problème. D'où l'idée de ne pas le faire et de réécrire ce qu'elle fait sans la partie "dismiss" du follower. Donc justes ces 2 lignes :
HouseStewards[houseIndex].ForceRefTo(akNewSteward as objectreference)
(HouseQuests[houseIndex] as byohhousescript).bHaveSteward = true
C'est pour cette raison que je disais de rajouter les HouseStewards et HouseQuests en properties ^^
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

Re: Créer un chambellan

Message par Confrère_VF »

Il y a quelque chose qui m'échappe : tu dis qu'il faut regarder la quête BYOHHouseBuilding et que le Stage 100 propose la fonction pour engager un chambellan, sauf que quand je regarde, il dit qu'il faut aller acheter des troncs d'arbre.
Pourtant, dans la section des dialogues, en effet, on peut embaucher le follower, ce qui lance le script (GetOwningQuest() as BYOHHouseBuildingScript).HireSteward(0, akSpeaker) - là encore, je comprends pas exactement comment il fonctionne, surtout avec ces parenthèses au début.
« 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: Créer un chambellan

Message par Tissendel »

Non c'est le stage 100 de la quête BYOHHouseStewardOffer, pas BYOHHouseBuilding

(GetOwningQuest() as BYOHHouseBuildingScript) : GetOwningQuest() appelle la quête dans laquelle tu écris le code ( et non pas "Self" comme je t'avais dis au début xD ). le "as BYOHHouseBuildingScript" c'est un peut plus compliqué à expliquer, c'est une notion de programmation orientée objet.

Un objet en programmation c'est un ensemble de variables ou properties et des fonction. Tout les objets sont comme ça. Les quêtes sont des objets Quest. Quand on ajoute un script avec extended Quest comme le fait le script BYOHHouseBuildingScript on rajoute des variables, properties et fonction à la quête qui devient un objet enfant de Quest nommé BYOHHouseBuildingScript . Un objet enfant d'un autre objet est un objet comme le parent mais avec des variables ou properties et des fonction en plus. Il sait donc tout faire pareil mais aussi des choses en plus.

HireSteward est défini dans BYOHHouseBuildingScript donc seul un objet BYOHHouseBuildingScript peut l'appeller et non Quest.
Pusique GetOwningQuest() renvoi un objet Quest, il faut spécifié derrière que cet objet Quest est en plus un sous objet BYOHHouseBuildingScript afin de pouvoir appeler la fonction HireSteward qui est défini dans BYOHHouseBuildingScript et non dans l'objet Quest.

Je sais pas trop si c'est bien clair ce que j'écris xD
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

Re: Créer un chambellan

Message par Confrère_VF »

Après avoir construit une maison afin de pouvoir faire des tests plus facilement, je me suis rendu compte qu'on pouvait proposer aussi à nos followers de devenir chambellan (c'est arrivé avec Rayya, on était sur le chantier). En regardant dans le CK, cette option est disponible durant la quête BYOHHouseBuilding. Du coup, est-ce que ce ne serait pas plus simple d'ajouter une réponse directement au sein de cette quête ? On ne touche à rien d'autre, on rajoute simplement un Topic ou même simplement une réponse en plus de celles <<Shared>> avec en condition que seule Lucinia peut le dire.
Ou bien ce serait faire une bêtise qui va tout casser dans le jeu ? Parce qu'honnêtement, en voulant essayer de faire comme tu m'as indiqué, je ne sais pas trop par où commencer ni où mettre les lignes de script^^
« 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: Créer un chambellan

Message par Tissendel »

J'imagine que c'est possible et plus simple mais il vaut mieux éviter d'autant que ça deviendrait incompatible avec tout mode touchant a cette quête.

De plus c’est pas très compliqué de faire autrement.

Perso j'y vais toujours par étape, d'abord tout simple sans vérif. juste un dialogue avec Luciana et attacher juste ce code :
HouseStewards[houseIndex].ForceRefTo(akNewSteward as objectreference)
(HouseQuests[houseIndex] as byohhousescript).bHaveSteward = true
Tu remplace houseIndex par le bon chiffre ( 0 pour BYOHHouse1, 1 pour BYOHHouse2, 2 pour BYOHHouse3 )

En rajoutant dans le code les properties suivantes :

referencealias[] property HouseStewards auto
quest[] property HouseQuests auto

Ensuite tu leur affectes la même chose que pour le script BYOHHouseBuildingScript de la quête BYOHHouseBuilding :

Image

Image

Avec ça Luciana devrait devenir chambellan de la maison.
Avatar du membre
Confrère_VF
Comédien
Comédien
Messages : 558

Re: Créer un chambellan

Message par Confrère_VF »

Tissendel a écrit : 06 sept. 2020, 16:31 De plus c’est pas très compliqué de faire autrement.
Je ne sais pas quel bac tu as passé ni quelles études tu as fait, mais tu parles à quelqu'un qui n'a pas l'esprit scientifique, malgré sa bonne volonté à essayer de comprendre^^

J'ai essayé de faire ce que tu as dit, mais ça pose toujours des problèmes :
► Afficher le texte
Réponse :
► Afficher le texte
Dès le début ça veut pas (mais ça, j'ai l'habitude^^) J'essaie de faire les choses de plusieurs manières différentes (mettre des parenthèses ou des crochets aux mêmes endroits que toi), mais ça ne marche pas mieux.
« 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: Créer un chambellan

Message par Tissendel »

C'est vrai que j'oublie que c'est un peu chinois pour beaucoup de monde ^^

Alors,

Le 0 doit être entre crochet. HouseStewards0 et HouseQuests0 => HouseStewards[0] et HouseQuests[0]
Ces variable sont des tableaux, c'est la liste des chambellan et des quêtes des maison hearthfire. Le 0 signifie qu'on prend la première case de la liste, ensuite 1 pour la suivante, etc...

Ensuite, j'ai été trop vite dans ce que je t'ai donné. "akNewSteward as objectreference" forcement il ne connait pas, ça vient d'un autre script. Ici il faut donc mettre akSpeakerRef qui correspond à la personne qui exécute le dialogue. Donc la ligne c'est :
HouseStewards[0].ForceRefTo(akSpeakerRef)
(HouseQuests[0] as byohhousescript).bHaveSteward = true
J'ai essayé chez moi ça marche. Par contre j'ai du récupéré les sources de tout les scripts de hearthfire pour pouvoir compiler. Mais tu semblais déjà les avoir toi. On verra si ça marche pas, je te l'es enverrai ^^
Répondre

Retourner vers « Entraide sur les scripts »