Ajout d’objets au marchand après stage X de ma quête

Le langage des scripts.
Répondre
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Ajout d’objets au marchand après stage X de ma quête

Message par daan »

Bonjour,

Après près de 2 semaines de folie j'ai à nouveau un peu de temps à moi ou plutôt pour mon mod. ^^
Je reviens donc vers vous avec de nouvelles questions.

D’abord, mon objectif :
J’aimerais qu'à un stage donné de ma quête mon PNJ marchand puisse vendre, via une leveled list, de nouveaux objets.

Ce que je pensais faire:
Je pensais ajouter une leveled list vide au coffre de mon marchant puis au stage souhaité, remplir cette leveled list en utilisant le script de Sagittarius22 décrit dans ce poste : http://www.confrerie-des-traducteurs.fr ... 25&t=13784
(donc via une « Form list » ou, si je comprend comment ça marche , via « Array »)

Mes questions :
1) Est-ce une bonne méthode ? ou y a-t-il plus simple ?
2) Le coffre de mon marchand étant en « respawn » y a-t-il un risque que les objets de la leveled list ne soient plus pris en compte après un respawn ?

D'avance merci pour votre aide.
Daan.

PS : Merci à Sagittarius22 pour son script.
Modifié en dernier par daan le 20 juin 2015, 18:47, modifié 4 fois.
Raison : Édition incolore
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: Ajout d’objets au marchant après stage X de ma quête.

Message par Gerauld »

Si tu ajoutes une condition sur le stage de la quête concernée dans le script d'ajout aux leveled lists, les objets concernés ne seront ajoutés que si ce stage est atteint. C'est la méthode la plus simple en partant du script de Sagi et sans doute la meilleure.

Sinon, autre solution moins élégante, il y a la possibilité d'attacher un script à une quête relancée toutes les 24 ou 48heures ajoutant les objets voulus dans le coffre du marchand via la fenêtre inventory d'un alias correspondant au coffre du vendeur. Cette quête et son rafraichissement seraient lancés par un fragment de script du stage de quête.

Tu peux encore, placer ces objets en utilisant des alias (create XXX in XXX) qui mettront des objets dans le coffre. Cette troisième méthode n'est utile que pour créer des objets de quêtes cependant.

Dans Hearthfires, Bethesda utilise une quête pour ajouter des objets aux marchands (pot de lait et autres trucs du DLC). Je n'ai pas regardé si cette quête était rafraichie ou relancée à chaque chargement de sauvegarde (ou/et nouvelle partie).

Le mieux serait de juste conditionner l'ajout d'objets par le stage de quête (donc il faudra mettre la quête en propriété du script et la remplir pour que cela fonctionne) dans le script de notre centaure préféré.
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Ajout d’objets au marchant après stage X de ma quête.

Message par daan »

Bonjour et merci pour ta réponse.

La méthode étant défini je vais pouvoir m’y mettre (un peut plus tard ou demain soir) .

Deux petites questions me taraudent encore :
1) l’ajout d’une leveled list vide ne va pas poser de problème ?( de manière générale le jeu n’aime pas le vide, je pense aux Alias par exemple .)
2) comment va être gérer cette leveled list par le jeu ? le remplissage de cette list n’étant effectuer qu’une seul fois ( a un stage X de ma quête) que va-t-il se passer si je quitte le jeu ? cette list est elle stocker « définitivement » dans la save ?

D’avance merci pour ton aide inépuisable,
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: Ajout d’objets au marchant après stage X de ma quête.

Message par Gerauld »

Euh... Pourquoi ajouter une leveled liste vide? Je ne vois pas quelle méthode tu as en tête mais il me semble que tu prends une mauvaise voie.

Du moment que tu ajoutes une leveled list dans un conteneur (de marchand de surcroît) le mod devient incompatible avec tous les autres mods touchant au conteneur. D'où le script de Sagi d'ajouter des objets aux leveled lists existantes via un script. Comme ça, ni les conteneurs, ni les leveled lists existantes sont touchés. Donc aucun soucis de compatibilité.

Les leveled lists sont ré-initialisées à chaque chargement du jeu normalement donc les modifications annulées à chaque fois que tu charges la partie.
C'est pour cela que le script de Sagi utilise un event qui permet de le déclencher à chaque fois qu'une partie est chargée. L'event oninit() permet quant à lui de lancer le script lors d'une nouvelle partie.

Passer par les scripts de Sagi est la méthode la plus élégante, causant le moins de soucis de compatibilité s'il y a pas mal d'objets et de listes touchées. Tu prends donc le script de Sagi, tu suis les instructions et ensuite tu as juste une condition à ajouter pour l'ajout des objets concernés (test du stage de quête).
Hors-sujet
Sagi étant un des meilleurs (si ce n'est le meilleur) scripteurs francophones, tu peux utiliser son script sans te faire de soucis niveau comportement en jeu ou compatibilité. J'utilise également une version (à peine modifiée) de ce script dans certains de mes mods.
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Ajout d’objets au marchant après stage X de ma quête.

Message par daan »

Bonjour a vous.

Finalement les semaines chargées se sont prolongées et du coup je n’ais pas eu plus de temps mais cette fois c’est la bonne.
Je m’excuse donc de ne pas avoir donné suite plus rapidement (RL oblige… ). :embaras:
Je reprends donc où nous nous en étions arrêté, et je te dois donc (Gerauld ) quelques réponses/explications.
Passer par les scripts de Sagi est la méthode la plus élégante, causant le moins de soucis de compatibilité s'il y a pas mal d'objets et de listes touchées. Tu prends donc le script de Sagi, tu suis les instructions et ensuite tu as juste une condition à ajouter pour l'ajout des objets concernés (test du stage de quête).
L’utilisation de ce script me semble évident, pas de doute de ce coté la, pas de problème non plus sur le conditionnement.
Les leveled lists sont ré-initialisées à chaque chargement du jeu normalement donc les modifications annulées à chaque fois que tu charges la partie.
C'est pour cela que le script de Sagi utilise un event qui permet de le déclencher à chaque fois qu'une partie est chargée. L'event oninit() permet quant à lui de lancer le script lors d'une nouvelle partie.
Pour ce qui est de la compréhension du script, ça m’a pris un peut de temps mais je pense avoir assez bien compris, merci quand même pour cette petite piqure de rappel.
Du moment que tu ajoutes une leveled list dans un conteneur (de marchand de surcroît) le mod devient incompatible avec tous les autres mods touchant au conteneur. D'où le script de Sagi d'ajouter des objets aux leveled lists existantes via un script. Comme ça, ni les conteneurs, ni les leveled lists existantes sont touchés. Donc aucuns soucis de compatibilité.
Puisque le marchant est spécialement mis en place par et pour mon mod l’intégration « direct » des items serait donc possible dans mon cas, je perdrais toutefois la possibilité de voir « évoluer » ces items avec le niveau de mon player.
Cela étant dit, le pourquoi de ce script et les problèmes de compatibilités si on intégrait directement les items au coffre me sont également clairs. (merci pour les explications que tu a fourni dans différent autres postes.)
Euh... Pourquoi ajouter une leveled liste vide?
Parce que dans mon mod j’aimerais laisser place à plusieurs scénarios en fonction des choix fais par le joueur.
Dans le scenario « classique » le joueur aurait accès a un marchant tous ce qui a de plus banal.
Ce dernier aurait un coffre remplit de plusieurs leveled lists ( 2 leveled lists pour des bottes , 3 pour des armures , 1 pour les casques…)
Mais, dans un scénario plus « special » après avoir aidé ce même marchant, j’aimerais que le joueur se vois proposer quelques items supplémentaires.
J’aimerais, par exemple, qu’il lui soit proposé (par le biai de leveled lists ) des armes enchantées ou encore des armures enchantées.
Je pensais donc mettre en place une (ou plusieurs) leveled list vide qui ne serais remplit qu’au stage appeler après avoir aidé le marchant.
Mon idée était que de cette façon le marchant ne vendrait ces items « spéciaux » que si le player lui était venu en aide.

Voila, j’espère avoir été un peut plus claire et avoir "justifié" l’utilisation de cette leveled list vide.

comme d’habitude je te remercie pour ton aide,
Daan


PS :
...Je ne vois pas quelle méthode tu as en tête mais il me semble que tu prends une mauvaise voie.
Ce n’est en effet toujours pas exclu ! :D ;) lol
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
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Ajout d’objets au marchant après stage X de ma quête.

Message par daan »

Bonjour,

Après quelques heures de test je reviens vers vous avec un petit constat.
Si la création d’une leveled list vide ne semble pas poser de problèmes je bute sur son remplissage.
J’ai créé plusieurs form list , une pour chaque niveau dans la leveled list.
J’ai modifié la script de Sagittarius22 comme suit :

Code : Tout sélectionner

LeveledItem Property DMN_LeveledItem_Anack_Special01 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N1 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N10 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N22 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N34 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N46 Auto
Int Index = 0

Event OnInit()

Debug.messageBox("ok")

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N1.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 1, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N10.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 10, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N22.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 22, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N34.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 34, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N46.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 46, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

EndEvent





Event OnPlayerLoadGame()

Debug.messageBox("ok2")

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N1.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 1, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N10.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 10, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N22.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 22, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N34.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 34, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N46.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 46, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

EndEvent
Mon problème est que seules mes armes contenue dans la première forme list semblent être « copiées » dans la leveled list. J’ai relancé plusieurs sauvegardes différentes et je retrouve toujours les deux même dagues dans l’inventaire de mon marchant. Toujours celle de la première forme list.( DMN_Anack_FormListArmes_Dague_N1)

Une idée d’où proviens le problème ?
Ai-je fais une erreur dans le script ?
Y a-t-il un code console pour vérifier ce qui se trouve dans une leveled list in Game ?

D’avance merci pour votre aide.
Daan.


EDIT:
J'ai trouvé , cela vient d'une erreur stupide dans le script.
Script modifié:

Code : Tout sélectionner

LeveledItem Property DMN_LeveledItem_Anack_Special01 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N1 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N10 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N22 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N34 Auto
FormList Property DMN_Anack_FormListArmes_Dague_N46 Auto
Int Index = 0

Event OnInit()

Debug.messageBox("ok")

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N1.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 1, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N10.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N10.GetAt(Index), 10, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N22.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N22.GetAt(Index), 22, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N34.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N34.GetAt(Index), 34, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N46.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N46.GetAt(Index), 46, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

EndEvent





Event OnPlayerLoadGame()

Debug.messageBox("ok2")

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N1.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N1.GetAt(Index), 1, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N10.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N10.GetAt(Index), 10, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N22.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N22.GetAt(Index), 22, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N34.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N34.GetAt(Index), 34, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

Index = 0
While Index < DMN_Anack_FormListArmes_Dague_N46.GetSize() ; si nous n'avons pas ajouté tous les objets, alors...
    DMN_LeveledItem_Anack_Special01.AddForm(DMN_Anack_FormListArmes_Dague_N46.GetAt(Index), 46, 1) ; ... On ajoute entre une arme de chaque    qui apparaîtront au niveau 1
    Index += 1 ; puis on passe à l'objet suivant dans la FormList.
EndWhile

EndEvent
desolé .
Merci , 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: Ajout d’objets au marchand après stage X de ma quête

Message par Gerauld »

Cela vient sûrement du type de marchand. Un marchand ne peut vendre que certains types d'objets (regarde les mots-clés des objets vendus par ton marchand et regarde les autres objets...).
daan
Moddeur aspirant
Moddeur aspirant
Messages : 171

Re: Ajout d’objets au marchand après stage X de ma quête

Message par daan »

Houps , j’ai dus éditer au moment ou tu me répondais , désolé.

(Pour ce qui est du type de marchant j’avais résolus ca en créant une nouvelle « VendorItemsListe » pour mon marchant.)

Quoi qu’il en soit, merci a toi pour ta réponse.
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 les scripts »