JeuxOnLineForumsPlusConnectés : 710 (sites) | 1305 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Une clef multiserrure (avec plusieurs tags de serrure) RSS
   
Répondre
Partager Outils Rechercher
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Je me suis penché de nouveau sur ce script, cela fonctionne cette fois ci :

Code PHP:
void OpenGuilde()
{
    
SetLocked(OBJECT_SELF,FALSE);

    
AssignCommand(OBJECT_SELF,ActionOpenDoor(OBJECT_SELF));

    
DelayCommand(10.0,AssignCommand(OBJECT_SELF,ActionCloseDoor(OBJECT_SELF)));

    
DelayCommand(10.0,SetLocked(OBJECT_SELF,TRUE));
}

void main()
{
  
object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sKey GetStringRight(sDoorFindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_

  
object firstItem GetFirstItemInInventory(oPC);
  
object nextItem firstItem;

    do
    {
          
string sItem GetTag(firstItem);  // on recupere le tag de l'item

          
string s1 GetStringLeft(sItem4); // on obtient les 4 premiers caracteres du tag sItem

          
if(s1 == "CLE_")  // si cela correspond a un item avec un tag commencant par CLE_
            
{
                
string s2 GetStringRight(sItemFindSubString(sItem,"_"));  // on recupere ce qu'il y a apres CLE_ dans le tag sItem

                
if ((s2 == "100") && (sKey == "100"))
                    
OpenGuilde();

                else if ((
s2 == "110") && ((sKey == "100") || (sKey == "110")))
                    
OpenGuilde();

                else if ((
s2 == "111") && ((sKey == "100") || (sKey == "110") || (sKey == "111")))
                    
OpenGuilde();

                break; 
//on sort de la boucle puisque la clef a ete trouve
            
}

            
// Passage a l'item suivant
            
nextItem GetNextItemInInventory(oPC);

    }while(
GetIsObjectValid(nextItem) && nextItem != firstItem);

Lien direct vers le message - Vieux
Avatar de Damonya
Damonya
Dauphin
 
Avatar de Damonya
 
sérieux ??
T'es trop fort aldech (ca manque de smileys pour dire qu'on est content ou joyeux ici )

Grâce à ton script encore moins besoin de se prendre la tête donc. C'st tout simplement génial, car j'ai bcp d'endroit où ça pourra servir
MERCI MERCI

PS : c'etait donc le while qui posait probleme ?
a propos a quoi il sert le While, je m'en suis encore jamais servis
Lien direct vers le message - Vieux
Avatar de Tyrion
Tyrion
Roi
 
Avatar de Tyrion
 
Ca fsert a gfaire une boucle pour par exemple recherche un objet dans un inventaire en regardant objet par objet
Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Post
Je viens de m'apercevoir d'une erreur dans le script (première ligne de la boucle après le do), voici la correction :

Code PHP:
void OpenGuilde()
{
    
SetLocked(OBJECT_SELF,FALSE);

    
AssignCommand(OBJECT_SELF,ActionOpenDoor(OBJECT_SELF));

    
DelayCommand(10.0,AssignCommand(OBJECT_SELF,ActionCloseDoor(OBJECT_SELF)));

    
DelayCommand(10.0,SetLocked(OBJECT_SELF,TRUE));
}

void main()
{
  
object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sKey GetStringRight(sDoorFindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_

  
object firstItem GetFirstItemInInventory(oPC);
  
object nextItem firstItem;

    do
    {
          
string sItem GetTag(nextItem); // on recupere le tag de l'item

          
string s1 GetStringLeft(sItem4); // on obtient les 4 premiers caracteres du tag sItem

          
if(s1 == "CLE_")  // si cela correspond a un item avec un tag commencant par CLE_
            
{
                
string s2 GetStringRight(sItemFindSubString(sItem,"_"));  // on recupere ce qu'il y a apres CLE_ dans le tag sItem

                
if ((s2 == "100") && (sKey == "100"))
                    
OpenGuilde();

                else if ((
s2 == "110") && ((sKey == "100") || (sKey == "110")))
                    
OpenGuilde();

                else if ((
s2 == "111") && ((sKey == "100") || (sKey == "110") || (sKey == "111")))
                    
OpenGuilde();

                break; 
//on sort de la boucle puisque la clef a ete trouve
            
}

            
// Passage a l'item suivant
            
nextItem GetNextItemInInventory(oPC);

    }while(
GetIsObjectValid(nextItem) && nextItem != firstItem);

Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Post
Pour répondre à Damonya, le problème ne venait pas du While
(Tyrion avait bon aussi) mais de cette ligne :
Code PHP:
string s2 GetStringRight(sItemFindSubString(sItem,"_")); 
qui était auparavant :
Code PHP:
string s2 GetStringRight(sItemFindSubString(sItem,"_") - 1); 
Mais un truc m'échappe encore, pourquoi au dessus, je suis obligé de faire ceci :
Code PHP:
string sKey GetStringRight(sDoorFindSubString(sDoor,"_") - 1); 
pour récupérer ce qu'il y a après le "_" alors que dans les deux cas c'est la même chose que je cherche à faire.
Lien direct vers le message - Vieux
Avatar de Damonya
Damonya
Dauphin
 
Avatar de Damonya
 
Merci tyrion, comme toujours tu es celui qui m'append bcp de choses sur les scripts. Ce que je sais, je te le dois en grande partie. Aldech je te dois beaucoup aussi, car ce script est essentiel à mon module

Mais...
J'comprend pas ça marche pas
J'ai juste remplacé CLE_ par CLEASSA_
et la ligne : string s1 = GetStringLeft(sItem, 4); // on obtient les 4 premiers caracteres du tag sItem.
J'ai remplacé 4 par 8 donc. Anisi que la ligne juste avant comme tu as dis. J'ai bien mis comme tag pour les portes DOOR_100 par exemple et pour la clef donc CLEASSA_100 . Mais impossible d'ouvrir la porte


J'vais réessayer exactement comme toi pour voir sans rien changer dans le script.


EDIT : Bah j'ai réésayer ton script sans rien changer, mais ça veux pas marcher. C'est bizare. Ca marche chez toi Aldech?
Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Je viens de tester, effectivement, je comprends pas bien, le résultat dans ton cas de :
Code PHP:
string s1 GetStringLeft(sItem8); 
avec la cle de tag CLEASSA_100, cela donne : SSA_100

alors que cela devrait logiquement donné : CLEASSA_

Je suis perplexe.


EDIT : Chez moi cela marche sans rien modifier
Lien direct vers le message - Vieux
Avatar de Damonya
Damonya
Dauphin
 
Avatar de Damonya
 
Bon alors moi je comprend de moins en moins bien tout ça : voila en gros le script que je met à partir du tiens :
Code PHP:
void OpenGuilde()
{
    
SetLocked(OBJECT_SELF,FALSE);

    
AssignCommand(OBJECT_SELF,ActionOpenDoor(OBJECT_SELF));

    
DelayCommand(3.0,AssignCommand(OBJECT_SELF,ActionCloseDoor(OBJECT_SELF)));

    
DelayCommand(3.0,SetLocked(OBJECT_SELF,TRUE));
}

void main()
{
  
object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sKey GetStringRight(sDoorFindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_

  
object firstItem GetFirstItemInInventory(oPC);
  
object nextItem firstItem;

    do
    {
          
string sItem GetTag(nextItem); // on recupere le tag de l'item

          
string s1 GetStringLeft(sItem8); // on obtient les 4 premiers caracteres du tag sItem

          
if(s1 == "CLEASSA_")  // si cela correspond a un item avec un tag commencant par CLE_
            
{
                
string s2 GetStringRight(sItemFindSubString(sItem,"_"));  // on recupere ce qu'il y a apres CLE_ dans le tag sItem

                
if ((s2 == "1000") && (sKey == "1000"))
                    {
OpenGuilde();}

                else if ((
s2 == "1100") && ((sKey == "1000") || (sKey == "1100")))
                    {
OpenGuilde();}

                else if ((
s2 == "1110") && ((sKey == "1000") || (sKey == "1100") || (sKey == "1110")))
                    {
OpenGuilde();}

                else if ((
s2 == "1111") && ((sKey == "1000") || (sKey == "1100") || (sKey == "1110") || (sKey == "1111")))
                    {
OpenGuilde();}
                break; 
//on sort de la boucle puisque la clef a ete trouve
            
}

            
// Passage a l'item suivant
            
nextItem GetNextItemInInventory(oPC);

    }
    while(
GetIsObjectValid(nextItem) && nextItem != firstItem);

Donc j'ai rajouté des { } après les if else, même si ca sert à rien, j'aime bien être prudent (on m'a toujours dis dans mettre à chaque fois ici)
J'ai ajouté une ligne car j'ai 4 portes (donc 1000)
et j'ai changer CLE_ en CLEASSA_

Ca marche pas avec CLE_ ou avec CLEASSA_ comme on a dis avant
Ca marche pas avec les {} ou sans
Ca marche pas avec 1000 apparement non plus. Si ca marche chez toi avec 3 portes, le même script avec 4 portes ne marche pas. C de plus en plus bizare tout ça.
Bon il me reste à tester ton script exactement comme toi, mais ça m'arange pas car je veux vraiment 4 portes


me pliiiiiiiiiiiize

EDIT : c'est bien dans le OnFailToOpen ?
j'vais poser la question sur un autre forum pour voir. Tyty à l'aide.........
Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Post
J'ai modifié pour ton cas de 4 portes :

Code PHP:

void OpenGuilde
()
{
    
SetLocked(OBJECT_SELF,FALSE);

    
AssignCommand(OBJECT_SELF,ActionOpenDoor(OBJECT_SELF));

    
DelayCommand(3.0,AssignCommand(OBJECT_SELF,ActionCloseDoor(OBJECT_SELF)));

    
DelayCommand(3.0,SetLocked(OBJECT_SELF,TRUE));
}

void main()
{
  
object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sKey GetStringRight(sDoorFindSubString(sDoor,"_")); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_
  
object firstItem GetFirstItemInInventory(oPC);
  
object nextItem firstItem;

    do
    {
          
string sItem GetTag(nextItem); // on recupere le tag de l'item

          
string s1 GetStringLeft(sItem8); // on obtient les 8 premiers caracteres du tag sItem

          
if(s1 == "CLEASSA_")  // si cela correspond a un item avec un tag commencant par CLEASSA_
            
{
                
string s2 GetStringRight(sItemFindSubString(sItem,"_") - 3);  // on recupere ce qu'il y a apres CLEASSA_ dans le tag sItem

                
if ((s2 == "1000") && (sKey == "1000"))
                    {
OpenGuilde();}

                else if ((
s2 == "1100") && ((sKey == "1000") || (sKey == "1100")))
                    {
OpenGuilde();}

                else if ((
s2 == "1110") && ((sKey == "1000") || (sKey == "1100") || (sKey == "1110")))
                    {
OpenGuilde();}

                else if ((
s2 == "1111") && ((sKey == "1000") || (sKey == "1100") || (sKey == "1110") || (sKey == "1111")))
                    {
OpenGuilde();}
                break; 
//on sort de la boucle puisque la clef a ete trouve
            
}

            
// Passage a l'item suivant
            
nextItem GetNextItemInInventory(oPC);

    }
    while(
GetIsObjectValid(nextItem) && nextItem != firstItem);

Chez moi cela marche, par contre j'ai pas compris pourquoi c'est une histoire de fou
Lien direct vers le message - Vieux
Avatar de Damonya
Damonya
Dauphin
 
Avatar de Damonya
 
ah bah j'vois que t'as édité ton script, car je me demandais pourquoi tu avais rajouter des lignes montrant les tags de portes et de clefs quand on joue.
En tout cas ça marche au poil maintenant, mais j'vois pas tres bien ce que tu as changé dedans maintenant que tu as édité ton script
En tout cas Merci quoi que ce soit
Bon je rééssaye une dernière fois sans les commentaires sur les tags^^




EDIT : Donc j'ai réésayer ton dernier script edité (sans les commentaires) et devine quoi.......... CA MARCHE CA MARCHE Enfin. Mais imaginons que je veuille une 5 ème porte, j'ai juste à rajouter 11111 et une ligne comme précedament. rien d'autre non ?
Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Post
Avant d'aller faire dodo, en fait j'ai modifié les deux lignes suivantes commençant par :

string sKey = ...

string s2 = ...

Autrement les lignes que j'avais rajouté, c'était pour faire
les tests, pour voir le résultat des commandes sur les tags
en cours de jeu, cela aide des fois.

Bonne nuit :baille:
Lien direct vers le message - Vieux
Avatar de Damonya
Damonya
Dauphin
 
Avatar de Damonya
 
Ok je comprend mieux alors. Un repos bien mérité. Le script fonctionne à merveille. Bonne nuit Aldech et MERCI encore, car j'ai cru qu'on allait devenir fou. Enfin surtout toi je pense, car moi j'ai rien fait en fait dans cette histoire juste quémander et râler

Le sujet est je pense clos maintenant grâce à toi, car je pense pas que l'on puisse faire mieux que ça comme script. Il est tout simplement (euh compliquement plutôt ) parfais.
salut^^
Lien direct vers le message - Vieux
Garrath
Alpha & Oméga
 
Ben je pense qu'on peut faire bien mieux de plein de façon differentes mais la plus simple est de faire ainsi a mon avis

deja pour faire un truc qui marche par tout avec le meme code c de chercher le tag de la cle en fonction du tag de la porte donc prendre la partie gauche du tag de la porte dela guilde des voleurs par exemple comme cela
Tag de la porte VOLEUR_XXXX
je reviendrais sur les XXXX apres

donc je verrais bien un truc du style

Code PHP:
object oPC GetClickingObject();
  
string sDoor GetTag(OBJECT_SELF);
  
string sGuilde GetStringLeftRight(sDoorFindSubString(sDoor,"_") );
  
string sKeyToFind "CLE" sGuilde "_"


Ce qui fait que dans la boucle de test sur la cle on fait la comparaison sur sKeyToFind et non plus sur une valeur en dure...

Bon ca c'est le premier truc

Maitenant sur le XXXX
Je vois plusieurs au moins 2 possibiltes pour ne plus avoir qu'un seul et unique test a l'interieure de la boucle.
- Une possibilite qui fait qu'il faut connaitre le binaire c-a-d qu'il faut reussir a transformer le 110 sans se tromper en valeur decimale etc... pour ensuite faire un seuk et unique test en binaire avec le & (operateur de comparaison de bit)
en gros dans le cas ici tu considere une porte avec la chaine 100
et une cle 110
le but est de traduire 100 en decimal, sauf erreur de ma part cela fait 4
pareil pour 110 cela 6
donc on a une porte qui s'appelle VOLEUR_4 et une cle qui s'appelle CLEVOLEUR_6
on recupere les 2 chaines de caractere a droite du "_"
on les passes en int

Le code apres le test sur la cle devient donc un truc du style
Code PHP:
string sAutorisationCle GetStringRight(sItemFindSubString(sItem,"_") - 1);  // on recupere ce qu'il y a apres CLEVOLEUR_ 
string sAutorisationPorte GetStringRight(sDoorFindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_


int icle StringToInt(sAutorisationCle);
int iporte StringToInt(sAutorisationPorte);

if (
icle iporte)
{
     
OpenGuilde();



- Une autre possibilite qui est hyper simple c'est de mettre tout a l'envers (a noter dans la possibilte au dessus ca marche dans les 2 sens ) par rapport a la notation prise sur les codes au dessus pour les autorisation de porte
par exemple la premier niveau de porte c'est pas 1000 mais 0001
le 2nd c'est pas 0100 mais 0010, le troisieme c'est pas 0010 mais 0100 et le 4eme c'est pas 0001 mais 1000
Et donc du coup facile si la cle qui ouvre le 4eme niveau doit ouvrir aussi le 1er, 2nd, le 3eme c'est facile car 1000 >= 0001 (pour le 1er lvl)
1000 >= 0010 (pour le 2nd lvl)
1000 >= 0100 (pour le 3eme lvl)
1000 >) 1000 (pour le 4eme lvl)
ce qui nous donne un code bien facile

Code PHP:
string sAutorisationCle GetStringRight(sItemFindSubString(sItem,"_") - 1);  // on recupere ce qu'il y a apres CLEVOLEUR_ 
string sAutorisationPorte GetStringRight(sDoorFindSubString(sDoor,"_") - 1); // on recupere dans le tag de la porte ce qu'il y a apres le DOOR_


int icle StringToInt(sAutorisationCle);
int iporte StringToInt(sAutorisationPorte);

if (
icle >= iporte)
{
     
OpenGuilde();



Voila bon la premiere solution fait jouer les masques binaires ce qui veut dire qu'on peut reussir a faire des trucs assez complexes du style une porte 0100 une 0010 une 1000 et une cle qui ne peut ouvrir que la 3eme et la 2nd donc la cle aura 1010 sans ouvrir la 1ere
Alors qu'avec la 2 eme solution c'est assez basique tu suis absolument les niveaux
Lien direct vers le message - Vieux
Avatar de aldech
aldech
Dauphin
 
Avatar de aldech
 
Merci, c'est vrai que c'est beaucoup plus simple !
Lien direct vers le message - Vieux
Garrath
Alpha & Oméga
 
lol

Parce que ce qui est simple ne se voit pas toujours du premier coup tiens regarde encore plus simple
CLEVOLEUR_1 pour ouvrir les portes de la guilde voleur du 1er niveau
CLEVOLEUR_2 pour ouvrir celle du premier et 2nd
CLEVOLEUR_3 pour toutes les portes du lvl 1 a 3
etc...

avec le meme test que la 2nd solution c'est encore plus simple et en plus t'es pas oblige de prevoir un nombre de chiffre correspondant a un nombre de niveau....
tu peux avoir CLEVOLEUR_12 si tu veux 12 niveaux d'autorisation de porte dans ta guilde...

pfuuut ce qui est simple ne se voit pas forcement du premier coup

euh la maintenant plus simple que cela je vois pas
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Une clef multiserrure (avec plusieurs tags de serrure)
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 23h25.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite