Comment faire disparaitre une porte secrète ?

Répondre
Partager Rechercher
Bonjour,

je cherche à faire disparaitre (au bout d'un certain temps) les portes secrètes qui ont été détectées par des joueurs (afin que celles ci ne restent pas apparentes lorsque de nouveau joueurs arrivent).

Je sais qu'il y a eu par le passé un topic sur le sujet mais j'ai pas réussi à le retrouver.

Avez vous une idée ?

Merci.

a+
Si tu utilise le script de base tu peux aussi lancer le DestroyObject via le OnSpawn de la porte qui apparaît. Pense a mettre un int sur l'objet invisible pour lui spécifier si la porte est visible ou si elle est cachée.
En fait j'utilise le script nw_o2_dtwalldoor.

La destruction de la porte se fait bien en ajoutant le Destroy Object mais ensuite il est plus possible de détecter à nouveau la porte secrète.
Citation :
Publié par Fantome
En fait j'utilise le script nw_o2_dtwalldoor.
La destruction de la porte se fait bien en ajoutant le Destroy Object mais ensuite il est plus possible de détecter à nouveau la porte secrète.
C'est pour ca qu'il faut que tu regardes le script qui fait apparaitre la porte, et que tu inverse les Token quand tu détruits ta porte.
Ce qu'il se passe pour le moment, c'est que quand l'objet invisible detecte que la porte secrète est trouvée, il la crée, et se mets un flag dessus pour ne plus crée d'autres porte par dessus la première.
Toi il faudra donc que tu permettes a cet objet de recréer des portes secrètes en supprimant son flag "trouvé".
Tu devrais mettre un déclencheur générique au sol, testant la compétence "Fouille" du personnage y entrant (évènement "OnEnter"), et faisant apparaître la porte à un point de passage dédié. Bien sûr, la surface du déclencheur générique sera relativement petite (pas trop non plus) selon la difficulté de la détéction.

Une option si tu ne veux pas surcharger ton module de points de passages, tu peux placer ta porte dans l'éditeur, regarder sa position, effacer la porte, et rajouter sur le déclencheur générique
- Quatres variables de type "float", dont les valeur seraient respectivement les valeurs X, Y, Z, et l'orientation, ce qui te permettra de créer une position pour la création.
- Une variable de type "string" dont la valeur serait le ResRef de ladite porte à faire apparaître.
- Une variable de type "int" définissant le DD pour détecter la porte.

J'utilise cette méthode, et je n'ai aucune raison de m'en plaindre ^^
Code PHP:

void main()
{
    
object oSelf OBJECT_SELF;
    
object oEntering GetEnteringObject();
    
    
// On vérifie que la créature ne soit pas un MD
    // ou une créature possédée par un MD, ou qu'un
    // marqueur ne soit pas présent.
    
if(!GetIsDM(oEntering) && !GetIsDMPossessed(oEntering) && GetLocalInt(oSelf,"IS_FOUND")!=1)
    {
        
// On prépare le test de détection.
        
int nSearch GetSkillRank(SKILL_SEARCH,oEntering):
        
int nD20 d20();
        
// On récupère la variable définissant le DD
        
int nDC GetLocalInt(oSelf,"DD_SEARCH");

        
// On fait le test de détection, et on interrompt le script
        // si la créature ne l'a pas réussi, et/ou si elle n'a pas fait 20
        
if((nD20+nSearch)<nDC && nD20<20)
            return;

        
// Si c'est un joueur qui entre, on lui met son petit message
        
if(GetIsPC(oEntering))
            
FloatingTextStringOnCreature("Vous avez découvert une porte secrète",oEntering,FALSE);

        
// Si ce n'est pas un joueur qui entre
        
else
        {
            
// Il se peut que la créature soit l'associé d'un joueur.
            
object oMaster GetMaster(oEntering);

            
// Ici on vérifie que oEntering est bien un compagnon animal,
            // compagnon d'armes, familier, et que le maître est bien un joueur.
            // * Si tous les associés peuvent détecter la porte secrète, comme les
            //   créatures dominées ou invoquées, cette vérification pourra être
            //   simplifiée à "if(GetIsPC(oMaster))".
            
int nType GetAssociateType(oEntering);
            if(
GetIsPC(oMaster) && (nType == ASSOCIATE_TYPE_ANIMALCOMPANION || nType == ASSOCIATE_TYPE_FAMILIAR || nType == ASSOCIATE_TYPE_HENCHMAN)
                
FloatingTextStringOnCreature(GetName(oEntering)+" a découvert une porte secrète",oMaster,FALSE);

            
// On interrompt le script si la créature n'a pas de maître ou 
            // ne correspond pas au type d'associé requis, ou si le maître
            // n'est pas un joueur.
            // * ou, dans le cas où "if(GetIsPC(oMaster))" suffit, si la créature n'a
            //   pas de maître, ou que le maître n'est pas un joueur.
            
else
                return;
        }

        
// On Marque le déclencheur comme détecté.
        
SetLocalInt(oSelf,"IS_FOUND",1);

        
// On construit la position de la porte afin de la créer
        
float fX GetLocalFloat(oSelf,"DOOR_POS_X");
        
float fY GetLocalFloat(oSelf,"DOOR_POS_Y");
        
float fZ GetLocalFloat(oSelf,"DOOR_POS_Z");
        
float fFacing GetLocalFloat(oSelf,"DOOR_POS_FACING");
        
location lLoc Location(GetArea(oSelf),Vector(fX,fY,fZ),fFacing);

        
// On crée la porte ^^
        
string sResRef GetLocalString(oSelf,"DOOR_BLUEPRINT");
        
CreateObject(OBJECT_TYPE_PLACEABLE,sResRef,lLoc);

        
// On donne la commande de détruire la porte
        // par exemple au bout de 10 secondes. et d'enlever
        // le marqueur, réinitialisant la porte.
        // Tu peux également définir le temps par
        // une variable posée sur ce déclencheur via
        // l'éditeur.
        
DestroyObject(oDoor,10.0);
        
DelayCommand(10.0,DeleteLocalInt(oSelf,"IS_FOUND"));
    }

Merci pour vos réponses mais je suis resté sur le script de base que j'ai mentionné plus haut et en initialisant effectivement plusieurs variables j'ai solutionné mon problème.

Merci.

a+
Répondre

Connectés sur ce fil

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