Aller au contenu


[résolu]ouverture Et Fermeture De Herse


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

#1 Dallara

Dallara

    Fortificateur fortiche


Posté 25 juillet 2009 - 16:22

Bonjours,

Je cherche a faire un script qui agirait que quand le PJ est a une certain distance de l'activateur.
Il s'agit d'une herse qui s'ouvrirait dès que le PJ est "assez proche" et se referme dès que le joueur quitte le périmètre mais ne s'ouvre pas si le PJ a une prime sur lui aussi minable soit elle.

Est-ce que c'est possible ?
Et si oui comment ?

Modifié par Dallara, 27 août 2009 - 22:14.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#2 lnari

lnari

    Chocapic Cortexicus


Posté 25 juillet 2009 - 16:46

A priori, c'est assez simple.

Begin ScriptHerse

Short Open

If ( PCHasCrimeGold == 0 )	; Pas de prime
If ( GetDistance Player < 1024 ); Joueur à moins de 1024 de distance
		If ( Open == 0 )			; Herse fermée
		Moveworld z 200		; Montée de la herse
		Set Open to 1			; Variable qui indique que la herse est levée
		Endif
Return							; Return pour maintenir levée si on reste sous ces conditions
Endif
Endif

If ( Open == 1 )					; Herse ouverte
Moveworld z -200				; Descente de la herse
Set Open to 0					; Variable qui indique que la herse est baissée
Endif

End

Premier bloc : Si le joueur n'a pas de prime et est à moins de 1024 unités de distance (à régler comme tu l'sens), et que la herse est fermée, on ouvre (pour ça je la monte de 200 sur Z au pif, mais la valeur devra être reglée en fonction de ta herse, je ne peux pas deviner quelle taille elle fait). On maintient ouvert avec le Return tant que le joueur remplit les conditions : Pas de prime et proximité.

Deuxième bloc : Dans tous les autres cas, si la herse est déjà ouverte, on la ferme (en la baissant de la valeur opposée sur l'axe Z, à régler comme la précédente).

A mon avis, ça devrait marcher, plus qu'à tester.

Modifié par Souris Cornue, 25 juillet 2009 - 16:47.


#3 elendell

elendell

    Mécano Dell'Arte


Posté 25 juillet 2009 - 20:13

Bonjour,

Ce script me semble très bien et correspond à ce qu'à demandé Dallara mais il y a juste un détail qu'on peut vouloir affiner :

Tel qu'il est écrit, "MoveWorld" va faire lever ou baisser la herse d'un coup, en une seule frame et à la vitesse choisie (200 unités par seconde dans l'exemple). La valeur donnée à "MoveWorld" n'est pas une distance mais une vitesse. Elle ne conditionne la distance que par voie de conséquence puisque pendant le temps que dure une frame, l'objet se déplace à la vitesse donnée.

Si on voulait voir le mouvement de la herse, il faudrait que la distance de déplacement soit divisée par x secondes, avec un "timer" qui contrôle le tout.

Par exemple, pour la faire déplacer de 210 unités sur une durée totale de 3 secondes, on lui donne une vitesse de 70 et on ne met la variable "Open" à 1 que lorsque les 3 secondes sont écoulées.


set timer to ( timer + GetSecondsPassed )

if ( timer < 3 )
	MoveWorld z 70
	return
endif
set timer to 0
set Open to 1

Enfin, c'est juste pour donner l'effet visuel du déplacement de la herse.  :mosc:

PS : Il faut éventuellement aménager le script pour le cas où le PJ s'éloignerait de plus des 1024 unités en condition, avant que le déplacement ne soit terminé.

#4 lnari

lnari

    Chocapic Cortexicus


Posté 25 juillet 2009 - 21:25

Y'a un truc qui me semble obscur, si on a 2 frames par seconde, là, ton script ne va t-il pas la monter du double escompté ?

Parce qu'on monte de 70 par frame mais si y'en a 2 par seconde, sur 3s ça fait 420 au final... Et là ça devient assez incertain. Faudrait une variable "Etape" pour vérifier qu'on est à la bonne hauteur et tout...

#5 Kafou

Kafou

    Le canari a bouffé le rominet !


Posté 25 juillet 2009 - 22:02

Non, comme l'a dit elendell le 70 dans son script c'est une vitesse et non une distance.

Avec son script, la herse va monter à la vitesse de 70 unités par seconde pendant 3 secondes, soit de 210 unités en tout, quel que soit le framerate.

Par contre, il est très probable que, à la frame lors de laquelle le déplacement s'arrête ( donc timer >= 3 ), on ait monté très légèrement plus que 210 unités puisque très légèrement plus de 3 secondes se sont écoulées (sans parler des potentielles erreurs d'approximation de position à la frame près, dans le cas où on a beaucoup de FPS). A force de déplacements, ces décalages se cumulent et on risque d'avoir une herse qui se retrouve à moitié ouverte par exemple. C'est pour ça qu'en général, à la fin d'un déplacement Move/Rotate, il est plus que conseillé d'ajuster la position définitive de l'objet avec un SetPos (quitte à le positionner là où il est déjà).
You look like you need a monkey!

Attention : perfectionniste paresseux.

#6 lnari

lnari

    Chocapic Cortexicus


Posté 25 juillet 2009 - 22:06

D'accord, c'est une vitesse par seconde, je ne savais pas, je pensais que c'était une vitesse par frame en fait.

Sinon oui, le SetPos est une bonne solution, y'a aussi moyen de simplement faire SetAtStart pour le cas présent quand on revient à la position fermée, comme ça on peut garder le même script où qu'on place la herse, et même avoir ce script commun pour plusieurs (et au passage comme ça on reste requis Morrowind seulement si besoin).

#7 elendell

elendell

    Mécano Dell'Arte


Posté 25 juillet 2009 - 22:20

Voir le messageKafou, le 25.07.2009 à 23:01, dit :

Par contre, il est très probable que, à la frame lors de laquelle le déplacement s'arrête ( donc timer >= 3 ), on ait monté très légèrement plus que 210 unités puisque très légèrement plus de 3 secondes se sont écoulées (sans parler des potentielles erreurs d'approximation de position à la frame près)....
Ha ! Voila à quoi j'ai pensé pendant mon repas.  :(  Je venais justement faire un édit pour ajouter de mettre un "SetAtStart" à chaque fois que la herse est sensée revenir à sa position initiale. (Après le "timer" si on l'utilise ou directement à la place du "MoveWorld" si on ne veut pas voir le mouvement de la herse).

Le "SetAtStart" (ou "SetPos") est d'ailleurs nécessaire même si on n'utilise pas de "timer" parce que une frame suffit pour tout décaler. Pour s'en convaincre, c'est très facile. Il suffit d'aller dans le jeu, de faire avec la console un "getpos z" sur un objet, puis "MoveWorld z 200", puis "MoveWorld z -200" et un nouveau "GetPos z". Si le "framerate" est très stable, on peut ne pas le voir en une seule fois car la console ne renvoie que 2 décimales mais si on fait bouger le "framerate" en cours de route (en se tournant, avec fps opt. ou autre), on s'aperçoit que même avec cette petite distance et un déplacement en deux frames (aller et retour instantanés), la position initiale n'est plus la même.  :mosc:

EDIT : Je me traîne aujourd'hui. Souris a posté pendant que j'écrivais.  :shock:

#8 Dallara

Dallara

    Fortificateur fortiche


Posté 26 juillet 2009 - 12:46

Merci à tous je vais vite essayer sa.
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#9 Dallara

Dallara

    Fortificateur fortiche


Posté 29 juillet 2009 - 22:41

Bonsoir,

Je suis aller voir tous sa et sa marche pas. Je pense que mon scripte est un peu du n importe quoi mais je ne sais pas ou.

begin CDH_Herse_01

Short Open
Short timer

if (MenuMode == 1)
	return
endif

If ( PCHasCrimeGold == 0 )   ; Pas de prime
	If ( GetDistance Player < 200 ); Joueur à moins de 200 de distance
		 If ( Open == 0 )		   ; Herse fermée
		  if ( timer < 3 )
		   Moveworld z, 75	   ; Montée de la herse
		   Set Open to 1		   ; Variable qui indique que la herse est levée

		  Endif

		endif

set timer to 0
set Open to 1


Return						   ; Return pour maintenir levée si on reste sous ces conditions
Endif
Endif

set timer to ( timer + GetSecondsPassed )

If ( Open == 1 )				   ; Herse ouverte
if ( timer < 3 )
Moveworld z, -75			   ; Descente de la herse
Set Open to 0				   ; Variable qui indique que la herse est baissée
Endif
endif


end CDH_Herse_01

Ou est le problème ?

Merci.
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#10 elendell

elendell

    Mécano Dell'Arte


Posté 30 juillet 2009 - 02:59

Bonjour Dallara,

Voir le messageDallara, le 29.07.2009 à 23:40, dit :

Je suis aller voir tous sa et sa marche pas. Je pense que mon scripte est un peu du n importe quoi mais je ne sais pas ou est le problème

Il y a plusieurs problèmes :

- "Short timer" : Une variable  "timer" doit être déclarée en "float" car "GetSecondsPassed" renvoie des valeurs avec décimales.
- "PCHasCrimeGold" : Ça m'avait échappé la dernière fois. Cette variable globale indique si le PJ a assez d’argent sur lui pour payer l’amende compensatoire mais pour savoir s'il est un criminel, il faut utiliser "GetPCCrimeLevel".
- Le premier "Set Open to 1" ne devrait pas être là où tu l'as mis.
- Il n'y a ni "SetAtStart" ni "SetPos" pour replacer la herse exactement dans sa position initiale. Il faut que tu relises ce qui a été dit dans les messages précédents pour être sûr de comprendre pourquoi c'est nécessaire.

A part ça, en corrigeant ces points tu aurais une herse fonctionnelle mais qui ne prévoirait pas toutes les situations. Par exemple, si le PJ s'éloigne pendant que la grille est à mi-course, la grille s'arrête dans une position intermédiaire. Je te propose donc le script ci-dessous. Je pense qu'on pourrait l'optimiser car j'ai un peu de mal à faire des scripts aujourd'hui mais je sais qu'il est en tout cas fonctionnel car je l'ai testé :

begin CDH_Herse_01

short open; position de la herse
short passeport; détermine si la herse peut être ouverte (le PJ est proche et n'est pas un criminel)
float timer

if (MenuMode == 1)
	return
endif

set passeport to 0; par défaut, la herse doit être fermée

if ( GetDistance Player < 200 ); Si le PJ est à moins de 200 unités
	if ( GetPCCrimeLevel == 0 ); Si le PJ n'est pas un criminel
		set passeport to 1; La herse doit être ouverte
	endif
endif

if ( timer >= 0 ); si la herse est immobile (elle est en mouvement quand le timer est < 0).

	if ( passeport == 0 ); si la herse doit être fermée
		if ( open == 0 ); si elle a bien été fermée
			SetAtStart; on la replace exactement dans sa position initiale (définie dans le Tescs).
		else; si elle est ouverte
			set open to 0; on la déclare fermée
			set timer to -3; on règle le timer à -3s pour déclencher le mouvement
			Playsound, Machinery; on lance un son de herse en mouvement
		endif
	else; si la herse doit être ouverte
		if ( open == 0 ); si elle est fermée
			set open to 1; on la déclare ouverte
			set timer to -3; on règle le timer à -3s pour déclencher le mouvement
			Playsound, Machinery; on lance un son de herse en mouvement
		endif
	endif

else; si la herse doit être en mouvement (tant que le timer est < 0).

	set timer to ( timer + GetSecondsPassed ); actionne le timer

	if ( Open == 1 ); si elle est déclarée ouverte
		Moveworld z, 75; mouvement vers le haut
	else; si elle est déclarée fermée
		Moveworld z, -75; mouvement vers le bas
	endif
endif

end

PS : J'ai mis un son de machinerie Dwemer pour l'exemple mais il n'est pas vraiment adapté. Il faudrait que tu trouves un son de herse qui dure 3 secondes pour le remplacer. Le son n'est pas obligatoire bien sûr mais c'est le genre de petits détails qui facilitent l'immersion dans le jeu.

PPS : Il y avait un autre problème dans ton script. Quand tu mets des commentaires en utilisant un ";", il faut qu'il n'y ait pas d'espace entre le dernier caractère de l'instruction et le ";". Les espaces après le ";" ne gênent pas.
Généralement, les espaces qui suivent une instruction ne font pas de bug mais quelques fois c'est le cas. Il vaut donc mieux prendre cette habitude de ne laisser aucun espace à la fin d'une instruction.

EDIT :

Dans le PPS, j'ai dit une demi-bêtise. Si l'espace est fait avec la barre d'espace, il n'y a pas de problème. Le risque de crash survient quand cet espace est fait avec la touche "tabulation". Bref, l'info exacte est qu'il ne doit pas y avoir de tabulation sur une ligne après le premier caractère (n'importe où sur la ligne).

#11 Dallara

Dallara

    Fortificateur fortiche


Posté 30 juillet 2009 - 07:11

Merci beaucoup Elendell je vais voir sa se soir.
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#12 sucresalesucre

sucresalesucre

    En fait y'a des accents cachés


Posté 30 juillet 2009 - 07:21

Il y a aussi une autre solution, qui évite de passer par un script pour gérer les conditions : passer par le dialogue d'un garde.
C'est le garde qui t'autorise ou non à rentrer en fonction des conditions que tu as citées.

Et ce serait logique en jeu, puisque la herse n'est pas sensée s'ouvrir toute seule, et quelqu'un est bien sensé controler si le joueur remplit les conditions pour rentrer.

Ca fait donc les conditions dans le dialogue du garde d'un coté, et l'ouverture physique de la herse en script sur la herse. Tu peux aussi faire que seul les gardes aient le droit d'activer la manivelle de la herse.

Apres ça dépend si tu le fais pour une porte, ou sur plusieurs. J'ai vu qu'il y a pas mal de herses dans le chateau ;-)

Le chat CROIT appartenir à une race supérieure évoluée. Mais ce n'est qu'un rebut pervers avec des yeux belzebuth et des griffes.


------

Moddeur de Blye Citadelle du Chaos pour Morrowind et Vault panic pour Fallout3


#13 Dallara

Dallara

    Fortificateur fortiche


Posté 30 juillet 2009 - 08:38

Voir le messagesucresalesucre, le 30.07.2009 à 08:20, dit :

Il y a aussi une autre solution, qui évite de passer par un script pour gérer les conditions : passer par le dilogue d'une garde.
C'est le garde qui t'autorise ou non à rentrer en fonction des conditions que tu as citées.

Et ce serait logique en jeu, puisque la herse n'est pas sensée s'ouvrir toute seule, et quelqu'un est bien sensé controler si le joueur remplit les conditions pour rentrer.

Apres ça dépend si tu le fais pour une porte, ou sur plusieurs. J'ai vu qu'il y a pas mal de herses dans le chateau ;-)

En faite j'ai crée un mesh d'un avant toit a côté de chaque porte ou il y aura un grosse manivelle (qui tournera avec le même script sauf en rotation) et deux Gardes.
Mais il est vrai que de faire un dialogue qui s'affiche quand on est un certaine distance et qui fait que le garde nous autorise ou non a rentrer serait bien mieux.
Mais je me demande si sa risque pas de faire un peu lourd (je pense en particulier a Post-it).

Voila
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#14 sucresalesucre

sucresalesucre

    En fait y'a des accents cachés


Posté 30 juillet 2009 - 14:04

Sinon, tu peux aussi mettre seulement deux ou trois grandes portes avec des grilles (=accès limité), et les autres sans grilles. C'est sûr qu'il vaut mieux éviter que trop de scripts s'executent en même temps, surtout en extérieur chargé. De plus, la structure cloisonnée du chateau permet que seules certaines portes puissent être bloquées. Pour les autres portes, quelques clés données lors de quêtes peuvent faire l'affaire.

L'autre chose à prendre en compte, c'est l'aspect scénar : pourquoi telle ouverture devrait avoir une grille, et quelle raison autorise l'ouverture. Qui ouvre la porte ? Le joueur lui-même ou le garde ? Bref, se mettre à la place des autorités de ton chateau, tout en pensant à tes scripts...

Parfois, un problème technique peut se contourner avec une astuce scénaristique. Avec un jeu limité techniquement comme Morrowind, on est souvent obligé de contourner un problème plutôt que de la jouer "frontale".

EDIT : autre solution, lier l'ouverture de la herse à celle de la porte. C'est toujours le garde qui active la porte dès la fin du dialogue positif, et un script sur la porte, détectant son ouverture, fait monter et descendre la herse. Du coup plus de script sur la herse.

Le chat CROIT appartenir à une race supérieure évoluée. Mais ce n'est qu'un rebut pervers avec des yeux belzebuth et des griffes.


------

Moddeur de Blye Citadelle du Chaos pour Morrowind et Vault panic pour Fallout3


#15 Dallara

Dallara

    Fortificateur fortiche


Posté 30 juillet 2009 - 18:30

Mais je pense que aussi, dans un château, c'est pas au voyageur de demmander l'ouverture de la porte (sauf la nuit) mais au guetteur d'ordonner l'ouverture au types qui sont charger de remonter ou descendre la Herse.

Non?

EDIT: Merci Elendell sa marche très bien et j'ai du faire certes des corrections mais sa marche (la distance d'activation).
         Pour le son je trouverait bien un autre son une fois.

Modifié par Dallara, 30 juillet 2009 - 22:55.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#16 elendell

elendell

    Mécano Dell'Arte


Posté 30 juillet 2009 - 23:15

Voir le messageDallara, le 30.07.2009 à 19:29, dit :

Mais je pense que aussi, dans un château, c'est pas au voyageur de demmander l'ouverture de la porte (sauf la nuit) mais au guetteur d'ordonner l'ouverture au types qui sont charger de remonter ou descendre la Herse.

Non?
Je crois que c'est à toi de définir les us de l'univers de ton module. Parce que si on se fie à ceux de notre histoire irl, un château n'aurait aucune raison d'avoir ses grilles baissées le jour, sauf si des ennemis seraient susceptibles de l'attaquer sous peu ou qu'il serait entouré d'une faune particulièrement dangereuse, qu'il faudrait en permanence empêcher d'entrer.

Un château est aussi une petite ville qui héberge de nombreux habitants et il y a forcément des va et vient permanents de la population qui y habite mais aussi de ceux qui en dépendent et/ou qui le font vivre. Je parle bien sûr des passages vers les cours et parties communes et non des appartements privatifs destinés à l'élite. Mais même pour les parties privatives, des herses fermées par défaut ne se justifieraient à mon avis que si le châtelain est un tel tyran qu'il peut être attaqué n'importe quand par des groupes supérieurs en nombre aux gardes du château ou des désespérés qui n'ont plus rien à perdre.

Après, question herses, il y a celles de la Porte des Âmes. Elles sont fermées en permanence à cause des nombreuses créatures dangereuses qui sont derrière le Rempart intangible et que ce passage est le seul point faible de la muraille magique qui retient Dagoth Ur.

Mais même si la Porte des Âmes a aussi une garnison qui veille à empêcher le mal de se répandre, les pèlerins peuvent quand même actionner les herses à leur guise grâce à un mécanisme.

Mais dans un "mod" comme dans une histoire, on fait ce qu'on veut bien sûr (du moment que ça se tient dans un ensemble cohérent).

#17 Dallara

Dallara

    Fortificateur fortiche


Posté 31 juillet 2009 - 19:56

Tu viens de me donner une idée géniale !!

une herse le jour qui reste ouverte de toutes façon (sauf si on est criminel)
et une autre la nuit ou un garde nous interpèles pour rentrer.

Est-ce possible ?

EDIT:

Je viens d'essayer pour la herse de jour:
Alors elle décent quand je fais un crime mais elle descend a l'infini.
Par contre quand je paye la rançon la herse remonte en une seule frame mais elle remonte
comment la faire s'arrêter a bon endroits et monter de manière réaliste ? (Je pense avec la fonction short timer)


Et je pense qu'il serait mieux de faire un seul script avec suivant l'heure (7) la herse qui monte et reste en haut sauf en cas de crime ou elle descend.
et a une autre heure (9) ou elle décent et reste en bas et fait que on doit demander au garde pour nous ouvrir.
Mais je sais pas comment faire. :laughing1:

En attendant je met le script que j'ai déjà fait et demade gentiment de me dire se qui va pas et pourquoi (que je puisse me débrouiller tout seul les autres fois)

Merci

begin CDH_Herse_01
  
  short open
  float timer
  
  
  if ( MenuMode ==  1)
	  return
  endif
  
  If ( GameHour >= 7 )
	 if ( GameHour <=9 )
		 if ( GetDisabled == 1 )
			 Enable
		 endif
	 endif
  endif
  
  if ( GameHour >=9 )
	 If ( GameHour <=7 )
		If ( GetDisabled == 0 )
			Disable
		endif
	 endif
  endif
  
  if ( GetPCCrimeLevel >= 1 )
		Moveworld z, -70
		set timer to -3
  endif
  
  if ( GetPCCrimeLevel == 0 )
	   SetatStart
  endif
		 
		
  
  end CDH_Herse_01

Modifié par Dallara, 31 juillet 2009 - 21:32.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#18 Endu

Endu

Posté 31 juillet 2009 - 23:59

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

  if ( GameHour >=9 )
	 If ( GameHour <=7 )
		If ( GetDisabled == 0 )
			Disable
		endif
	 endif
  endif

Si je ne me trompe pas  l'heure ne peut pas etre a la fois superieure a 9 et inferieure a 7, il faut un elseif si je ne m'abuse
Co-concepteur de la Cité d'Almalexia - Trailer disponible!

#19 elendell

elendell

    Mécano Dell'Arte


Posté 01 août 2009 - 07:52

Voir le messageEndu, le 01.08.2009 à 00:58, dit :

Si je ne me trompe pas  l'heure ne peut pas etre a la fois superieure a 9 et inferieure a 7, il faut un elseif si je ne m'abuse
Bien vu mais étant donné ce qu'il veut faire, je pense qu'il a confondu 9h et 21h.  :D

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

une herse le jour qui reste ouverte de toutes façon (sauf si on est criminel)
et une autre la nuit ou un garde nous interpèles pour rentrer.
Sauf si tu tiens à ce qu'il y en ait deux, Une seule herse suffit.  :)  

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

Alors elle décent quand je fais un crime mais elle descend a l'infini.
Normal, tu ne lui dis pas quand elle doit stopper.

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

Par contre quand je paye la rançon la herse remonte en une seule frame mais elle remonte
Elle ne remonte pas vraiment ; elle est repositionnée à sa place d'origine (SetAtStart).

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

comment la faire s'arrêter a bon endroits et monter de manière réaliste ?
De la même manière que dans mon précédent script par exemple.  :laughing1:

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

(Je pense avec la fonction short timer)
Attention, il n'existe pas de fonction short "float timer" ! "Timer" est une simple variable. On utilise souvent ce nom (ou "chrono") pour une variable destinée à enregistrer les secondes passées mais c'est juste une habitude qui permet de comprendre immédiatement à quoi elle est destinée. D'une part, on pourrait utiliser "chaussette" à la place et d'autre part, on pourrait utiliser le mot "timer" pour une variable destinée à tout autre chose. La fonction est : "GetSecondsPassed".

Donc, quand dans ton script tu marques "set timer to -3" sans utiliser "set timer to ( timer + GetSecondsPassed )", ta variable "timer" ne fera pas chronomètre.

Voir le messageDallara, le 31.07.2009 à 20:55, dit :

En attendant je met le script que j'ai déjà fait et demade gentiment de me dire se qui va pas et pourquoi (que je puisse me débrouiller tout seul les autres fois)
Pour pouvoir te débrouiller seul, il n'y a pas 36 solutions. Tu dois commencer par utiliser systématiquement le MSfD !
Par exemple, quand tu as pensé que tu pouvais utiliser un "timer" : Tu aurais dû ouvrir le MSfD8, utiliser le bouton recherche du PDF avec le mot "timer" et il t'aurait indiqué la page 119. Avec ce qu'il y a écrit dans cette page, tu aurais utilisé "GetSecondsPassed" dans ton script.  :)

A part ça, les "Enable/Disable" servent à rendre l'objet visible ou invisible. Si tu n'utilises qu'une seule herse, tu n'en a pas besoin.
Je te propose ci-dessous un script qui est une variante de mon précédent. Il est en local sur la herse qui doit être placée en position haute (ouverte) dans le Tescs. Il faut également que tu crées une variable globale (short) nommée : "CDH_Glo_Ouvre" (sans les guillemets).

Spoiler

Notes :

- Dans le "result" du dialogue avec le garde de nuit (quand le PJ lui demande d'ouvrir), tu dois mettre "set CDH_Glo_Ouvre to 1". Mais avec une condition éventuelle (en filtre de dialogue) pour qu'il ne le fasse pas si le PJ est un criminel recherché. Mais de toute façon, si c'est un vrai garde, il devrait interpeller le PJ criminel avant que celui-ci n'ait le temps de lui demander d'ouvrir.

- Tu peux attacher le même script à plusieurs herses dans la cellule. Dans ce cas, il faudra (tel que je l'ai fait) un garde par herse, et le PJ devra demander à chaque fois l'ouverture.

- Il faudra peut-être régler les distances dans le script et/ou la vitesse de la herse. Il me semble qu'un criminel très rapide aurait le temps de passer avant la fermeture (mais ça peut aussi être bien que dans ce cas, il arrive à passer).

- Cette fois, j'ai utilisé "PlayLoopsound3DVP" et "StopSound" au lieu de "PlaySound". Regarde ces trois fonctions dans le MSfD pour voir la différence.

- Une autre solution aurait été de faire un levier qui pilote la herse (comme à la Porte des Âmes) et de le faire actionner par le garde aux bons moments. Mais tu peux aussi utiliser ce script sur la herse et faire en plus un script de déplacement pour le garde. De telle sorte qu'il donne l'impression d'aller actionner un mécanisme à 7h, 21h et quand le PJ le lui demande la nuit.

#20 Dallara

Dallara

    Fortificateur fortiche


Posté 01 août 2009 - 19:27

Bonsoir,

Alors effectivement j'ai confondu 9h et 21h ^^

Citation

- Dans le "result" du dialogue avec le garde de nuit (quand le PJ lui demande d'ouvrir), tu dois mettre "set CDH_Glo_Ouvre to 1". Mais avec une condition éventuelle (en filtre de dialogue) pour qu'il ne le fasse pas si le PJ est un criminel recherché. Mais de toute façon, si c'est un vrai garde, il devrait interpeller le PJ criminel avant que celui-ci n'ait le temps de lui demander d'ouvrir.
Je dois donc créer un nouveau dialogue ?

Citation

- Tu peux attacher le même script à plusieurs herses dans la cellule. Dans ce cas, il faudra (tel que je l'ai fait) un garde par herse, et le PJ devra demander à chaque fois l'ouverture.
Est-ce que le garde doit apparaitre que la nuit ?

Citation

- Tu peux attacher le même script à plusieurs herses dans la cellule. Dans ce cas, il faudra (tel que je l'ai fait) un garde par herse, et le PJ devra demander à chaque fois l'ouverture.
Logique mais Est-ce que (si je dois faire un nouveau dialogue) je devrait en faire un différent par garde ?

Citation

Il faut également que tu crées une variable globale (short) nommée : "CDH_Glo_Ouvre" (sans les guillemets).
Comment et ou?

Et encore est-ce que le garde devrait être en bas ou peu être sur le mur avec un script qui active le dialogue a distance (600) ?

Et il faudra que je consulte un peu plus souvant le MSfD.

Modifié par Dallara, 01 août 2009 - 19:48.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#21 elendell

elendell

    Mécano Dell'Arte


Posté 01 août 2009 - 23:23

Bonjour Dallara,

Voir le messageDallara, le 01.08.2009 à 20:26, dit :

Je dois donc créer un nouveau dialogue ?
Si tu veux que le garde commande l'ouverture après avoir posé des questions au PJ qui veut entrer la nuit, oui. Mais c'est à toi de définir ce que tu veux exactement (et de préférence avant de demander comment le faire). J'ai mis cette variable globale dans le script parce que j'avais compris que tu voulais ce dialogue. Je continue donc sur cette idée. Elle peut se faire de différentes manières, (avec des gardes différents ou un garde générique) mais en voici une :

1) Tu fais un PNJ nommé "Garde du château" avec une "ID" spécifique (par ex. "CDH_GuardHerse"), à qui tu donnes la classe : "Guard" (comme par ex. les "hlaalu guard"). Tu n'as pas besoin de faire un garde différent pour chaque herse. Il suffit de mettre toujours le même (qui n'a pas de nom visible autre que "Garde du château").

2) Si tu veux placer des "Garde du château" également à d'autres endroits que devant  les herses, il faut que tu fasses une autre "ID" de "Garde du château" (par ex. "CDH_Guard").

3) Tu fais un "topic" : "entrer dans le château". Dans les "Speaker Condition" de ce "topic", tu le filtres pour qu'il ne soit accessible qu'avec un PNJ "CDH_GuardHerse", après 21h et avant 7h.

4) Dans ce "topic", tu peux faire un dialogue complexe où le PJ doit donner une raison valable avant que le garde accepte de lui ouvrir la nuit ou tu peux faire un dialogue minimal unique. Mais si le château est fermé la nuit, il serait logique que le PJ doive donner une raison pour qu'on le laisse quand même entrer. (Sinon, autant laisser toujours ouvert).

Au final de ce dialogue, tu mets dans le "result" de l'info où le garde accepte d'ouvrir (en disant par exemple "Bon d'accord, je vous ouvre.") : set CDH_Glo_Ouvre to 1.

Tu n'as pas à te soucier de savoir si le PJ est ou non un criminel. A partir du moment où le garde est de classe "Guard", si le PJ s'approche pour lui parler, il devra avant tout payer son amende ou aller en prison (c'est déjà dans les "greetings" du jeu).

5) Plein de choses peuvent être faites en plus (comme de faire déplacer le garde pour faire comme si il allait actionner un mécanisme) mais ce n'est pas nécessaire. Ce ne serait qu'un plus et il vaut mieux que tu parviennes à faire le minimum pour que ça fonctionne, quitte à l'améliorer par la suite quand tu auras plus d'expérience.

Voir le messageDallara, le 01.08.2009 à 20:26, dit :

Est-ce que le garde doit apparaitre que la nuit ?
C'est comme tu veux. Ça ne change rien pour le script.

Voir le messageDallara, le 01.08.2009 à 20:26, dit :

Logique mais Est-ce que (si je dois faire un nouveau dialogue) je devrait en faire un différent par garde ?
Là aussi, c'est comme tu veux. Un dialogue unique pour tous les gardes de herses est plus facile à faire. Tu pourras les personnaliser si tu veux par la suite.

Voir le messageDallara, le 01.08.2009 à 20:26, dit :

Citation

Il faut également que tu crées une variable globale (short) nommée : "CDH_Glo_Ouvre" (sans les guillemets).
Comment et ou?
Menu "GamePlay"->"Globals...". Dans la fenêtre qui s'ouvre, tu cliques sur "New". Laisse les valeurs suivantes telles quelles : type short, value 0.

Voir le messageDallara, le 01.08.2009 à 20:26, dit :

Et encore est-ce que le garde devrait être en bas ou peu être sur le mur avec un script qui active le dialogue a distance (600) ?
Tous ces éléments, c'est à toi de les choisir. Laisse faire ton imagination en te plaçant dans la situation et amuse-toi.
Ce qu'il faut, c'est avant tout faire un plan qui établisse ce que tu veux en essayant de penser à tout au préalable, en le notant quelque part. On peut aussi changer les choses au fur et à mesure mais si tu demandes de l'aide, sois sûr avant de ce que tu veux exactement.
Sinon, c'est désagréable pour ceux qui t'aident à faire techniquement une chose que finalement tu n'emploieras pas après.  :laughing1:

EDIT :

PS : Tu peux essayer mon script même si tu n'as pas fait les dialogues et les gardes. Il faut juste que crées la variable globale indiquée, avant de sauvegarder le script. Pour simuler en jeu ce qui se passera quand tu parleras à un garde de herse la nuit, il  suffit que tu entres à la console : set CDH_Glo_Ouvre to 1 (en étant à moins de 600 unités de la herse). De même que pour savoir ce qui se passe avec un PJ criminel, tu dois entrer à la console : SetPCCrimeLevel 1.

#22 Dallara

Dallara

    Fortificateur fortiche


Posté 02 août 2009 - 11:06

Citation

Ce qu'il faut, c'est avant tout faire un plan qui établisse ce que tu veux en essayant de penser à tout au préalable, en le notant quelque part. On peut aussi changer les choses au fur et à mesure mais si tu demandes de l'aide, sois sûr avant de ce que tu veux exactement.
Sinon, c'est désagréable pour ceux qui t'aident à faire techniquement une chose que finalement tu n'emploieras pas après.  :laughing1:

OK.

Pour le reste de ton message je te remercie pour toutes tes explications (sa doit pas être simple) et je vais essayer tout sa demain

Merci

Dallara

Bonjours,

Après test j'ai quelques erreurs a reporté.

ton script a un petit problème du moment ou quand j'arrive de nuit près de la Herse elle monte toute seul avec un message Box "allez-y" mais sans que j'aille rien a dire et surtout sa fais sa que une fois après plus possible de repasser elle ne monte plus (sauf avec la console).

Ensuite j'ai fais mon dialogue mais celui-ci ne s'affiche pas quand je parle au garde.
Comment afficher le dialogue?
Et comment mettre des contraintes horaires sur le dialogue?
Et finalement comment l'afficher a distance sans que je doive parler au garde?

Dallara
Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#23 elendell

elendell

    Mécano Dell'Arte


Posté 02 août 2009 - 17:19

Bonjour Dallara,

Voir le messageDallara, le 02.08.2009 à 12:05, dit :

quand j'arrive de nuit près de la Herse elle monte toute seul avec un message Box "allez-y" mais sans que j'aille rien a dire
Ce n'est pas une erreur de script et il n'y a pas ce bug chez moi. Je pense que tu as fait une erreur dans le Tescs. Si la herse monte toute seule quand tu t'en approches de nuit, ça veut dire que la variable globale "CDH_Glo_Ouvre est à 1" alors qu'elle devrait être à 0 ou que la variable locale "passe" est à 1 alors qu'elle devrait être à 0.

Recommence ton essai de nuit mais avant de t'approcher de la herse, fais le code suivant : show CDH_Glo_Ouvre

Si ça te renvoie 1, c'est soit que tu l'avais précédemment mise à 1 à la console, soit que tu t'es trompé quand tu as créé la variable dans le Tescs, soit que tu t'es trompé dans les dialogues du garde, soit encore que tu as utilisé l'outil "Error Check Results" du Tescs et que tu as ensuite sauvegardé le "mod" (ce qui aurait pour effet de faire passer cette globale à 1 par défaut au lieu de 0 dans le "mod").

Si le code "show CDH_Glo_Ouvre" te renvoie 0 (avant de t'approcher de la herse), clique sur la herse pour la sélectionner (avec la console ouverte) et fais le code : SV
Dans les variables que te renvoie la console, regarde la valeur de "passe" et dis-moi ce qu'elle indique.


Voir le messageDallara, le 02.08.2009 à 12:05, dit :

et surtout sa fais sa que une fois après plus possible de repasser elle ne monte plus (sauf avec la console).
Tel que je l'ai fait, quand tu demandes au garde d'ouvrir, il ne t'ouvre qu'une fois. Si tu veux repasser ensuite, il faut le lui demander à nouveau (ce que tu simules en utilisant la console). Si tu veux qu'une seule demande d'ouverture suffise pour qu'il t'ouvre systématiquement par la suite ou pendant un temps défini (1h ou 1 nuit ou tout le temps à l'avenir), il faut modifier légèrement le script. Il faut que tu me précises exactement ton choix.


Voir le messageDallara, le 02.08.2009 à 12:05, dit :

Ensuite j'ai fais mon dialogue mais celui-ci ne s'affiche pas quand je parle au garde. Comment afficher le dialogue?
Faire un "topic" ne suffit pas pour qu'il s'affiche. Il faut aussi que le PNJ a qui tu t'adresses ait quelque chose à dire dans ce "topic" mais également que le PJ connaisse ce "topic". La première condition est vraie puisque le garde de la herse a quelque chose à dire sur ça mais pour l'instant, le PJ ne connait pas ce "topic".

Pour ça, il y a deux solutions possibles :

1) Un PNJ qui a quelque chose à dire dans "entrer dans le château" prononce ces mots à un moment donné. Par exemple, quand tu t'approches de la herse, un "greeting" fait dire au garde  : "Que voulez-vous ? Ne me dites pas que vous espérez entrer dans le château ! Suite à ça, si tu parles à n'importe quel garde de herse, tu auras accès au "topic" parce que les mots exacts ont été prononcés par au moins une personne qui a quelque chose à dire sur ça. C'est ce qui permet les enchainements de "topics" dans une conversation.

2) Tu peux aussi lancer l'instruction suivante au préalable : AddTopic "entrer dans le château"
C'est ce qui permet que le PJ puisse poser une question même sur un sujet que personne n'a évoqué auparavant.
Le "AddTopic" peut être placé dans un "Result" de n'importe quel dialogue ou dans n'importe quel script (ou pour tester, fait à la console).


Voir le messageDallara, le 02.08.2009 à 12:05, dit :

Et comment mettre des contraintes horaires sur le dialogue?

Comme ça : http://img38.imageshack.us/img38/7748/capt1807531.th.jpg

Voir le messageDallara, le 02.08.2009 à 12:05, dit :

Et finalement comment l'afficher a distance sans que je doive parler au garde?
Ça dépend à quelle distance tu veux que ça s'affiche. Mets ton PJ dans le jeu à la distance du garde que tu souhaites pour que le dialogue s'enclenche. Puis ouvre la console, clique sur le garde et fais le code suivant : GetDistance Player

Dis-moi le résultat.

#24 Dallara

Dallara

    Fortificateur fortiche


Posté 02 août 2009 - 18:57

Bonjours Elendell

Voir le messageelendell, le 02.08.2009 à 18:18, dit :

Si ça te renvoie 1, c'est soit que tu l'avais précédemment mise à 1 à la console, soit que tu t'es trompé quand tu as créé la variable dans le Tescs, soit que tu t'es trompé dans les dialogues du garde, soit encore que tu as utilisé l'outil "Error Check Results" du Tescs et que tu as ensuite sauvegardé le "mod" (ce qui aurait pour effet de faire passer cette globale à 1 par défaut au lieu de 0 dans le "mod").

J'ai réglé le problème merci. J'avais fais l'erreur d'utiliser l'outil "Error Check Results"



Voir le messageelendell, le 02.08.2009 à 18:18, dit :

1) Un PNJ qui a quelque chose à dire dans "entrer dans le château" prononce ces mots à un moment donné. Par exemple, quand tu t'approches de la herse, un "greeting" fait dire au garde  : "Que voulez-vous ? Ne me dites pas que vous espérez entrer dans le château ! Suite à ça, si tu parles à n'importe quel garde de herse, tu auras accès au "topic" parce que les mots exacts ont été prononcés par au moins une personne qui a quelque chose à dire sur ça. C'est ce qui permet les enchainements de "topics" dans une conversation.

Je préfère cette solution mais comment faire ?
j'entend dans quel Greeting le mettre ?




Voir le messageelendell, le 02.08.2009 à 18:18, dit :

Ça dépend à quelle distance tu veux que ça s'affiche. Mets ton PJ dans le jeu à la distance du garde que tu souhaites pour que le dialogue s'enclenche. Puis ouvre la console, clique sur le garde et fais le code suivant : GetDistance Player

Dis-moi le résultat.

796.28

Et je tiens a te remercier pour toute ton aide

Modifié par Dallara, 02 août 2009 - 18:58.

Heureux qui comme la rivière peu suivre son cours sans quitter son lit.

Le travail c'est la santé, laisse le au malade.

Mieux vaut arriver en retard qu'en corbillard!

VGM

#25 elendell

elendell

    Mécano Dell'Arte


Posté 02 août 2009 - 23:33

Voir le messageDallara, le 02.08.2009 à 19:56, dit :

j'entend dans quel Greeting le mettre ?
Le choix du type de "Greeting" n'est pas évident. Avant tout, lis la page 82 du MSfD8, qui indique les répartitions des "Greetings" dans le jeu.

Ensuite, tu dois bien comprendre que le jeu lit dans l'ordre tous les "Greetings" (et les dialogues qu'ils contiennent). Ce qui veut dire qu'il commence par le premier dialogue du "Greeting" 0 et finit par le dernier du "Greeting" 9.
Dès qu'il trouve un dialogue dont toutes les conditions mises en filtre sont vraies, il l'utilise et arrête de chercher.
Donc, le choix va dépendre du type de dialogue que tu veux mettre en "Greeting" mais également, si tu veux que des "Greetings" existants puissent être prioritaires.

Par exemple, il y a deux types de "Greetings" utilisés pour les quêtes (le 1 et le 5). Si tu plaçais ton "Greeting" dans le type 0 en haut de la liste (à ne surtout pas faire), ton dialogue serait lancé dans tous les cas, à partir du moment où les conditions que tu as définies sont justes (CDH_GuardHerse et conditions horaires).

Si tu le places en "Greeting" 1, le jeu va commencer par vérifier tous les "Greetings" 0. Si le PJ est un criminel et que le garde est de classe "Guard", il va y trouver un dialogue du jeu dont les conditions sont vraies et lancera ce dialogue au lieu du tien :
Spoiler
C'est donc une bonne chose puisque ça t'évite de faire un dialogue spécial au cas où le PJ est un criminel et que tu ne veux pas qu'il puisse entrer dans ce cas. Mais, si le PJ n'est pas un criminel mais par contre est malade, est un vampire ou un exhibitionniste, le garde ne s'en préoccupera pas car les types de "Greetings" qui vérifient ça sont les types 2 et 4 (voir MSfD !).

Si tu places ton "Greeting" dans le type 5, le jeu trouvera avant d'arriver au tien non seulement celui qui concerne les criminels mais également les autres dialogues prévus dans les cas que j'ai cités. Par exemple, si le garde est un elfe noir et que le PJ est malade, il y a de fortes chances que le garde lui dise ceci :
Spoiler
Ce qui peut donc être très bien puisqu'après tout, il est logique que le garde ne laisse pas plus entrer quelqu'un de malade, un vampire ou quelqu'un qui se promène tout nu qu'un criminel recherché !

Prends le temps de lire les "Greetings" déjà prévus par le jeu et d'examiner les conditions placées en filtre pour bien comprendre et faire ton choix. Ce ne sera pas du temps perdu car ça te servira pour tout autre dialogue à venir. Ceci dit, personnellement je placerais ce "Greeting" en type 5.

Voir le messageDallara, le 02.08.2009 à 19:56, dit :

796.28
Comme toujours, il y a plusieurs possibilités. Si ton garde est unique, on peut ajouter une instruction dans le script de la herse mais pour que tu ais la possibilité de placer plusieurs herses avec chacune un garde (de même "ID"), il vaut mieux faire un petit script local que tu attacheras au garde ("CDH_GuardHerse"). Par exemple, je ne l'ai pas testé mais ce script devrait fonctionner :

begin CDH_Scr_GuardHerse

short parle

if ( GameHour >= 7 )
	if ( GameHour < 21 )
		set parle to 0
		return
	endif
endif

if ( GetDistance, Player > 796.28 )
	set parle to 0
else
	if ( parle == 0 )
		ForceGreeting
		set parle to 1
	endif
endif

end

Important : Il faut aussi que tu changes la distance qui déclenche la fermeture de la herse dans "CDH_Herse_01", comme ceci :

...

elseif ( ouverture == 0 )

	if ( GetDistance Player > 796.28 )
		set passe to 0
...





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

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