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 ^^
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"));
}
}