[SCRIPT] Piège sur module persistant

Répondre
Partager Rechercher
Bonjours a tous , je voulais savoir pour ceux d entre vous qui créer des mondes persistants quel système vous utilisiez pour les pièges . Pour ma part je recherche plus particulièrement un script qui permettrait a mes pièges de réapparaitre quand le joueur l'enlève ou quand le piège se déclenche , que cela soit au sol ou sur un coffre . Si vous avez des infos , merci d'avance
A ma connaissance, il n'existe pas de système de persistance pour les pièges, bien que ce soit régulièrement demandé à la Live Team sur les forums officiels. Il existe quelques workarounds sur le Vault, mais personnellement aucun ne m'a convaincu à ce jour.
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

Code PHP:

    int difficulty 22;          //difficulte du piege
    
object oPC GetNearestCreature (CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PCOBJECT_SELF1);
    
vector vPos GetPosition(oPC);
    
float ori GetFacingFromLocation(GetLocation(oPC));
    
location lLoc Location(GetArea(OBJECT_SELF), vPosori);
    
effect eShake EffectVisualEffect(VFX_FNF_SCREEN_SHAKE );
    
effect ePerdu EffectVisualEffect(VFX_FNF_IMPLOSION );
    
effect ePerdu2 EffectVisualEffect(VFX_IMP_PULSE_FIRE );
    
object oTarget00 GetFirstObjectInShape(SHAPE_CUBE3.0GetLocation(oPC));
    
int nDamage;
    
effect eDamage;
    
effect eKnock EffectKnockdown();
    
effect eBlood EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE);
    
int skill_score GetSkillRank(SKILL_SEARCHoPC);    //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(nDamageDAMAGE_TYPE_SLASHING);
            
ApplyEffectAtLocation(DURATION_TYPE_INSTANTePerdulLoc);
            
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.5ApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoTarget00));
            
DelayCommand(0.5ApplyEffectToObject(DURATION_TYPE_TEMPORARYeKnockoTarget004.0));
            
DelayCommand(0.5ApplyEffectToObject(DURATION_TYPE_INSTANTeBloodoTarget00));

    } else {   
//si il rate pas son jet on arrive ici et il ne va pas subir les effets negatifs
            
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,ePerdu2lLoc);

            if (
GetLocalInt(OBJECT_SELF"gain_xp") == 0) {
            
SetLocalInt(OBJECT_SELF,"gain_xp",1);
            
SetLocalInt(OBJECT_SELF,"rearm",1);
            
DelayCommand(1.00,GiveXPToCreature(oPC100));
            
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_CUBE3.0GetLocation(oPC));
   
DelayCommand80.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.

Code PHP:

    object oPC GetNearestCreature (CREATURE_TYPE_PLAYER_CHARPLAYER_CHAR_IS_PCOBJECT_SELF1);
    
vector vPos GetPosition(OBJECT_SELF);
    
float ori GetFacingFromLocation(GetLocation(OBJECT_SELF));
    
location lLoc Location(GetArea(OBJECT_SELF), vPosori);
    
effect eBlades EffectVisualEffect(VFX_FNF_SWINGING_BLADE);
    
object oTarget00 GetFirstObjectInShape(SHAPE_CUBE3.0GetLocation(oPC));
    
int difficulty 22;       //difficulte du piege
    
int search_score GetSkillRank(SKILL_SEARCHoPC); //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(oTarget00ClearAllActions());
            
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(oPC100));
            
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(nDamageDAMAGE_TYPE_SLASHING);
            
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeBladeslLoc);
            
FloatingTextStringOnCreature("Tu viens d'activer un piège !",oPC);
            
DelayCommand(0.5ApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoTarget00));
            
DelayCommand(0.5ApplyEffectToObject(DURATION_TYPE_TEMPORARYeKnockoTarget004.0));
            
DelayCommand(0.5ApplyEffectToObject(DURATION_TYPE_INSTANTeBloodoTarget00));
        }
        
oTarget00 GetNextObjectInShape(SHAPE_CUBE3.0GetLocation(oPC));

   
DelayCommand80.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 .
Je n'ai regardé que le premier script et j'y vois quelques soucis :
- Il manque un while quelque part pour gérer les cibles dans le zone d'effet.
- Il n'y a pas de phase de détection de piège.
- Tu pourrais lier des effets, c'est un peu plus rapide.
- Tu pourrais effacer les variables locales plutôt que les remettre à 0.

Enfin, c'est surtout le second point qui me laisse perplexe. J'avais pensé à un système dans le genre, mais cela impliquait la présence d'un autre trigger englobant le premier. Ce second trigger permettrait la détection du piège, le personnage aurait alors la possibilité d'utiliser un outil pour identifier / désarmer / marquer / récupérer le piège. L'ennui qu'il y avait avec cette méthode était au niveau de la visualisation du piège vu qu'un effet visuel du type ghost ou paralyze (aura bleutée ou rouge) ne peut être appliquée sur le trigger lui-même. Il est alors nécessaire de créer un ou plusieurs objets invisibles afin de leur appliquer ce genre d'effet.

C'est possible, mais le procédé n'est pas très élégant, du coup j'avais laissé tomber cette idée... enfin, si ça peut aider quelqu'un pour développer quelquechose de mieux .
Je n'ai pas dit que c'était parfait attention.

Je viens juste de me lancer dans ce genre de "trucs". Mais crois moi c'est très efficase (j'ai le loisir de pouvoir customiser totalement les effets, les DD, etc..., ce qui est loin d'être négligeable pour moi). Oui c'est lourd et peu élegent à voir mais pour moi ce genre de script devient une fonction qui fait partis d'un include. Je ne l'ais pas donné par ce que je travaille dessus donc le code que vous voyez est "trafiqué". Donc à la fin la fonction ne sera qu'une simple ligne après tout.

Mais pour te répondre Sherazade.

Citation :
Il manque un while quelque part pour gérer les cibles dans le zone d'effet.
En fait oui j'ai mal copié collé mon script pour la raison ci dessus. Dans le script du bas la while est là. Mes excuses pour les lecteurs.

Citation :
Il n'y a pas de phase de détection de piège.
C'est volontaire. Je ne vois pas pourquoi un gars autre qu'un roublard devrait passer devant dans les donjons sombres et dangereux... Par ce que moi je vais te dire la majorité des pièges je les vois avec un mage. Oui on peut monter le DD pour éviter cet effet mais je trouve cela un peu stupide. Mais ce n'est qu'un choix personnel après tout.

Mais si cela amuse vraiment les gens on peut introduire ce effet sans trop de problèmes en fait, mais cela devient prise de tête. Et il ne faut pas introduire d'autre tringer tu sais. Il suffit de gerer un point sur le tringer principal et d'autoriser un jet quand on rentre dans le shape définis. Bien sur il faut passer par des fonctions sur le OnEnter de la Zone mais c'est tout à fait possible je l'ai testé.

Mais on rentre dans des choses que je trouve bête à mettre en oeuvre pour un effet que je trouve inutile. Pour moi dans un donjon le roublard passe devant et trouve les pièges seul, je déteste passer par tout ces menus pour faire un désamorçage ou un crochetage. Je préfère largement le fait de rendre cette action automatique même si je dois lui mettre un temps d'exécution pour faire plus "vrais".

Citation :
Tu pourrais lier des effets, c'est un peu plus rapide.
Oui c'est bête j'y avais pas pensé. C'est toujours une ligne de gagner

Citation :
Tu pourrais effacer les variables locales plutôt que les remettre à 0.
En effet, mais bon moi j'ai une autre manière pour gerer cela. J'ai placé cette methode pour permettre au gens de l'utiliser tel quel. Mais oui on peut tout simplement les effacer. Demain je prendrais le temps de bien le mettre au propre si cela interesce des gens.

Mais bon comme je vois cela n'a pas l'air de plaire ce genre de choses, je ne donnerais peut être pas le reste . Oui sinon si cela t'interesce tu peux toujours lire le deuxième script qui n'est pas le même et donc qui vaut peut être la peine d'être lu voir peut être survolé. Enfin personnellement chez moi tout marches très bien donc à la limite
Utilise les fonction "Secret" de Bioware (dans l'include: x0_i0_secret), et à la place du trigger secret, tu utilises le trigger de piège. (comme avec la fonction ResetSecretItem(object oDetectTrigger=OBJECT_SELF))
Citation :
Publié par blackwinter
C'est volontaire. Je ne vois pas pourquoi un gars autre qu'un roublard devrait passer devant dans les donjons sombres et dangereux... Par ce que moi je vais te dire la majorité des pièges je les vois avec un mage. Oui on peut monter le DD pour éviter cet effet mais je trouve cela un peu stupide. Mais ce n'est qu'un choix personnel après tout.
Huh ? La détection de piège n'est pas uniquement allouée aux roublards, heureusement. N'importe quel personnage est capable de détecter des pièges.

Citation :
Mais si cela amuse vraiment les gens on peut introduire ce effet sans trop de problèmes en fait, mais cela devient prise de tête. Et il ne faut pas introduire d'autre tringer tu sais. Il suffit de gerer un point sur le tringer principal et d'autoriser un jet quand on rentre dans le shape définis. Bien sur il faut passer par des fonctions sur le OnEnter de la Zone mais c'est tout à fait possible je l'ai testé.
Là, une explication serait la bienvenue. En effet, le OnEnter n'est déclenché qu'à l'entrée du personnage dans le trigger, cet évènement n'est pas déclenché deux fois. Donc je ne vois pas trop sur un seul évènement coder la possibilité de détecter le piège dans un premier temps et de se le prendre dans un second temps. Même en définissant une shape dans le trigger testée dans le OnEnter, cela signifie de déclencher la détection et l'effet du piège au même endroit. Il faudrait un OnShapeEnter mais je ne crois pas que cela existe. Donc, un peu d'éclaircissement me paraît nécessaire, j'ai peut-être laisser échapper un truc.

... quoique peut-être en gérant une AOE ça peut passer, à voir...

Citation :
Enfin personnellement chez moi tout marches très bien donc à la limite
En tout cas, d'un forum à l'autre, ton ton ne change pas ...
Oula j'ai du mal à 2h du matin... Je ne devrais plus poster à ces heures là.

Enfin ce que tu proposes Nissus/Nek/Delph cela parait facile en effet. Mais malheureusement si tu regardes un peu le code en question. Cela t'oblige en gros à utiliser leur système de piège, chose que je ne veux pas déjà moi quand je vois ces grosse plaques au sol qui te dise très exactement ou ce piège ce trouve moi je saute sur place. En plus je trouve que dans le système de Bioware on est vite limité sur les effets que l'on veut créer, là on est totalement libre quand on gère cela nous même. Même si cela peut paraître plus lourd à l'usage, il suffit de ne pas mettre 150 pièges comme ceux là un ou deux bien vicieusement placé suffit amplement à mon humble avis.

En plus il existe des solutions. Vous n'avez jamais imaginé le simple fait qu'a l'endroit de votre piège on pouvait définir un location qui pouvait être le centre d'une sphère dans la quelle la personne qui entre fait un jet de recherche ? Et par ce que vous avez l’air de dire que c’est mieux de voir en réel ou ce trouve le piège (moi je n'aime pas plus que cela mais bon ) on peut simplement colorer la tile en live non ?

Code PHP:

int ColorTile(int z) {
    
int i;
    switch (
z) {
        case 
1TILE_SOURCE_LIGHT_COLOR_PALE_RED; break;     //couleur si vu piege
        
case 2TILE_SOURCE_LIGHT_COLOR_BLACK; break;        //couleur de base pour moi
    
}
    return 
i;
}

void CheckTrap(int iint zfloat xfloat y,int nDiff,int nSkill) {
    
location la Location(OBJECT_SELFVector(xy0.0), 0.0);
    
object pj GetFirstObjectInShape(SHAPE_SPHERE15.0la);
    if ((
GetIsObjectValid(pj))&&(d10(1)+(GetSkillRank(nSkillpj)) > nDiff)) {
        
FloatingTextStringOnCreature("Il te semble voir un piege dans cette zone...",pj,FALSE);
        
/*ne pas oublier de mettre quelque par sur le piege un reset de la couleur voule ou alors pour faire plus jolis 
           on peut introduire une autre couleur comme le vert pour dire que le piege est desactivé 
           mais de toutes les façons il ne faut aps oublier de le repasser dans la couleur de base à un moment.
        */
        
SetTileSourceLightColor(Location(OBJECT_SELFVector(x/10y/100.0), 0.0),
        
ColorTile(z), ColorTile(z));
        
//on peut meme utiliser cette valeur pour savoir si le piege a ete vu avant de permettre
        //un desamorcage
        
SetLocalInt(OBJECT_SELF"lum"+its(i), z);
    }

A mes yeux cela reste bien plus propre que d’utiliser des pièges Bioware. J'espère qu'il n'y a pas de fautes car je n'ai pas la possibilité ni le temps pour vérifier cela. Maintenant les goûts et les couleurs c’est le cas de le dire cela ne ce discute pas. Je ne fais que proposer une direction de réflexion puisse ce que personne n'a jamais rien mis sur la table. Bon ce n’est pas tout cela mais du travail m'attend.
Citation :
Publié par blackwinter
En plus il existe des solutions. Vous n'avez jamais imaginé le simple fait qu'a l'endroit de votre piège on pouvait définir un location qui pouvait être le centre d'une sphère dans la quelle la personne qui entre fait un jet de recherche ?
Hmmm... une simple sphère avec une shape n'est pas suffisant je pense. Il faudrait une AOE permanente, ce qui veut dire un OHB sur l'AOE, donc un OHB par piège. Ce qui revient probablement au même de définir deux triggers au niveau des performances.

Le problème est toujours de pouvoir déclencher deux évènements : La détection et l'effet à proprement parler du piège. Je ne crois pas que ces deux opérations puissent être faites dans le même évènement.

Citation :
Et par ce que vous avez l’air de dire que c’est mieux de voir en réel ou ce trouve le piège (moi je n'aime pas plus que cela mais bon ) on peut simplement colorer la tile en live non ?
Idée intéressante à tester, même si je suis dubitative des zones ayant des lumières de couleur rouge. De plus, ces lumières parfois ne sont pas très visibles. Il y aurait moyen peut-être de regarder du coté des TilesMagic, mais cela revient au même : Créer un objet invisible et lui appliquer un effet, qu'il soit en TileMagic ou normal, c'est toujours un effet visuel.
Les pièges persistants, dans NWN, ça n'existe pas. Je parle des pièges au sol, genre trigger ou piège de porte. Toutes les bidouilles qui pourront être faites auront la couleur de la bidouille, le goût de la bidouille et l'effet de la bidouille. Bref, rien de sérieux.

Pourquoi je dis ça :

- Détection colorie les pièges en rouge. Inscriptable. On a pas accès à la physionomie des triggers.
- Marquage les met en une autre couleur pour le groupe uniquement. Inscriptable. Idem à ci-dessus.
- Ramasser un piège et/ou le désamorcer, à la rigueur, ça peut se scripter.
- Les dégâts seront à rescripter aussi. Et ce n'est pas une mince affaire parce qu'il faut prendre en compte tous les cas possibles. Bon courage.

Personnellement, je me suis fait une raison. Les pièges sont soit mono-usage, soit permanents et indésamorçables mais contournables. Tu noteras d'ailleurs au passage, que même en MD, on ne peut poser qu'une pauvre zone carrée comme piège
Répondre

Connectés sur ce fil

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