Aller au contenu


Ajouter « Quest Object » Au Pnj Marchant ?


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

#1 Daan_Noa

Daan_Noa

Posté 22 juin 2013 - 20:01

Bonjour,

Je cherche depuis quelque temps un moyen d’ajouter un objet de quete (un livre) à la liste des articles vendus par un PNJ marchant.
La solution la plus proche du but est inspiré de la quête « WICourier » voir ci-dessous.

Ce que j’ai fais :
  • J’ai créé un nouvel alias « DMN_Alias_Book23 » de type : « Spécific Référence » avec les flags : « optional » et « quest object ». aucune référence n’est sélectionné, puisque cet alias sera « remplit » plus tard via le script.
  • J’ai créé un nouveau script de quete «DMN_Script_AddQuestObjectToContainer »
J’y ai rédigé :
ObjectReference Property pCourierContainer  Auto
{Pointer to WICourierContainerRef}

function addItemToContainer(form FormToAdd, int countToAdd = 1)
{adds a form item to the courier container, and increments global to turn on courier change location event quest}
; 			 debug.trace("WICourierScript: addItemToContainer()")
pCourierContainer.addItem(FormToAdd, countToAdd)								  ;add parameter object to container
							   endFunction

function addRefToContainer(objectReference objectRefToAdd)
{adds a reference to the courier container, and increments global to turn on courier change location event quest}
; 			 debug.trace("WICourierScript: addRefToContainer()")
pCourierContainer.addItem(objectRefToAdd)								 ;add parameter object to container
endFunction

function addAliasToContainer(ReferenceAlias refAliasToAdd)
{adds a reference of a RefAlias to the courier container, and increments global to turn on courier change location event quest}
; 			 debug.trace("WICourierScript: addAliasToContainer() which will get the objectReference of the alias, then call its addRefToContainer()")
objectReference vObjectRefToAdd = refAliasToAdd.getReference()
addRefToContainer(vObjectRefToAdd)

EndFunction
  • Dans le fragment du stage j’ai rédigé :

Alias_DMN_Alias_Book23.ForceRefto(Game.GetPlayer().PlaceAtMe(DMN_Book_23))
(DMN_Quest as DMN_Script_AddQuestObjectToContainer).addaliasToContainer(Alias_DMN_Alias_Book23)

  • J’ai placer le coffre dans la celle a la porté du joueur ( moi !) pour les testes.

Et avec tous ca cela marche …… presque !
En effet le livre est bien créer dans le coffre mais le PNJ marchant ne l’a pas dans sa liste d’item en vente.
Et cela malgré la « vendorItemListe » perso contenant presque tous les keywords (notament « VendorItemBook ».

J’ai également remarqué que si je décoche « quest object » dans l’alias, tous fonctionne : le livre est ajouter dans le coffre et le marchant me le propose bien a la vente.

Je cherche donc a comprendre pourquoi le flag « quest object » empêche le marchant de me proposer l’item (ici un livre)
Si l’un d’entre vous aurait une idée, je suis preneur (cela fait plus de 8 jours que je galère).

D’avance merci,
Daan.

#2 Aurix

Aurix

    La Bidouille ou un truc comme ça


Posté 22 juin 2013 - 23:46

je risque de dire une bêtise vu comme j'aime les quest items... mais le but d'un objet de quête n'est-il pas, justement, de ne pas pouvoir être vendu ?

bon, sinon, j'ai bien une idée... mais attention, c'est un peu bidouille... :

- tu crées deux objets, un qui est un objet de quête et l'autre non.
- tu donnes au marchand l'objet qui n'est pas un objet de quête
- tu attaches à cet objet un script qui fait :
Container property vendorContainer auto
ObjectReference property playerREF auto
Book property baseItem auto
Book property questItem auto
Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
  if (akOldContainer == vendorContainer)
	if (akNewContainer == playerREF)
	  playerREF.AddItem(questItem, 1, true)
	  playerREF.RemoveItem(baseItem, 1, true)
	endif
  endif
endEvent
- tu penses à remplir les propriétés du script...


et quand ça marche pas, tu reviens en demandant si mon sous nom n'est pas totalement justifié...
"You are the best Septim that's ever ruled. Well, except for that Martin fellow, but he turned into a dragon god, and that's hardly sporting... You know, I was there for that whole sordid affair. Marvelous time! Butterflies, blood, a Fox, a severed head... Oh, and the cheese! To die for."

Shéogorath - Prince de la folie

Vrai Grand Moddeur et FPIA à ses heures...

#3 Daan_Noa

Daan_Noa

Posté 23 juin 2013 - 17:40

Bonjour,

D’abord merci pour ton aide !

En suite, j’ai également déjà pensé a une ruse de ce type mais , parce qu’il y a un mais , ce qui m’a poussé a utiliser un Object de quête c’est que ces derniers ne sont pas supprimés du coffre quand ce dernier est «  respawns » .
Donc il semble nécessaire que ce flag « quest object » soit présent sur l’objet (un livre) quand ce dernier est dans le coffre.

Au vue de ces nouvelles infos aurais tu une autre idée ? (une bidouille ou un truc comme ça ira très bien !)  :roll:

Encore merci pour ton aide,
Daan.

#4 Aurix

Aurix

    La Bidouille ou un truc comme ça


Posté 23 juin 2013 - 18:25

eh bien, ça devient plus drôle... tu ajoutes l'objet de base à une formlist que contient le coffre lors du début de la quête... et le retires de ladite formlist quand le joueur achète le livre... à noter qu'il faut absolument que l'objet soit ajouté par un script pour pouvoir le supprimer ensuite...

Modifié par Aurix, 23 juin 2013 - 18:26.

"You are the best Septim that's ever ruled. Well, except for that Martin fellow, but he turned into a dragon god, and that's hardly sporting... You know, I was there for that whole sordid affair. Marvelous time! Butterflies, blood, a Fox, a severed head... Oh, and the cheese! To die for."

Shéogorath - Prince de la folie

Vrai Grand Moddeur et FPIA à ses heures...

#5 Daan_Noa

Daan_Noa

Posté 23 juin 2013 - 20:31

Bonjour et merci pour ton aide ,

Si j’ai bien compris tu me parle de cela :
http://www.confrerie...p?f=225&t=13784

si oui : tip-top , je réfléchissais justement a l’utilisation de cette méthode que j’ai déjà utilisé . ( je deviens un peux moins débutant avec le temps !)

si non : pourrais tu m’en dire plus ?

Merci encore,
Daan

Modifié par Daan_Noa, 23 juin 2013 - 20:31.


#6 Aurix

Aurix

    La Bidouille ou un truc comme ça


Posté 23 juin 2013 - 22:18

Je parle des fonctions AddForm et RemoveAddedForm , je ne sais pas ce qu'il y a sur le lien que tu donnes, je n'y ai pas accès...

j'ai pour ma part déjà eu recours à ces fonctions mais j'ai du faire une mauvaise manip, les objets ajoutés finissaient par disparaitre sans que je ne l'aie demandé... cela dit, si c'est bien utilisé, il ne devrait pas y avoir d'ennui...
"You are the best Septim that's ever ruled. Well, except for that Martin fellow, but he turned into a dragon god, and that's hardly sporting... You know, I was there for that whole sordid affair. Marvelous time! Butterflies, blood, a Fox, a severed head... Oh, and the cheese! To die for."

Shéogorath - Prince de la folie

Vrai Grand Moddeur et FPIA à ses heures...

#7 Daan_Noa

Daan_Noa

Posté 24 juin 2013 - 21:43

Bonjour,

Alors voila ou j’en suis :

J’ai d’abord voulus faire simple, j’ai donc rédigé :
DMN_LeveledItem_AntiRespawnsLivre23.AddForm(DMN_BOOK_23, 1, 1)
Dans le fragment de ma quête pour placer le livre ( book_23) dans une leveled list qui a été préalablement placer dans le coffre de mon marchant .
Malheureusement cela ne fonctionne pas . Aucun exemplaire du livre n’est placé dans le coffre et donc il n’est pas vendu par mon PNJ.

Ayant déjà utilisé une méthode similaire utilisant des formalistes je me suis donc lancer dans cette variante que j’utilise déjà :
j’ai donc créer une forme liste avec mon livre a l’intérieur puis j’ai rédigé :
DMN_LeveledItem_AntiRespawnsLivre23.AddForm(DMN_FormListeAntiRespawnsLivre23.GetAt(0), 1, 1)
Dans mon fragment.

Malheureusement, et a ma grande surprise cela ne fonctionne pas non plus.
Je suis d’autant plus surpris que je me souviens très bien avoir fais de long teste sur cette chose la et être arrivé a la conclusion que cela fonctionnait bien .
Bref je referais quelques teste sur la partie qui devrait fonctionner (du coup j’ai un doute …)

Une autre bidouille qui me viens juste serait un simple « AddItem » qui placerait mon livre dans le coffre. Pour palier a ce maudit respawns je pourrais créer un alias qui pointe sur le player et qui disposerais d’un script qui aux event « OnInit() » et « OnPlayerLoadGame() » ajouterait a nouveau le livre au coffre.
Si je ne dis pas de bêtise c’est a l’occasion de ces deux events que le coffre est réinitialiser par le « Respawns » .

Qu’en penses-tu ?


D’avance merci pour ton aide,
Daan.


PS : oui , je sais , moi non plus je ne suis pas triste quand il s'agit de bricoler..... ;)

#8 Aurix

Aurix

    La Bidouille ou un truc comme ça


Posté 25 juin 2013 - 20:48

bah, si tu veux faire un truc un peu crade, tu peux faire un test dans la ligne de dialogue qui ouvre le menu de transaction... si l'objet n'y est pas, tu le mets... ça fait un peu morrowind-style comme truc mais ça marche...
"You are the best Septim that's ever ruled. Well, except for that Martin fellow, but he turned into a dragon god, and that's hardly sporting... You know, I was there for that whole sordid affair. Marvelous time! Butterflies, blood, a Fox, a severed head... Oh, and the cheese! To die for."

Shéogorath - Prince de la folie

Vrai Grand Moddeur et FPIA à ses heures...

#9 Daan_Noa

Daan_Noa

Posté 25 juin 2013 - 22:05

Bonjour et merci pour ta réponse .

Pourrai tu me m'expliquer comment m'y prendre pour mettre en place ce test ? Je ne vois pas très bien ou et comment le mettre en place .

D'avance merci pour ton aide .
Daan.

#10 Aurix

Aurix

    La Bidouille ou un truc comme ça


Posté 26 juin 2013 - 00:04

tout dépend de la manière dont tu vas ouvrir la fenêtre de commerce avec ton pnj mais si tu utilises un dialogue custom, tu as un champ "result" dans l'utilitaire de création de dialogue...

dans ce champ, il suffit de mettre :

if ( vendorContainer.getItemCount(baseItem) < 1 )
  vendorContainer.additem(baseitem,1)
endif
showbartermenu

Bien entendu, il va falloir renseigner vendorContainer comme le coffre de marchand  et baseitem comme l'objet qui n'est pas de quête... dernier onglet sur la droite.
"You are the best Septim that's ever ruled. Well, except for that Martin fellow, but he turned into a dragon god, and that's hardly sporting... You know, I was there for that whole sordid affair. Marvelous time! Butterflies, blood, a Fox, a severed head... Oh, and the cheese! To die for."

Shéogorath - Prince de la folie

Vrai Grand Moddeur et FPIA à ses heures...

#11 Daan_Noa

Daan_Noa

Posté 02 juillet 2013 - 23:54

Bonjour,

D’abord je te remercie pour cette dernière technique, bien que finalement je ne l’utilise pas elle pourra m’être utile plus tard.

Finalement le :
DMN_LeveledItem_AntiRespawnsLivre23.AddForm(DMN_BOOK_23,1,1)	
Fonctionne , en fait il fonctionne surement depuis le début c’est juste que lors de mes derniers testes je n’ai pas attendu assez longtemps pour que le coffre soit « respawner ».

J’ai résolut le problème en ajoutant :
Alias_DMN_Alias_coffre_Anack.GetRef().AddItem(DMN_BOOK_23)
Avec cette ligne une instance du livre est placé de suite dans le coffre  et avec la première ligne (« AddForm ») le livre est ajouté a la leveled list se trouvant dans le coffre. De cette façon je place une première instance du livre dans le coffre , cette instance sera supprimer par le « respawns » Mais une nouvelle instance de ce même livre sera créée par la leveled liste.

J’ai également ajouter le script suivant sur un alias pointant vers le player :
Scriptname DMN_Script_AntiRespawnsLivre23 extends ReferenceAlias 


Quest Property DMN_Quest Auto
LeveledItem Property DMN_LeveledItem_AntiRespawnsLivre23 Auto
Book property DMN_BOOK_23 auto

Event OnInit()
	   If ( DMN_Quest.GetStage() == 10)
			 ;Debug.messageBox("OnInit ok pour livre")
			 DMN_LeveledItem_AntiRespawnsLivre23.AddForm(DMN_BOOK_23,1,1)			; On ajoute le livre	qui apparaît au niveau 1
	   EndIf
EndEvent



Event OnPlayerLoadGame()
	   If (  DMN_Quest.GetStage() == 10)
			 ;Debug.messageBox("OnPlayerLoadGame ok pour livre")
			 DMN_LeveledItem_AntiRespawnsLivre23.AddForm(DMN_BOOK_23,1,1)			; On ajoute le livre	qui apparaît au niveau 1
	   EndIf
EndEvent

De cette façon le livre est également remit dans la leveled list après chaque chargement de partie et également pour toute nouvelle partie.

J’espère que ce maigre retour d’infos pourra servir, je suis bien sur toujours près a optimiser si vous avez une idée.

Merci ,
Daan.




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

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