Une clef multiserrure (avec plusieurs tags de serrure)

Répondre
Partager Rechercher
Bonjour à tous^^, voila je rencontre un petit problème au niveau des serrures.

Je compte réaliser une hiérarchie par exemple dans une guilde (voleur, assassin, maître assassin...). Ensuite à chacune de ces étapes, un objet diffèrent est donné (clef par ex), qui permet de passer par des portes. Ca pose pas de problème à première vue ce que je veux dire, car pour le niveau voleur une clef 1, un tag de serrure A. Niveau assassin, une clef 2, un tag de serrure B. Niveau Maitre assassin, une clef 3, un tag de serrure C. Mais en sachant que le Maitre Assassin ne dispose que de la clef 3 (pas celle de niv 1, ni de 2), il ne pourra ouvrir donc que les serrures C. Pas les B et les A. Ce que je veux c'est que la clef 1 est un tag de serrure A, la clef 2, un tag de serrure B, mais aussi A. La clef 3, un tag de serrure C, B et A.

Il me faudrait donc pour la clef 2 et la clef 3, plusieurs tags de serrures inclut dedans. Je me doute qu'il doit y a voir un script possible à mettre dans la clef, mais hélas je ne sais pas comment je pourrais faire. Des idées ?
Code PHP:

// Sur le OnFailToOpen de la porte qui peu etre ouvert par les 3 niveau de clef
void main()
{
object oPJ GetClickingObject();
object oSelf OBJECT_SELF;
string sClef1 "Tag Clef A";
string sClef2 "Tag Clef B";
string sClef3 "Tag Clef C";

if((
GetItemPossessedBy(oPJ,sClef1)!= OBJECT_INVALID)
 ||(
GetItemPossessedBy(oPJ,sClef2)!= OBJECT_INVALID)
 ||(
GetItemPossessedBy(oPJ,sClef3)!= OBJECT_INVALID))
    {
    
SetLocked(oSelf,FALSE);
    
AssignCommand(oSelf,ActionOpenDoor(oSelf));
    
DelayCommand(10.0,AssignCommand(oSelf,ActionCloseDoor(oSelf)));
    
DelayCommand(10.0,SetLocked(oSelf,TRUE));
    }

Code PHP:

*a deja vu une question comme ca quelque part  
Ah bon !
Hum oui t'as raison
J'vais pas tout te redire alors, car je te fais faire du boulot en double

Ah si quand même, j'allais oublié l'essentiel Tyrion

MERCI Beaucoup Beaucoup^^

Et c'est pas des paroles en l'air
Moui j'aurais plutot fait un truc avec un tag genre nomdulieuxxxxx, ou les xp auraient pris la valeur 0 ou 1 suivant que la clé pouvait ouvrir telle ou telle porte. C'est a mon avis plus évolutif si on souhaite rajouter des niveaux d'accès, ca permet de ne pas avoir a modifier les scripts.

La clé de niveau 1 aurait par exemple comme tag guildevoleur100, celle de niveau 2 guildevoleur110 et celle de niveau 3 guildevoleur111, ensuite on joue avec les GetStringLeft.
Citation :
Provient du message de Zunder
Moui j'aurais plutot fait un truc avec un tag genre nomdulieuxxxxx, ou les xp auraient pris la valeur 0 ou 1 suivant que la clé pouvait ouvrir telle ou telle porte. C'est a mon avis plus évolutif si on souhaite rajouter des niveaux d'accès, ca permet de ne pas avoir a modifier les scripts.

La clé de niveau 1 aurait par exemple comme tag guildevoleur100, celle de niveau 2 guildevoleur110 et celle de niveau 3 guildevoleur111, ensuite on joue avec les GetStringLeft.
Je me suis pas amusé a faire ceci j'y avais pensé mais je me suis dis "Hum... Faire plus simple ce serais quand même plus facile a comprendre pour les debutant "
J' en demande peut être un peu trop, mais a quoi ressemblerais le deuxième script, en supposant que je sois capable de le comprendre et de l'appliquer (simple supposition bien sûr)
C'est en maniant le tag de la clef avec ca

Code PHP:

string sPorte,sClef;
string sLeft GetStringLeft(sPorteFindSubString(sPorte,"_"));
string sRight GetStringRight(sClefFindSubString(sClef,"_")); 
pas le temps de faire le script je suis assez occupe en ce moment
Pas de problème Tyrion

Je vais essayer de voir les fonctions que tu m'as mis, mais je promet rien, car je suis une quiche en script, mais ça tu le sais déjà

Et je sais que si t'as pas le temps, c'est parce que tu nous pond une fois de plus une autre jolie petite merveille de script^^ ^^
Post
Basé sur les idées de Tyrion et Zunder, cela pourrait donné ceci :

3 Portes :

Porte guilde voleurs, en intrigue (plot), verrouillé (locked) et tag : DOOR_100

Porte guilde assassins, en intrigue (plot), verrouillé (locked) et tag : DOOR_110

Porte guilde maître assassins, en intrigue (plot), verrouillé (locked) et tag : DOOR_111

3 Clefs :

Clef voleur, tag : CLE_100
Clef assassin, tag : CLE_110
Clef maitre assassin, tag : CLE_111

Script :
Code PHP:


// a mettre dans OnFailToOpen de chacune des portes

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_


    
if(GetItemPossessedBy(oPC,"cle_100") != OBJECT_INVALID)
    {
        if (
sKey == "100")
            
OpenGuilde();
    }

    if(
GetItemPossessedBy(oPC,"cle_110") != OBJECT_INVALID)
    {
        if ((
sKey == "100") || (sKey == "110"))
            
OpenGuilde();
    }

    if(
GetItemPossessedBy(oPC,"cle_111") != OBJECT_INVALID)
    {
        if ((
sKey == "100") || (sKey == "110") || (sKey == "111"))
            
OpenGuilde();
    }


Autre version que j'avais faite mais qui ne marche pas
plus intéressante à mon avis :

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 currentItem firstItem;

   
    if(
GetIsObjectValid(currentItem)) // Au moins un objet dans l'inventaire
    
{
        do
        {
          
string sItem GetTag(currentItem);  // 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,"_") - 1);  // on recupere ce qu'il y a apres CLE_ dans le tag sItem

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

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

                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
            
currentItem GetNextItemInInventory(oPC);
        
// on boucle tant qu'il y a des items dans l'inventaire
        
}while(GetIsObjectValid(currentItem));
     }

    else
    {
        
SpeakString"Vous avez besoin d'une cle...");
    }

oUAH Génial^^
J'avoue j'avais pas encore commencé à me prendre la tête dessus que déjà voila une réponse à mon problème. Merci les gars
C'est vrais que cette méthode me plais d'autant mieux que je ne possède pas que trois ordres, et que je n'ai pas qu'une guilde. C'etait pour l'exemple. Je comptais utilisé ce système pour d'autres applications en plus. Et avec tout ces tags j'aurais fini pas faire une overdose je crois
A trois, vous avez comblé mes lacunes, je vous en suis infiniment reconnaissant.

C'est coOOol

Hélas je peux pas vraiment t'aider pour ton deuxième script, mais compétences étant... quelque peu ... limité
Pour ton deuxieme script ben en fait je ne comprend pas tres bien tu sais qu'un while est pour une bou, et un do aussi ?

parce que la ligne while ... ne sert a rien ici

Voila qui devrais aller uun peu mieux (je n'est pas tout verifié)

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);

  while(
GetIsObjectValid(firstItem))
    {
          
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,"_") - 1);  // 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
            
firstItem GetNextItemInInventory(oPC);
    }

Post
J'ai fait un Tutorial sur les scripts, extrait :

do instructions while ( condition );

Dans ce type de boucle, le code est d'abord exécuté (même si la condition est fausse) et la condition est ensuite vérifiée.

-----------------------

J'ai essayé ton script, cela ne marche pas non plus
je ne comprends pas pourquoi
Apparement vous êtes pas d'accord sur le While. J'peux pas vous aider. Moi j'voulais juste savoir ce qu'apportais de plus ton deuxième script par rapport au premier ?

J'vois bien qu'ils se ressemblent pas complètement, mais concrètement je vois pas trop
Post
Mon but :

Dans le premier, on a dans le script en dur le nom de la clé avec des instructions du type :
Code PHP:

GetItemPossessedBy(oPC,"cle_110"
Dans le deuxieme, je voulais faire un truc plus évolué, en scrutant l'inventaire pour chercher si des objets de tag commençant par CLE_ s'y trouve.
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);

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
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);

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.
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?
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
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.........
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
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 ?
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés