Aller au contenu


Pointeur Vers Objet De Quête Laché Par Une Commande Remove


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

#1 Cahouete

Cahouete

Posté 05 juin 2013 - 16:14

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

#2 Daan_Noa

Daan_Noa

Posté 05 juin 2013 - 20:30

Bonjour,

_ 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 Cahouete

Cahouete

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.


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 Daan_Noa

Daan_Noa

Posté 07 juin 2013 - 22:16

Bonjour,

Citation

Je vais essayer ta solution qui consiste à créer une nouvelle quête pour le pointeur
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:

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 Cahouete

Cahouete

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  :

	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)