En fait il faut prendre le problème dans le bon sens.
Un piège c'est quoi à part un jet du pc contre un DD du piège ? Peu de chose à part des dégâts et autres effets négatifs...
Suite à ces petites constations je me suis lancé dans un script qui va émuler tout cela
On arrive à quelque chose comme cela pour un piege à creer avec un tringer et ce script à placer sur le OnEnter
int difficulty = 22; //difficulte du piege
object oPC = GetNearestCreature (CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1);
vector vPos = GetPosition(oPC);
float ori = GetFacingFromLocation(GetLocation(oPC));
location lLoc = Location(GetArea(OBJECT_SELF), vPos, ori);
effect eShake = EffectVisualEffect(VFX_FNF_SCREEN_SHAKE );
effect ePerdu = EffectVisualEffect(VFX_FNF_IMPLOSION );
effect ePerdu2 = EffectVisualEffect(VFX_IMP_PULSE_FIRE );
object oTarget00 = GetFirstObjectInShape(SHAPE_CUBE, 3.0, GetLocation(oPC));
int nDamage;
effect eDamage;
effect eKnock = EffectKnockdown();
effect eBlood = EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE);
int skill_score = GetSkillRank(SKILL_SEARCH, oPC); //skill que l'on va utiliser pour faire son jet
//save pour dejouer le piege
if ((d10(1)+skill_score < difficulty)&&(GetLocalInt(OBJECT_SELF, "rearm") == 0)
&&(GetIsPC(oPC))) {
nDamage = d8(30);
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_SLASHING);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, ePerdu, lLoc);
SetLocalInt(OBJECT_SELF,"rearm",1);
SetLocalInt(OBJECT_SELF,"gain_xp",1);
FloatingTextStringOnCreature("Tu viens d'activer un piège !",oPC);
//effets negatifs a ajouter selon son bon vouloir
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget00));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget00, 4.0));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBlood, oTarget00));
} else { //si il rate pas son jet on arrive ici et il ne va pas subir les effets negatifs
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,ePerdu2, lLoc);
if (GetLocalInt(OBJECT_SELF, "gain_xp") == 0) {
SetLocalInt(OBJECT_SELF,"gain_xp",1);
SetLocalInt(OBJECT_SELF,"rearm",1);
DelayCommand(1.00,GiveXPToCreature(oPC, 100));
DelayCommand(1.00,FloatingTextStringOnCreature("Tu apprends beaucoup avec ce piège" ,oPC));
} else {
FloatingTextStringOnCreature("Tu passes sur un piège désactivé",oPC);
}
}
oTarget00 = GetNextObjectInShape(SHAPE_CUBE, 3.0, GetLocation(oPC));
DelayCommand( 80.00,SetLocalInt(OBJECT_SELF,"rearm",0)); //rearm du piege a proprement parler
DelayCommand(800.00,SetLocalInt(OBJECT_SELF,"gain_xp",0)); //rearm du gain en xp
}
On peut aussi retrouver le même genre de chose mais ici pour des portes. La porte doit être verrouillée et je conseille de mettre qu'il faut une clef pour l'ouvrir. Et ce script est à mettre sur le FailToOpen. Avec ce script plus jamais de problème avec les mages ou les prêtres qui vous font peter tous vos beau pieges avec un seul sort.
object oPC = GetNearestCreature (CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1);
vector vPos = GetPosition(OBJECT_SELF);
float ori = GetFacingFromLocation(GetLocation(OBJECT_SELF));
location lLoc = Location(GetArea(OBJECT_SELF), vPos, ori);
effect eBlades = EffectVisualEffect(VFX_FNF_SWINGING_BLADE);
object oTarget00 = GetFirstObjectInShape(SHAPE_CUBE, 3.0, GetLocation(oPC));
int difficulty = 22; //difficulte du piege
int search_score = GetSkillRank(SKILL_SEARCH, oPC); //choix de la skill pour le jet
int nDamage;
effect eDamage;
effect eKnock = EffectKnockdown();
effect eBlood = EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE);
while(oTarget00 != OBJECT_INVALID && GetLocalInt(OBJECT_SELF, "rearm") == 0
&&(GetIsPC(oPC))) {
// save pour dejouer la serrure, avec une petite notion d'aleatoire grace au d10 ;)
if ((d10(1)+search_score > difficulty)) {
AssignCommand(oTarget00, ClearAllActions());
SetLocalInt(OBJECT_SELF,"rearm",1);
ActionUnlockObject(OBJECT_SELF);
ActionOpenDoor(OBJECT_SELF);
FloatingTextStringOnCreature("Tu viens de réussir à déjouer le piège de cette porte",oPC,TRUE);
DelayCommand(0.50,GiveXPToCreature(oPC, 100));
DelayCommand(0.50,FloatingTextStringOnCreature("Tu apprends beaucoup avec ce piège" ,oPC));
//on laisse 12 sec au diverses personne pour passer la porte
DelayCommand(12.00,ActionCloseDoor(OBJECT_SELF));
DelayCommand(13.00,ActionLockObject(OBJECT_SELF));
} else {
//effets negatifs a definir a votre bon vouloir en cas d'echec au jet
nDamage = d8(30);
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_SLASHING);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBlades, lLoc);
FloatingTextStringOnCreature("Tu viens d'activer un piège !",oPC);
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget00));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget00, 4.0));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBlood, oTarget00));
}
oTarget00 = GetNextObjectInShape(SHAPE_CUBE, 3.0, GetLocation(oPC));
DelayCommand( 80.00,SetLocalInt(OBJECT_SELF,"rearm",0));
DelayCommand(800.00,SetLocalInt(OBJECT_SELF,"gain_xp",0));
}
}
Voila une petite remarque je CONSEILLE FORTEMENT d'y aller doucement avec ce genre de pièges. En effet ils font appel à la fonction DelayCommand que je n'aime pas trop mais qui est utilisée là pour plus de facilité et par ce que je sais que je ne place jamais plus de 1 ou 2 pièges de ce type... On peut améliorer ce point en introduisant des ActionWait mais je n’ai pas encore travaillé sur ce point. Si l’un de vous veut les introduire il peut toujours le faire.
Maintenant un dernier conseil. Je crois qu’il faut tout de même faire de ces scripts des fonctions et de les inclure dans un INCLUDE en définissant ce que vous voulez régler vous même. C'est beaucoup plus facile à gérer selon moi, mais bien sur je n'oblige personne à faire comme moi
Au fait salut Ketil tu dois te souvenir de moi, le contraire m’étonnerait

.