Bonjour à tous,
Je suis en train de travaillé sur un mod qui rajoute au joueur un Sac à dos considéré comme un objet de quête.
Plus précisément ce que j'ai fait :
Quest
-> Reference Alias
-> Create Reference to Object [SacAdos] Create in [PlayerAlias]
coché : Quest Object
Jusque là aucun problème, la quête démarre et le Sac à Dos est bien ajouté à l'inventaire du joueur.
J'ai coché "Quest Object" car je voulais que le Sac à Dos soit ignoré par les requêtes RemoveAllItems() que j'utilise sur le joueur dans un script. Cependant je voulais que le joueur puisse lâcher le Sac à Dos s'il le désire, j'ai donc utilisé un script avec une messagebox proposant au joueur de lâcher le Sac à Dos. Si celui-ci confirme, le Sac à Dos est retiré avec la commande DropObject() qui ignore donc le statut d'objet de quête.
A partir de là j'ai 2 problèmes :
_ Lorsque le joueur récupère le Sac à Dos, le script attaché à celui-ci (directement sur le Base Object) ne fonctionne plus !
_ J'ai voulu créer un pointeur vers le Sac à Dos lorsque celui-ci est lâcher avec les Quest Objectives et comme Target l'alias du Sac à dos. Cependant lorsque le sac est lâché, rien ne se passe.
Merci d'avance
0
Pointeur Vers Objet De Quête Laché Par Une Commande Remove
Débuté par
Cahouete
, 05 juin 2013 - 16:14
4 réponses à ce sujet
#1
Posté 05 juin 2013 - 16:14
#2
Posté 05 juin 2013 - 20:30
Bonjour,
il faut donc que tu rajoute « SetObjectiveDisplayed(XX) » dans un stage de ta quête qui sera appeler quand le player dépose le sac.
A ta place je créerais une nouvelle quête et c’est dans cette quête que je créerais ce fameux « Quest Objectives » (admettons que ce « Quest Objectives » ait l’index 10). Dans cette quête je ne créerais que deux stages:
Stage 0 : le player a le sac sur lui , dans le fragment je redigerais :
Stage 10 : le Player n’a plus le sac sur lui , dans le fragment je rédigerais
Maintenant dans le script du sac tu passe le stage de cette nouvelle quête a 10 quand le player dépose le sac et tu la repasse à 0 quand le player reprend le sac. (pour ce faire tu utilise : « LaNouvelleQuete.SetStage(10) » )
J’espère que cela t’aidera,
Daan.
_ Lorsque le joueur récupère le Sac à Dos, le script attaché à celui-ci (directement sur le Base Object) ne fonctionne plus !Le plus simple serait que tu nous poste ton script pour éliminer une éventuel erreur dans ce script.
_ J'ai voulu créer un pointeur vers le Sac à Dos lorsque celui-ci est lâcher avec les Quest Objectives et comme Target l'alias du Sac à dos. Cependant lorsque le sac est lâché, rien ne se passe.les Quest Objectives sont « appelés » par : SetObjectiveDisplayed(20) , 20 étant l’index du Quest Objectives voulut.
il faut donc que tu rajoute « SetObjectiveDisplayed(XX) » dans un stage de ta quête qui sera appeler quand le player dépose le sac.
A ta place je créerais une nouvelle quête et c’est dans cette quête que je créerais ce fameux « Quest Objectives » (admettons que ce « Quest Objectives » ait l’index 10). Dans cette quête je ne créerais que deux stages:
Stage 0 : le player a le sac sur lui , dans le fragment je redigerais :
SetObjectiveCompleted(10)
Stage 10 : le Player n’a plus le sac sur lui , dans le fragment je rédigerais
SetObjectiveDisplayed(10)
Maintenant dans le script du sac tu passe le stage de cette nouvelle quête a 10 quand le player dépose le sac et tu la repasse à 0 quand le player reprend le sac. (pour ce faire tu utilise : « LaNouvelleQuete.SetStage(10) » )
J’espère que cela t’aidera,
Daan.
#3
Posté 05 juin 2013 - 22:50
Bonjour Daan,
Voici le script que j'utilise, il est directement attaché à l'objet SacADos dans la catégorie Item->Armo (j'ai essayé de l'attacher à l'alias dans la quête mais plus rien ne fonctionnait)
La partie "Event OnUnequipped(Actor akActor)" fonctionne ! C'est uniquement lorsque le joueur choisit de drop le Sac (via le script ci dessous) et qu'il le récupère. Il semble que le Sac à Dos récupéré n'utilise tout simplement plus le script.
Je vais essayer ta solution qui consiste à créer une nouvel quête pour le pointeur mais j'aimerais rester aussi "light" que possible. Le problème c'est que j'ai bien souvent du mal à savoir quelle option est la moins lourde à faire tourner.
Merci en tout cas pour tes conseils
Voici le script que j'utilise, il est directement attaché à l'objet SacADos dans la catégorie Item->Armo (j'ai essayé de l'attacher à l'alias dans la quête mais plus rien ne fonctionnait)
La partie "Event OnUnequipped(Actor akActor)" fonctionne ! C'est uniquement lorsque le joueur choisit de drop le Sac (via le script ci dessous) et qu'il le récupère. Il semble que le Sac à Dos récupéré n'utilise tout simplement plus le script.
Scriptname TomOpenBagScript extends ObjectReference Quest Property TomSacADosQuest Auto Actor Property PlayerRef Auto ObjectReference Property TomSacContRef Auto Armor Property TomSacaDos Auto Message Property TomDropBagMess auto Message Property TomOpenBagMess auto Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) If akNewContainer == None debug.notification("Sac lâché") TomSacADosQuest.SetObjectiveDisplayed(10) ElseIf akNewContainer == PlayerRef debug.notification("Sac récupéré") TomSacADosQuest.SetObjectiveCompleted(10) PlayerRef.EquipItem(TomSacaDos,abSilent = true) EndIf EndEvent Event OnUnequipped(Actor akActor) If PlayerRef.IsInCombat() debug.notification("Impossible d'ouvrir le Sac pendant le combat !") int choice1 = TomDropBagMess.show() If choice1 == 0 PlayerRef.DropObject(TomSacaDos) EndIf Else int choice = TomOpenBagMess.show() If choice == 0 Game.DisablePlayerControls() Game.EnablePlayerControls() TomSacContRef.activate(PlayerRef) PlayerRef.EquipItem(TomSacaDos,abSilent = true) ElseIf choice == 2 PlayerRef.DropObject(TomSacaDos) EndIf EndIf EndEvent
Je vais essayer ta solution qui consiste à créer une nouvel quête pour le pointeur mais j'aimerais rester aussi "light" que possible. Le problème c'est que j'ai bien souvent du mal à savoir quelle option est la moins lourde à faire tourner.
Merci en tout cas pour tes conseils
#4
Posté 07 juin 2013 - 22:16
Bonjour,
A tu déjà testé ? Cela fonctionne ?
J’ai regarder ton script, je dois admettre ne pas très bien comprendre ce que tu fais dans l’event « OnUnequipped »
Pourrais tu me dire ce que tu veux faire ? (selon moi cette étape est inutile pour ce que tu cherche a faire.)
Pour ce qui est de l’event « OnContainerChanged », je pense que tu pourrais simplifier ton script comme suit:
Il te suffit de mettre, dans le end fragment du stage 0 de la nouvelle quete :
et enfin, mettre dans le end fragment du stage 10 de la nouvelle quete :
Avec cela ça devrait fonctionner.
Daan.
Citation
Je vais essayer ta solution qui consiste à créer une nouvelle quête pour le pointeur
J’ai regarder ton script, je dois admettre ne pas très bien comprendre ce que tu fais dans l’event « OnUnequipped »
Pourrais tu me dire ce que tu veux faire ? (selon moi cette étape est inutile pour ce que tu cherche a faire.)
Pour ce qui est de l’event « OnContainerChanged », je pense que tu pourrais simplifier ton script comme suit:
Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) If akNewContainer == None LaNouvelleQuete.SetStage(10) ElseIf akNewContainer == PlayerRef LaNouvelleQuete.SetStage(0) EndIf EndEvent
Il te suffit de mettre, dans le end fragment du stage 0 de la nouvelle quete :
debug.notification("Sac récupéré") SetObjectiveCompleted(10) PlayerRef.EquipItem(TomSacaDos,abSilent = true)
et enfin, mettre dans le end fragment du stage 10 de la nouvelle quete :
debug.notification("Sac lâché") SetObjectiveDisplayed(10)
Avec cela ça devrait fonctionner.
Daan.
#5
Posté 09 juin 2013 - 15:03
Salut !
J'ai finalement réussi à attacher mon script directement sur l'alias du Sac à Dos plutôt que sur l'objet de base. Je ne sais pas trop ce que j'avais oublié la première fois, en tout cas maintenant ça marche ! Le Sac à dos peut maintenant être lâché, cela enclenche immédiatement l'objectif "Retrouver mon Sac à Dos". Pour le pointeur, j'ai honte de dire ça mais en fait ça marchait déjà très bien ; j'avais juste oublié d'activer la quête dans mon journal ! Merci
Pour les curieux je vous pose mon script :
Merci pour les conseils Dann !
J'ai finalement réussi à attacher mon script directement sur l'alias du Sac à Dos plutôt que sur l'objet de base. Je ne sais pas trop ce que j'avais oublié la première fois, en tout cas maintenant ça marche ! Le Sac à dos peut maintenant être lâché, cela enclenche immédiatement l'objectif "Retrouver mon Sac à Dos". Pour le pointeur, j'ai honte de dire ça mais en fait ça marchait déjà très bien ; j'avais juste oublié d'activer la quête dans mon journal ! Merci
Pour les curieux je vous pose mon script :
Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) If akNewContainer == None debug.notification("Sac lâché") TomSacADosQuest.SetObjectiveDisplayed(10,true,true) TomSacADosQuest.SetActive() TomPlayer.gotbag = 0 ElseIf akNewContainer == PlayerRef debug.notification("Sac récupéré") TomSacADosQuest.SetObjectiveCompleted(10,true) PlayerRef.EquipItem(TomSacaDos,abSilent = true) TomPlayer.gotbag = 1 Else akNewContainer.RemoveItem(TomSacaDos,1,true,akOldContainer) EndIf EndEvent Event OnUnequipped(Actor akActor) If PlayerRef.IsInCombat() debug.notification("Impossible d'ouvrir le Sac pendant le combat !") int choice1 = TomDropBagMess.show() If choice1 == 0 PlayerRef.DropObject(TomSacaDos) Else PlayerRef.EquipItem(TomSacaDos,abSilent = true) EndIf Else int choice = TomOpenBagMess.show() If choice == 0 Game.DisablePlayerControls(false, false, false, false, false, true, false) Game.EnablePlayerControls() TomSacContRef.activate(PlayerRef) PlayerRef.EquipItem(TomSacaDos,abSilent = true) ElseIf choice == 2 PlayerRef.DropObject(TomSacaDos) Else PlayerRef.EquipItem(TomSacaDos,abSilent = true) EndIf EndIf EndEvent
Merci pour les conseils Dann !
0 utilisateur(s) li(sen)t ce sujet
0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)