Aller au contenu


[fonctions] Getlocked Et Lock


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

#1 elendell

elendell

    Mécano Dell'Arte


Posté 06 mai 2009 - 19:23

Bonjour,

Une petite info sur la fonction "GetLocked" :

Suite à un bogue de "Quêtes Secondaires", j'ai regardé les scripts concernés. Ceux-ci utilisent de la même manière ces fonctions :

Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
	Return
endif

if ( GetLocked == 0 )
	Lock 100
	MessageBox "La serrure résiste à tous vos efforts !"
endif

End

La porte qui a ce script est "lockée" à 100 dans le Tescs mais, dès que le PJ arrive dans la cellule, la messageBox est déclenchée et elle tourne ensuite continuellement. Si on on fait "GetLocked" sur la porte, on obtient bien 1 et la porte est bien "lockée" à 100; la MessageBox ne devrait donc pas être déclenchée et encore moins continuellement.

J'ai essayé en différant d'une frame et en décomposant en plusieurs étapes mais le résultat est toujours le même. Le seul moyen que j'ai trouvé est d'utiliser un timer :

Begin nenPortePrisonPlayerScript

float timer

if ( "nen_DelinOran".greet >= 2 )
	Return
endif

set timer to ( timer + GetSecondsPassed )

if ( GetLocked == 0 )
	if ( timer > 1 )
		set timer to 0
	endif
endif

if ( timer == 0 )
	MessageBox "Un dispositif d'alarme referme la serrure !"
	lock 100
endif


End


#2 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 06 mai 2009 - 19:38

ça ne donne rien non plus en essayant un :

if ( GetLocked == 1 )
	return
endif

Lock 100
MessageBox "La serrure résiste à tous vos efforts !"

?

( désolé, mais actuellement ma version de MW a un problème; impossible de tester quoi que ce soit. )

en tout cas, n'utilisant jamais la fonction Getlocked, je n'avais jamais vu ce problème, merci elendell :banderilles:

#3 elendell

elendell

    Mécano Dell'Arte


Posté 06 mai 2009 - 20:05

Pourquoi faire simple quand on peut faire compliqué ?  :laughing1:

Oui, bien sûr, c'est bien mieux comme solution. Merci Snaïpe !

EDIT : Donc, pour corriger mon info après l'essai de ta proposition, il semble que ce soit "if ( GetLocked == 0 )" qui fonctionnerait mal alors que "if ( GetLocked == 1 )" fonctionne bien...

#4 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 06 mai 2009 - 20:39

ah, morrowind, tes graphismes, ton gameplay, tes bugs :laughing1:



de rien Elendell, content de t'avoir aidé :)

#5 Orann

Orann

    Nérévarine de Pertevue


Posté 09 mai 2009 - 10:36

J'ajouterais que si on veux créer une porte impossible à ouvrir, on peut mettre dans le TESCS un indice de fermeture négatif. Seul inconvénient, on verra dans le jeu ce verrouillage avec un nombre négatif... Mais aucun crochet ne pourra l'ouvrir. ;)
Mais je suis peut-être complètement à côté de la plaque de ce que ce script est censé faire... :)

En tout cas, merci de signaler ce bug du (getlocked == 0). :)

Modifié par Orann, 09 mai 2009 - 10:36.

Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#6 elendell

elendell

    Mécano Dell'Arte


Posté 09 mai 2009 - 11:26

Je ne savais pas pour l'indice négatif, merci. Ça peut permettre d'éviter un script s'il ne sert qu'à condamner la porte.  :)

Avec un script, on peut aussi la condamner sans avoir besoin de la "relocker" à chaque fois (avec "if (OnActivate")) mais je pense que l'auteur a fait ce choix à cause de l'histoire. La porte est censée avoir une serrure incrochetable mais qui sera ouverte ensuite par quelqu'un qui a la clef.

En fait, le script fait "unlock" le moment venu et on ne voit jamais cette clef mais je présume que cela faisait plus crédible pour l'auteur qu'elle ait une valeur de fermeture qui passera ensuite à 0.

Quand à la deuxième porte, le même PNJ est censé la verrouiller puis, casser la clef dans la serrure. Il fallait donc qu'elle ait une valeur de fermeture positive que le joueur peut voir (je présume, bien sûr).

#7 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 11 mai 2009 - 20:42

Voir le messageOrann, le 09.05.2009 à 11:35, dit :

J'ajouterais que si on veux créer une porte impossible à ouvrir, on peut mettre dans le TESCS un indice de fermeture négatif. Seul inconvénient, on verra dans le jeu ce verrouillage avec un nombre négatif...
Je peux me tromper, mais il me semble avoir vu il y a quelques années dans je ne sais plus quel module (peut-être la 2e partie des enfants de la nuit) que l'on peut également verrouiller une porte à zéro en lui attribuant une clef, ce qui la rend impossible à crocheter. La seule solution est de disposer de la clef... et il suffirait que la clef en question ne soit pas disponible ingame. Il me semble que dans ce cs, on n'a pas d'indice chiffré du verrouillage...

Je n'ai pas le temps de vérifier si ma mémoire me joue des tours maintenant, puisque je dois aller travailler, mais je tâcherai d'y penser ce soir... sleeping.gif

[edit]Après quelques tests, il s'avère que, s'il est bien possible de verrouiller une porte à 0 (à la condition expresse d'attribuer à la porte en question une clef) et que celle-ci ne peut dès lors pas être crochetée, il est toutefois possible de l'ouvrir via un sort (une bête Ouverture d'Ondusi fait l'affaire).

Il en va d'ailleurs de même si la porte est verrouillée avec une valeur négative (j'ai essayé avec -1, mais je pars du principe qu'avec -100, ça ferait tout pareil).

La seule différence entre les deux systèmes me semble être que si on verrouille une porte avec zéro on ne voit pas de témoin négatif.
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#8 Orann

Orann

    Nérévarine de Pertevue


Posté 11 mai 2009 - 20:56

Merci de cette précision NQD, je n'avais jamais testé avec un sort d'ouverture :cry:
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#9 Not Quite Dead

Not Quite Dead

    Rincevent


Posté 11 mai 2009 - 21:11

Il fallait y penser. :cry:







De rien. :(
« I was a soldier! I killed people!
- You were a doctor!
- I had bad days! »
John Watson, en train d'étrangler Sherlock Holmes, Sherlock - A Scandal in Belgravia (2012)
---------------
Vous aussi rejoignez les Fervents Partisans de l'Immuabilité Avatarienne!
---------------
VGM impénitent (était-il besoin de le préciser?)
---------------
Paterfamilias niv.IV

#10 elendell

elendell

    Mécano Dell'Arte


Posté 12 mai 2009 - 02:42

Voila une précision effectivement utile et qui en plus peut servir dans une quête. Une porte qui ne peut s'ouvrir que par magie alors que même avec un talent de sécurité au maximum, on ne peut l'ouvrir...  :cry:

#11 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 18 mai 2009 - 07:23

mais une porte avec une valeur négative de serrure, pourra-t-elle s'ouvrir avec la clé correspondante ? ou bien, c'est totalement impossible, sauf avec un unlock ?

#12 elendell

elendell

    Mécano Dell'Arte


Posté 18 mai 2009 - 14:57

J'ai voulu essayer mais chez moi, il est impossible de donner une valeur négative à une serrure.  :oops:

Ecrire un moins est refusé et si je copie/colle un nombre négatif, ça se remet à 0 quand je ferme la fenêtre... Heu... la porte.... Mince, la fenêtre de la porte je veux dire !

#13 Orann

Orann

    Nérévarine de Pertevue


Posté 18 mai 2009 - 17:26

Je viens de faire un test, et effectivement, ça ne fonctionne que si on attribut la valeur négative par script. :oops:
Palme d'honneur 2010 pour le mod Archipel de Pertevue

Entamez votre voyage vers l'Archipel de Pertevue ! Test communautaire en cours.

#14 elendell

elendell

    Mécano Dell'Arte


Posté 18 mai 2009 - 18:51

Ha ! Voila donc comment on fait... Merci Orann.  :blue:

Donc, pour répondre à Snaïpe puisque j'ai pu donner une valeur négative (avec la console), la clef ouvre la porte dans tous les cas.

Avec un "lock" négatif, elle est ensuite marquée "déverrouillée" alors qu'avec un "lock" à 0, le fait qu'elle soit ensuite déverrouillée n'est pas indiqué sur la porte. D'ailleurs, je n'ai pas pensé à vérifier mais je ne suis pas sûr qu'une fois qu'on l'a ouverte avec la clef, il soit possible ensuite de l'ouvrir sans la clef (ou un sort).

#15 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 19 mai 2009 - 21:28

donc en y pensant, les valeurs négatives pourraient êtres comme les portes verrouillées 100 dans Oblivion. c'est à expérimenter, je verrait si la fonction n'a pas (trop) de contraintes :)

Modifié par Snaïpe, 19 mai 2009 - 21:29.


#16 elendell

elendell

    Mécano Dell'Arte


Posté 19 mai 2009 - 21:51

Ça fait quoi une porte verrouillée à 100 dans Oblivion ?

#17 Snaïpe

Snaïpe

    ...itset tnus otroh nI


Posté 20 mai 2009 - 06:39

pardon :mrgreen:

une porte verrouillée a 100 dans oblivion est impossible a crocheter sans la clé. c'est un paramétrage qui agit de la même façon qu'un "If ( OnActivate )/MessageBox/return/endif" :)

#18 Infomase

Infomase

Posté 24 juin 2009 - 00:24

Et quand on y pense, on peut remplacer ce script :
Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
	Return
endif

if ( GetLocked == 0 )
	Lock 100
	MessageBox "La serrure résiste à tous vos efforts !"
endif

End
Par celui-ci :
Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
 Return
endif

if ( OnActivate )
 MessageBox "La serrure résiste à tous vos efforts !"
endif

End
Mais, comme il a été si justement remarqué, pourquoi donc faire simple quand on peut faire compliqué ?
<?php echo="Codeur en carton-pâte" ?>

#19 elendell

elendell

    Mécano Dell'Arte


Posté 24 juin 2009 - 01:04

Voir le messageInfomase, le 24.06.2009 à 01:23, dit :

Et quand on y pense, on peut remplacer ce script :
Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
	Return
endif

if ( GetLocked == 0 )
	Lock 100
	MessageBox "La serrure résiste à tous vos efforts !"
endif

End
Par celui-ci :
Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
 Return
endif

if ( OnActivate )
 MessageBox "La serrure résiste à tous vos efforts !"
endif

End

Non, on ne peut pas :

Voir le messageelendell, le 09.05.2009 à 12:25, dit :

Avec un script, on peut aussi la condamner sans avoir besoin de la "relocker" à chaque fois (avec "if (OnActivate")) mais je pense que l'auteur a fait ce choix à cause de l'histoire. La porte est censée avoir une serrure incrochetable mais qui sera ouverte ensuite par quelqu'un qui a la clef.

En fait, le script fait "unlock" le moment venu et on ne voit jamais cette clef mais je présume que cela faisait plus crédible pour l'auteur qu'elle ait une valeur de fermeture qui passera ensuite à 0.

Quand à la deuxième porte, le même PNJ est censé la verrouiller puis, casser la clef dans la serrure. Il fallait donc qu'elle ait une valeur de fermeture positive que le joueur peut voir (je présume, bien sûr).


#20 Infomase

Infomase

Posté 24 juin 2009 - 01:13

Voir le messageelendell, le 09.05.2009 à 12:25, dit :

Avec un script, on peut aussi la condamner sans avoir besoin de la "relocker" à chaque fois (avec "if (OnActivate")) mais je pense que l'auteur a fait ce choix à cause de l'histoire. La porte est censée avoir une serrure incrochetable mais qui sera ouverte ensuite par quelqu'un qui a la clef.

En fait, le script fait "unlock" le moment venu et on ne voit jamais cette clef mais je présume que cela faisait plus crédible pour l'auteur qu'elle ait une valeur de fermeture qui passera ensuite à 0.

Quand à la deuxième porte, le même PNJ est censé la verrouiller puis, casser la clef dans la serrure. Il fallait donc qu'elle ait une valeur de fermeture positive que le joueur peut voir (je présume, bien sûr).

Alors, un script de ce style devrait fonctionner :
Begin nenPortePrisonPlayerScript

if ( "nen_DelinOran".greet >= 2 )
 Return
endif

if ( GetJournalIndex "nomDeMaQuete" < 1 )
 if ( OnActivate )
  MessageBox "La serrure résiste à tous vos efforts !"
 endif
elseif ( GetJournalIndex "nomDeMaQuete" == 1 )
 if ( GetDistance "LePnjQuiALaCle" <= 300 )
  "LePnjQuiALaCle"->AiTravel, [i]localisation de la porte[/i]
  journal "nomDeMaQuete" 2
 endif
elseif ( GetJournalIndex "nomDeMaQuete" == 2 )
 "LePnjQuiALaCle"->AiActivate "maPorte"
 journal "nomDeMaQuete" 3
elseif ( GetJournalIndex "nomDeMaQuete" >= 3 )
 if ( OnActivate )
  Activate
 endif
endif

End
Un peu plus gros mais gère tout en un seul script.
<?php echo="Codeur en carton-pâte" ?>

#21 elendell

elendell

    Mécano Dell'Arte


Posté 24 juin 2009 - 01:45

Non plus car si on active une porte "lockée", ça ne l'ouvre pas. Je n'ai pas vérifié mais je ne vois pas pourquoi un PNJ pourrait ouvrir une porte fermée sans "Unlock" alors que le PJ ne le peut pas. En réalité, cette clef n'existe pas et le PNJ ne l'a donc pas et je présume que si l'auteur n'a pas utilisé "AiActivate" en donnant une clef au PNJ, c'est parce que cette fonction est "buguée" sans Tribunal.

Mais de toutes façons le but de ce sujet est de donner des infos sur des particularités de la fonction "GetLocked" et éventuellement "Lock" et "Unlock" qui sont liées et pas de proposer d'autres manières de "scripter" l'ouverture d'une porte.

Par ailleurs, les scripts présentés qui m'ont fait relever le bug de la fonction sont issus d'un "mod" qui n'est pas le mien. J'ai corrigé ce passage du "mod" mais en tant que correcteur, je fais le moins de changements possibles et en respectant les choix de l'auteur.
Dans ce cas, il m'a fallu tenir compte de tous les autres scripts du "mod", des entrées de journal et quêtes existantes, des actions du "PNJsenséavoirlaclef", du fait que le "mod" n'est pas Tribunal requis et du fait que les serrures devaient indiquer des valeurs de fermeture visibles qui doivent changer à divers moments de la quête.

Mais si le sujet des différentes manières de "scripter" les ouvertures et fermetures de portes t'intéresse, tu peux en faire un à cette intention...

#22 abg

abg

    L'ABG pour les civilisés


Posté 24 juin 2009 - 10:10

Voir le messageelendell, le 24.06.2009 à 02:44, dit :

Non plus car si on active une porte "lockée", ça ne l'ouvre pas. Je n'ai pas vérifié mais je ne vois pas pourquoi un PNJ pourrait ouvrir une porte fermée sans "Unlock" alors que le PJ ne le peut pas. En réalité, cette clef n'existe pas et le PNJ ne l'a donc pas et je présume que si l'auteur n'a pas utilisé "AiActivate" en donnant une clef au PNJ, c'est parce que cette fonction est "buguée" sans Tribunal.

Tribunal ou pas AIActivate est boguée, je n'ai jamais réussi à utiliser correctement cette fichue fonction...
Toutefois les PNJs peuvent activer des portes (non "loaddoor") et ils ouvrent les verrouillées s'ils en possèdent la clef et qu'elles ne sont pas piégées (si piège il y a ils n'essayent même pas). Ils ne le font pas en temps normal et en mode "AIWander" mais se mettent à le faire en mode combat ou en mode AIFollow ou AIEscort (AITravel ? il me semble que non mais à vérifier).
Dans le cas d'un script If (OnActivate) qui bloque la porte, je me souviens d'un PNJ compagnon qui essayait en pure perte d'ouvrir une porte (à ouvrir à l'explosif) ajoutée par le mod A.Qynn. Ça provoquait l'envoi de messagebox en cascade m'informant qu'il me fallait des explosifs !

Modifié par abg, 24 juin 2009 - 10:11.

Antoninus Bibulus Glaber
Coaching de PNJs chez Morrowind Renaissance




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

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