Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Script de piege
eMRaistlin pres pour un otre probleme ???
Par ruru666 le 3/2/2003 à 16:03:31 (#3161957)
les aventuriers rentrent dans une salle avec 2 portes ouvertes. au moment ou ils sortent de cette piece les 2 portes ce ferment et un piege ce declenche.
Tu m avais pondu un truc bien costo avec une creature invis ki castait un nuage acide. mon probleme etait ke pour l instant je met ton script sous le coude pour ken ils seront plus haut nivo sinon je v les tuer tres rapidement...
donc g trouver une astuce en cherchant un peu (bcp) explications :
un trigger pour fermer les portes et declencher le piege :
void main()
{
object oPC = GetEnteringObject();
SetLocalInt(GetArea(OBJECT_SELF),"nSecondPiege",1);
{
if (GetIsPC(oPC))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
}
}
}
puis le piege ki ce declenche dans un otre trigger :
dans le on enter :
void main()
{
if (GetLocalInt(GetArea(OBJECT_SELF),"nSecondPiege")==1)
{
object oPC = GetEnteringObject();
SetLocalInt(oPC, "bGril", TRUE);
ExecuteScript("be_gril_pc_vite", oPC);
}
}
dans le on exit :
void main()
{
object oPC = GetExitingObject();
DeleteLocalInt(oPC, "bGril");
}
et pour finir le script ki fais les degats :
//script "be_gril_pc_vite" :
void main()
{
object oPC = OBJECT_SELF;
if(GetLocalInt(oPC, "bGril"))
{
DelayCommand(6.0, ExecuteScript("be_gril_pc_vite", oPC));
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(1,DAMAGE_TYPE_FIRE), oPC);
}
}
Mon soucie c ke apparement les personnes ki sont deja entre dans le trigger (celui ki fais les degats) ne sont plus soumis a son effet, et si je le met dans le OHB ca part en cacahuet. et donc comme ils sont dans le pieges au moment ou il est sensé ce declencher comment modifier cela ???
si ta pa compris un truc avant de partir dans des complications demande moi :p (je voulais dire par la si g pas ete assez clair bien sure :) )
Par eMRaistlin le 3/2/2003 à 16:08:49 (#3162005)
- Le titre (s'il est sympa ^^) n'est pas clair.
- Le code n'est pas sous balises php.
Je ne vois pas pourquoi je devrait prendre sur moi de lire si tu prend pas sur toi de me donner envie de lire...
Met a jour, et je verrait ce que je peut faire.
(et je commence vraiment a me demander si tu ne le fais pas exprès... Ma patiente, dit-on, est sans limite, mais je sais que ce n'est pas vrai...)
[Edit : ceci etant, merci pour l'effort d'explication :p]
Par ruru666 le 3/2/2003 à 16:16:18 (#3162057)
Par eMRaistlin le 3/2/2003 à 16:22:31 (#3162108)
(en esperant que ca dure :))
Bien, question :
Ton PC, quand il rentre dans le trigger 2 (celui qui declenche le piege, pas celui qui ferme les portes), si tu le laisse dedans, que se passe t'il ?
Rien ?
Ton PC a t'il des protections ? (car EffectDamage est un effet magique par defaut)
et personnelement, sur le OnEnter et le OnExit, j'aurait aussi fait des test "if (GetIsPC(oPC))"
Par ruru666 le 3/2/2003 à 16:51:40 (#3162341)
SetLocalInt(GetArea(OBJECT_SELF),"nSecondPiege",1);
ki perturbe le fonctionnement.
Je te detail les trigger :
Le premier ki ferme les portes se trouve a la sortie de la piece devant la porte de sortie.
le 2eme le piege, prend toute la surface de la piece pour toucher absolument tout les joueurs (creer une panik).
Donc etant donné ke les 2 trigger sont l un dans l otre, les joueurs sont deja dans celui ki fait office de piege, j imagine donc ke cela pose un probleme de "on enter" au moment ou ils active le piege en marchant sur le premier trigger.
Ais je bien repondu ou une otre information te faut il ?
Par eMRaistlin le 3/2/2003 à 16:58:05 (#3162386)
Pour regler ce pb (et en gardant ta configuration de portes qui se ferment au dernier moment, si j'ai bien compris), il va te falloir un 3eme trigger a l'entree de la piece, qui initialise la variable.
Le mieux, je pense, et le plus simple : met le 1er trigger, qui ferme les portes, juste apres l'entree, et non juste avant la sortie... ca devrait etre mieux. (essaye de faire en sorte que le 1er trigger soit pénétré par les PJ en premiers.)
Par Jaha Effect le 3/2/2003 à 17:00:15 (#3162404)
Jaha Effect :D
Par ruru666 le 3/2/2003 à 17:27:05 (#3162660)
PHP:--------------------------------------------------------------------------------
SetLocalInt(GetArea(OBJECT_SELF),"nSecondPiege",1);
--------------------------------------------------------------------------------
je mettrais bien un timer pour declancher les degats plus tard, donc comment fo faire :) ??
Par eMRaistlin le 3/2/2003 à 17:34:34 (#3162724)
DelayCommand(10.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(1),oPC));
Par ruru666 le 3/2/2003 à 18:07:33 (#3163010)
CF le script :
void main()
{
object oPC = GetEnteringObject();
{
if (GetIsPC(oPC))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
}
}
}
Par ruru666 le 3/2/2003 à 18:17:21 (#3163104)
Provient du message de eMRaistlin
DelayCommand(10.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(1),oPC));
Humm autre chose c k en faite j aurrais aimer (je c je suis tres chi..t), ke les degat commencent environ 1 mn apres etre entré dans le trigger mais si je met 60 a la place de 10 ca va faire 1pts toute les 60 sec.
Donc ya t'il possibilité de faire demarrer les degats 1 mn apres etre rentre et faire 1pts chake round suivant ???
Par ruru666 le 3/2/2003 à 18:21:28 (#3163140)
CF script du on enter :
void main()
{
object oPC = GetEnteringObject();
SetLocalInt(oPC, "bGril", TRUE);
ExecuteScript("script_degats", oPC);
}
Par ruru666 le 3/2/2003 à 18:47:42 (#3163330)
comment fais ton pour ke le premier trigger ne ce déclenche kune fois ? C a d ke les portes ne ce ferme kune seule fois ?
CF le script :
void main()
{
object oPC = GetEnteringObject();
{
if (GetIsPC(oPC))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
}
}
}
Par Reyan le 3/2/2003 à 19:43:06 (#3163730)
tu fais un test au début du on enter, tu met une variable à la fin, et la prochaine fois qu'on rentre dedans, ça test pour vérifier si ça a déjà fonctionné
ou alors tu détruit le(s) trigger(s)void main()
{
object oPC = GetEnteringObject();
int nPiege = GetLocalInt(GetModule(), "PIEGE");
{
if ((GetIsPC(oPC)) && (nPiege != 1))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
SetLocalInt(GetModule(), "PIEGE", 1);
}
}
}
ça ca met la variable sur le module, donc ca marcheras plus jamais, ou alors pas avant que le module soit relancé, je suis pas sure ...
tu peux mettre et tester ta variable sur le PJ, comme ca ca marche plus qu'une fois par PJ qui déclenche, mais bon, je pense que c'est pas top ...
tu peux aussi faire en sorte que ca marche plus qu'au bout de n fois void main()
{
object oPC = GetEnteringObject();
int nPiege = GetLocalInt(GetModule(), "PIEGE");
{
if ((GetIsPC(oPC)) && (nPiege != 5))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
int nPiege2 = nPiege +1;
SetLocalInt(GetModule(), "PIEGE", nPiege2);
}
}
}
la c au bout de 5 fois
attention, ca compile, mais je suis pas sure que ca marche, et c pas optimisé pour cause, je sais pas optimiser ... donc je suppose que si c vraiment nul, on le diras ;)
[edit] corrigé script 2 (si si, regardez y a un pitit 2 en plus qq part :D )
Par ruru666 le 3/2/2003 à 20:14:11 (#3163963)
Par Jedaï le 3/2/2003 à 20:18:13 (#3163994)
Utilise ces scripts, ils sont très bien !:p
(Tu prend toujours l'avis de deux docteurs ? :D )
[ Edit ] Y a des accolades en trop { mais } ça gène { pas } plus que ça...:cool:
Par Reyan le 3/2/2003 à 20:27:44 (#3164074)
Par ruru666 le 4/2/2003 à 8:46:22 (#3166520)
Donc on fais comment ? :)
Par ruru666 le 4/2/2003 à 9:34:16 (#3166689)
Je v tester ca...
Par ruru666 le 4/2/2003 à 10:20:41 (#3166929)
N y aurait t'il pas moyen de detruire le trigger apres kil ait ete eclencher pour simplifier les choses ???
cf le script pour vous simplifier la tache :
void main()
{
object oPC = GetEnteringObject();
{
if (GetIsPC(oPC))
{
object oPorte1 = GetNearestObjectByTag("RPORTE",oPC,1);
object oPorte2 = GetNearestObjectByTag("RPORTE",oPC,2);
ActionCloseDoor(oPorte1);
ActionCloseDoor(oPorte2);
SetLocked(oPorte1,TRUE);
SetLocked(oPorte2,TRUE);
}
}
}
Par Jaha Effect le 4/2/2003 à 10:25:33 (#3166963)
DestroyObject (OBJECT_SELF);
Ca marche très bien en général
Jaha Effect :D
Par ruru666 le 4/2/2003 à 12:04:22 (#3167548)
en effet ca doit le detruire trop vite ;)
Par Jaha Effect le 4/2/2003 à 12:07:27 (#3167570)
Jaha Effect :D
Par ruru666 le 4/2/2003 à 12:12:59 (#3167598)
allez je ris de ma betise : :mdr: :mdr: :mdr:
Tu es nul ?
Par Blam le 5/2/2003 à 13:41:50 (#3175257)
c'est pénible hein ? Ces scripts qu'on ne comprends pas!
qui ne marchent pas, ou pas bien.
Fondons un club.
Par ruru666 le 6/2/2003 à 16:13:03 (#3184413)
Bon j'ai ken meme le merite de me rattraper comme MD, certe je connais des type ki m en foute plein la vu, mais je me debrouille.
Au faite mon module a depasser les 40 zones, et en aura 55 probablement la semaine prochaine. Attention des zone travaillé, pas des creation a la mord moi le bidule !!! tout comme les pnjs !!!
tiens a ce sujet g une question pour les pnjs, je v faire un nouvo post :p
JOL Archives 1.0.1
@ JOL / JeuxOnLine