La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/12/2024 02:52:37


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 29/07/2007 19:51:08 Sujet du message : probleme sur deux teleportations

Je fais un script d'effet magique nefaste en cas de ratage de jet d'art de la magie au lancement d'un sort, et je buche sur les effets de teleportation.

En gros le bug est simple, y'a rien qui se passe.
Enfin tous les effets annexes (visuel, knockdown, etc... ) c'est bon, mais la teleportation elle-même rien.

Je vous met les deux fonctions qui teleportent. (enfin justement, elles le font pas, c'est le problème)

La premiere, elle doit teleporter dans une zone au loin.
NWScript :

void tele_dime (object oMage)
{
    effect eko = EffectKnockdown();
    string sTag_dest;
    switch (d6(1))
        {
        case 1:
                sTag_dest = "wp_tele_mage_01";
            break;
        case 2:
                sTag_dest = "wp_tele_mage_02";
            break;
        case 3:
                sTag_dest = "wp_tele_mage_03";
            break;
        case 4:
                sTag_dest = "wp_tele_mage_04";
            break;
        case 5:
                sTag_dest = "wp_tele_mage_05";
            break;
        case 6:
                sTag_dest = "wp_tele_mage_06";
            break;
        default:
            //
        break;
    }
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),oMage);
    AssignCommand(oMage, ClearAllActions(TRUE));
    AssignCommand(oMage,JumpToObject(GetObjectByTag(sTag_dest)));
    //AssignCommand(oEntering,Jump ToObject(GetObjectByTag(sWPTag )));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,1.0);
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez dans un endroit lointaint. Heureusement vos esprit vous reviennent tres rapidement.";
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

Donc son fonctionnement est simple. 6 waypoint, elle en choisi un au pif, et elle y envoi le joueur. Je rajoute un effet d'eclair, parce que c'est drole, puis je sonne le joueur histoire de marquer le coup. (La ligne en commentaire est une ligne d'un autre script qui marche à merveille.)
J'ai verifié tous les waypoints, ils ont le bon tag.

Voila la seconde fonction, celle-ci teleporte le lanceur à quelques metres et l'assome.
NWScript :

void tele_self (object oMage)
{
    effect eko = EffectKnockdown();
    AssignCommand(oMage, ClearAllActions(TRUE));
    AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),10.0)));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1)));
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez une courte distance, sonne sous le choc.";
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

Bon, elle est beaucoup plus courte, mais elle marche pas mieu. La fonction decalage apellée à un moment est une fonction qui me sert à decaler aleatoirement une location (elle fonctionne dans d'autres scripts, je l'ai d'ailleur trouvée en faisant une recherche sur ce forum, merci encore ^^)
Encore une fois le pj reste betement à sa place, assomé (parce que l'assomage marche)

Voila, chacune de ces fonctions est apellée par mon main qui est en fait un gros switch sur un d20. Chacun des "case" verifiant le resultat et apellant la fonction le cas echeant. Je vous le met en spoiler si vous voulez, mais il marche pour le reste, alors je vois pas pourquoi il marcherais pas la.

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
void main()
{

    //int nEffet = GetLocalInt(OBJECT_SELF," nEffet"); //debug
    sMessageEffetMagiqueIncontrole = "Pendant l'incantation vous perdez le controle de votre magie et ";

    switch (d20(1) + d12(1))
    {
    case 0:
        // statements ...
        // condition would also evaluate as true if x == 0, which should not happen . . .
        // but . . . lets put this in here just as a safety device Smile
        break;
    case 1:
        // statements ...
        // condition would also evaluate as true if x == 0, which should not happen . . .
        // but . . . lets put this in here just as a safety device Smile
        break;
    case 2:
            degats(OBJECT_SELF);
        break;
    case 3:
            degats(OBJECT_SELF);
        break;
    case 4:
            deat_soul(OBJECT_SELF);
        break;
    case 5:
            deat_implo(OBJECT_SELF);
        break;
    case 6:
            knoc_down(OBJECT_SELF);
        break;
    case 7:
            knoc_down(OBJECT_SELF);
        break;
    case 8:
            knoc_down(OBJECT_SELF);
        break;
    case 9:
            knoc_down(OBJECT_SELF);
        break;
    case 10:
            confused(OBJECT_SELF);
        break;
    case 11:
            confused(OBJECT_SELF);
        break;
    case 12:
            confused(OBJECT_SELF);
        break;
    case 13:
            confused(OBJECT_SELF);
        break;
    case 14:
            aveugle(OBJECT_SELF);
        break;
    case 15:
            aveugle(OBJECT_SELF);
        break;
    case 16:
            invocation(OBJECT_SELF);
        break;
    case 17:
            invocation(OBJECT_SELF);
        break;
    case 18:
            effe_lampion(OBJECT_SELF);
        break;
    case 19:
            effe_lampion(OBJECT_SELF);
        break;
    case 20:
            effe_lampion(OBJECT_SELF);
        break;
    case 21:
            effe_lampion(OBJECT_SELF);
        break;
    case 22:
            tele_dime(OBJECT_SELF);
        break;
    case 23:
            lampion_disparition(OBJECT_SELF);
        break;
    case 24:
            lampion_disparition(OBJECT_SELF);
        break;
    case 25:
            haunted(OBJECT_SELF);
        break;
    case 26:
            haunted(OBJECT_SELF);
        break;
    case 27:
            tele_self(OBJECT_SELF);
        break;
    case 28:
            tele_self(OBJECT_SELF);
        break;
    case 29:
            tele_dime(OBJECT_SELF);
        break;
    case 30:
            coupure_magie(OBJECT_SELF);
        break;
    default:

        break;
    }
    SendMessageToPC(OBJECT_SELF,sMessageEffetMagiqueIncontrole);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


(pour ceux qui l'ont regardé, oui je sais, il est pas comme je l'avais dit, mais c'était pour simplifier et en plus y'a encore du debug qui traine. Et oui je le mettrais en if...elseif des que j'aurais pas la flemme, je pense qu'il sera plus leger comme ça)

Voila tout en gros. J'espere que vous pourrez m'aider.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 29/07/2007 20:35:22 Sujet du message :

Tien tu m'apprends un truc lol j'pensais pas que on pouvais appliqué une fonction string et la retrouver dans hors de ce script pour faire des suites de phrase. =)

J'pourrais pas trop te répondre, parce que, j'ai eu beaucoup mais alors beaucoup de problème avec ces fonctions (JumpToObject/Location) mais par contre, tu peux réduire ton script (le premier) :

NWScript :
void tele_dime (object oMage)
{
effect eko = EffectKnockdown();
string sTag_dest = "wp_tele_mage_0"+IntToString(Random(6)+1);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),oMage);
AssignCommand(oMage, ClearAllActions(TRUE));
AssignCommand(oMage,JumpToObject(GetObjectByTag(sTag_dest)));
//AssignCommand(oEntering,Jump ToObject(GetObjectByTag(sWPTag )));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,1.0);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez dans un endroit lointaint. Heureusement vos esprit vous reviennent tres rapidement.";
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Embarassed
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 29/07/2007 21:15:27 Sujet du message :

La vache... Alors ça... Des fois je suis trop bete. En plus je crois que j'en est deux ou trois des comme ça...

Merci beaucoup même si ça regle surement pas le probleme c'est déjà ça ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 30/07/2007 17:36:44 Sujet du message :

J'approche de la folie... Ca veux toujours pas marcher... J'ai tout tenté... ARRRRRGGGGHHHHHHHHHH.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 30/07/2007 17:43:58 Sujet du message :

Je pense qu'il vaille mieux que utilises ceci pour le jump

NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Enfin oPC est ton oMage. Pour sDest il s'agit du tag du point d'arrivé. Par exemple un waypoint.
Ca devrait marcher.
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 30/07/2007 19:52:23 Sujet du message :

Apres test ça marche pas mieu ta solution Flumby. Merci quand meme. Il doit y avoir une subtilité qui m'echappe, mais j'arrive pas a comprendre laquelle.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 30/07/2007 20:03:38 Sujet du message :

Non c'est surement la fonction. Peut être que le script s'execute mal, et ClearAllAction empeche le jump? Je ne sais point Embarassed
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 30/07/2007 22:42:02 Sujet du message :

a mon avis essaie d'une part de faire un script de TP simple tout ce qui est autour tu le commentes (clear action, Ko etc etc) Déja pour vois si ca marche.

Ensuite tu pourras rajouter les effets et visuelle.
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 31/07/2007 19:53:28 Sujet du message :

Apres mise en oeuvre du conseil de Flumby, effectivement ça marche...

Ca marche meme tellement bien qu'il a ratrappé en une fois tout le retard de teleportation.

En fait ça se met a boucler et le pj se teleporte à l'infini. Des qu'une teleportation est faite le pj relance le sort, comme pour tester j'ai forcé l'echec critique sur la teleportation il le refait, et donc se reteleporte et donc relance le sort etc...

Quelqu'un à une idée pour eviter qu'il relance le sort comme ça ? Pour l'instant j'ai fais une bidouille à base de spellhooking et de variable initialisée avant la teleportation qui annule le sort si elle est presente, mais c'est moche (double invocation et double message de lancement de sort).
J'ai aussi essayé avec un delay sur la teleportation, en me disant que si il avait le temps de bien finir son lancement il le referait peut-etre pas. Ca marche une fois sur deux (literalement, une fois ça marche, une fois ça marche pas, une fois ça marche, une fois ça marche pas, toujours ça m'enerve.) puis en plus ça fait vraiment con quand mon mage il attend debout sagement pendant 2 secondes (sinon ça marche pas du tout) que l'effet debute.

Bref je m'en remet une fois de plus à vous. Vous m'avez déjà bien aidé (j'ai reussi a faire un script plus ou moins correct avec un delay sur l'effet assomant, et la bidouille avec la variable) mais si quelqu'un a une solution plus propre pour eviter qu'il relance le sort à l'infini je suis preneur.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 01/08/2007 12:18:24 Sujet du message :

Tu peux déja tenter ceci :

tu rajoutes un drapeau sur ton pj afin de signaler au script teleporteur qu'il a déja été éxécuté

ca donne a peu pres ca (OBJECT_SELF est le pj):

NWScript :

int nDejaPasse = GetLocalInt(OBJECT_SELF,"Deja_Passe");
if(nDejaPasse==FALSE)
{
// ton code d'execution de la teleportation
    SetLocalInt(OBJECT_SELF,"Deja_Passe",TRUE);
    return; // donc je quitte la fonction
}
DeleteLocalInt(OBJECT_SELF,"Deja_Passe");

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 01/08/2007 12:19:34 Sujet du message :

Envoit nous ton script, pour voir ce qui cloche.
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 01/08/2007 13:06:03 Sujet du message :

surtout ce qui s'intéresserait c'est comment tu fais appel a la fonction teledime
ou tu as placé le script main ? activation d'un objet, fin d'un dialogue ?

Certains évenements sont a manier avec précaution.

je suis bete j'avais pas vu le spoiler -.-
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 01/08/2007 18:28:05 Sujet du message :

Pour le drapeau c'est déjà. J'ai rajouté un truc dans le spell hooking qui coupe le sort mais ça fais quand meme pas tres propre. Sinon je vous envoie l'integralité de mon script apres le repas (la j'ai pas acces au pc ou c'est dessus que je script)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 01/08/2007 20:16:34 Sujet du message :

Alors... Voila déjà le script complet gerant les effets nefastes de la magie (il est grand)
Ca permet 13 effets critiques differents, j'ai commenté uniquement les deux avec teleportation, ceux qui nous interessent.

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :

#include "X0_I0_SPELLS"

location Decalage(location lLoc, float fRayon = 10.0) //permet un decalage de 10 metre de rayon
{
    vector vPos = GetPositionFromLocation(lLoc);

    float fR = IntToFloat(Random(100)+1)/100 * fRayon;          //Definition des coordonnes polaires du nouveau point
    float fTheta = IntToFloat(Random(360));

    vPos.x += fR*cos(fTheta);                                  //Calcul des modifications faites aux coordonnes initiales
    vPos.y += fR*sin(fTheta);

    lLoc = Location(GetAreaFromLocation(lLoc), vPos, 0.0);      //Redefinition de la location apres application du decalage

    return lLoc;
}

void degats(object oMage)
{
    effect eDam;
    int nMetaMagic = GetMetaMagicFeat();
    switch (nMetaMagic)
    {
    case METAMAGIC_EMPOWER:
        eDam = EffectDamage(d12(15),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
    break;
    case METAMAGIC_MAXIMIZE:
        eDam = EffectDamage(12*10,DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
    break;
    default:
        eDam = EffectDamage(d12(10),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
    break;
    }

    effect eVis = EffectVisualEffect(234);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oMage);
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et vous la sentez parcourir et dechirer votre corps.";
}

void deat_soul(object oMage)
{
    effect eVis = EffectVisualEffect(VFX_IMP_DEATH_L);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oMage);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous, vous sentez votre ame s'etirer et se tordre comme si l'on vous l'arrachait avant de vous effondrer, mort.";

}

void deat_implo(object oMage)
{
    object oTarget;
    float fDelay;
    //effect eDeath = EffectDeath();
    //eDeath = SupernaturalEffect(eDeath);
    effect eImplode= EffectVisualEffect(VFX_FNF_IMPLOSION);
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImplode, GetLocation(oMage));
    oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
    while (GetIsObjectValid(oTarget))
    {
          fDelay = GetRandomDelay(0.4, 1.2);
                //Make Constit save
                if(!MySavingThrow(SAVING_THROW_FORT, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
                {
                    //Apply death effect and the VFX impact
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
                }
      oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
    }
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et dechiquete votre corps et tout ceux aleantours.";
}

void knoc_down(object oMage)
{
    int nMetaMagic = GetMetaMagicFeat();
    float fDuration;
    switch (nMetaMagic)
    {
    case METAMAGIC_EMPOWER:
        fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
        if (fDuration<3.0) fDuration = 3.0;
    break;
    case METAMAGIC_EXTEND:
        fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
        if (fDuration<6.0) fDuration = 6.0;
    break;
    case METAMAGIC_MAXIMIZE:
        fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
        if (fDuration<3.0) fDuration = 3.0;
    break;
    default:
        fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
        if (fDuration<3.0) fDuration = 3.0;
    break;
    }
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous assome pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectStunned(),oMage,fDuration*6.0);
}

void confused(object oMage)
{
    int nMetaMagic = GetMetaMagicFeat();
    float fDuration;
    switch (nMetaMagic)
    {
    case METAMAGIC_EMPOWER:
        fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
        if (fDuration<3.0) fDuration = 3.0;
    break;
    case METAMAGIC_EXTEND:
        fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
        if (fDuration<6.0) fDuration = 6.0;
    break;
    case METAMAGIC_MAXIMIZE:
        fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
        if (fDuration<3.0) fDuration = 3.0;
    break;
    default:
        fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
        if (fDuration<3.0) fDuration = 3.0;
    break;
    }
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous rend confus pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectConfused(),oMage,fDuration*6.0);
}

void aveugle(object oMage)
{
  int nVfxGenreRace;
  if (GetGender(oMage) == GENDER_FEMALE)
  {
        switch (GetRacialType(oMage))
        {
        case RACIAL_TYPE_HUMAN:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_FEMALE;
            break;
        case RACIAL_TYPE_ELF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_FEMALE;
            break;
        case RACIAL_TYPE_HALFORC:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_FEMALE;
            break;
        case RACIAL_TYPE_HALFELF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_FEMALE;
            break;
        case RACIAL_TYPE_HALFLING:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_FEMALE;
            break;
        case RACIAL_TYPE_DWARF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_FEMALE;
            break;
        case RACIAL_TYPE_GNOME:
                nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_FEMALE;
            break;
        default:
                SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race  eu lieu. Merci de prevenir le MD Arfost le plus vite possible.");
            break;
        }
  }
  else
  {
        switch (GetRacialType(oMage))
        {
        case RACIAL_TYPE_HUMAN:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_MALE;
            break;
        case RACIAL_TYPE_ELF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_MALE;
            break;
        case RACIAL_TYPE_HALFORC:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_MALE;
            break;
        case RACIAL_TYPE_HALFELF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_MALE;
            break;
        case RACIAL_TYPE_HALFLING:
                nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_MALE;
            break;
        case RACIAL_TYPE_DWARF:
                nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_MALE;
            break;
        case RACIAL_TYPE_GNOME:
                nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_MALE;
            break;
        default:
                SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race  eu lieu. Merci de prevenir le MD Arfost le plus vite possible. C'est vrai quoi, ne pas avoir de race c'est le bordel.");
            break;
        }
  }
  effect eYeux = SupernaturalEffect(EffectVisualEffect(nVfxGenreRace));
  effect eBlindness = SupernaturalEffect(EffectBlindness());
  eBlindness  = EffectLinkEffects(eYeux,eBlindness);
  ApplyEffectToObject(DURATION_TYPE_PERMANENT,eBlindness,oMage);
  sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "vous sentez vos yeux vous bruler soudainement, puis tout deviens sombre autours de vous.";
}
void invocation (object oMage)
{

    effect eVis;
    string sBlueprint;
    location lLoc;
    lLoc = GetLocation(oMage);
    int iNbSpawn = d2(1);
    int i;
    for (i = 1; i <= iNbSpawn; i++)
    {
        switch (d10(1))
        {
        case 1:
                sBlueprint = "NW_S_SUCCUBUS";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
            break;
        case 2:
                sBlueprint = "NW_S_VROCK";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
            break;
        case 3:
                sBlueprint = "NW_S_CTRUMPET";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
            break;
        case 4:
                sBlueprint = "NW_S_SLAADDETH";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3,FALSE);
            break;
        case 5:
                sBlueprint = "NW_S_BALOR";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
            break;
        case 6:
                sBlueprint = "NW_S_SUCCUBUS";
                eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
            break;
        default:
            //
        break;
        }

        lLoc = Decalage(lLoc,8.0);
        ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,lLoc);
        CreateObject(OBJECT_TYPE_CREATURE,sBlueprint,lLoc,TRUE);
        sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "une legere faille s'ouvre sous vos yeux. Vous arrivez a la controler mais le temps que vous le fassiez quelques creatures en sont sortie.";
    }
}

void effe_lampion (object oMage)
{
    effect eVis = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE);
    eVis = SupernaturalEffect(eVis);
    int nDuration = GetCasterLevel(oMage);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eVis,oMage,TurnsToSeconds(nDuration));
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "la magie que vous tentiez de maitriser se concentre en vous et vous illumine d'une lueur etrange.";
}

void tele_self (object oMage)
{
    SetLocalInt(OBJECT_SELF,"nBugTeleporte",1);  //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
    effect eko = EffectKnockdown();
    AssignCommand(oMage, ClearAllActions(TRUE));
    AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),6.0)));
    //DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1))));        //Application du ko en commentaire
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez  une courte distance, sonne sous le choc.";
}

void tele_dime (object oMage)
{
    SetLocalInt(OBJECT_SELF,"nBugTeleporte",1);  //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
    effect eko = EffectKnockdown();
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),oMage);
    string sTag_dest = "WpTeleMage0"+IntToString(Random(6)+1);
    AssignCommand(oMage, ClearAllActions(TRUE));

    object oDest = GetObjectByTag(sTag_dest);  //solution de Flumby mise en oeuvre
    AssignCommand(oMage,JumpToLocation(GetLocation(oDest)));      //solution de Flumby mise en oeuvre
    //AssignCommand(oMage,JumpToObject(GetObjectByTag(sTag_dest)));  //tous les anciens essais
    //AssignCommand(oEntering,JumpToObject(GetObjectByTag(sWPTag)));
    //DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,1.0));      //Application du ko en commentaire
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez dans un endroit lointaint. Heureusement vos esprit vous reviennent tres rapidement.";
}

void lampion_disparition (object oMage)
{
    effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
    effect eVis2 = EffectVisualEffect(VFX_FNF_PWKILL);
    effect eInvi = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
    effect eInvi2 = EffectInvisibility(INVISIBILITY_TYPE_NORMAL);
    eInvi2 = EffectLinkEffects(eInvi,eInvi2);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oMage);
    DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis2,oMage));
    float fDelay;
    object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
    while (GetIsObjectValid(oTarget))
    {
          fDelay = GetRandomDelay(0.4, 1.2);
                if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
                {
                    //Apply death effect and the VFX impact
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oTarget, IntToFloat(d6(1))));
                }
      oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
    }
    DelayCommand(4.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInvi2,oMage,100.0+d100(1)));
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "... pouf";
}

void haunted (object oMage)
{
    location lLoc = GetLocation(oMage);
    string sFinTag = GetStringLeft(GetName(oMage),5);
    int nNbGhost = d4(1);
    int i;
    for (i = 1; i <nNbGhost; i++)
    {
        CreateObject(OBJECT_TYPE_CREATURE,"ameenpeine",Decalage(lLoc,10.0),FALSE,"ghost_"+sFinTag);
    }
    AdjustFactionReputation(GetObjectByTag("ghost_"+sFinTag),oMage,-50);
    SetLocalString(oMage,"sTagGhost","ghost_"+sFinTag);
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "des creatures ethere viennent vous hanter.";
}

void coupure_magie (object oMage)
{
    SetLocalInt(oMage,"nCoupMagi",1);
    sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'etrange impression d'un manque vous envahis.";
}

string sMessageEffetMagiqueIncontrole;

void main()
{

    int nEffet = GetLocalInt(OBJECT_SELF,"nEffet");
    sMessageEffetMagiqueIncontrole = "Pendant l'incantation vous perdez le controle de votre magie et ";
    if (nEffet == 0) nEffet = d12(1) + d10(1);

    switch (nEffet)
    {
    case 0:
        // statements ...
        // condition would also evaluate as true if x == 0, which should not happen . . .
        // but . . . lets put this in here just as a safety device Smile
        break;
    case 1:
        // statements ...
        // condition would also evaluate as true if x == 0, which should not happen . . .
        // but . . . lets put this in here just as a safety device Smile
        break;
    case 2:
            degats(OBJECT_SELF);
        break;
    case 3:
            degats(OBJECT_SELF);
        break;
    case 4:
            deat_soul(OBJECT_SELF);
        break;
    case 5:
            deat_implo(OBJECT_SELF);
        break;
    case 6:
            knoc_down(OBJECT_SELF);
        break;
    case 7:
            knoc_down(OBJECT_SELF);
        break;
    case 8:
            knoc_down(OBJECT_SELF);
        break;
    case 9:
            knoc_down(OBJECT_SELF);
        break;
    case 10:
            confused(OBJECT_SELF);
        break;
    case 11:
            confused(OBJECT_SELF);
        break;
    case 12:
            confused(OBJECT_SELF);
        break;
    case 13:
            confused(OBJECT_SELF);
        break;
    case 14:
            aveugle(OBJECT_SELF);
        break;
    case 15:
            aveugle(OBJECT_SELF);
        break;
    case 16:
            invocation(OBJECT_SELF);
        break;
    case 17:
            invocation(OBJECT_SELF);
        break;
    case 18:
            effe_lampion(OBJECT_SELF);
        break;
    case 19:
            effe_lampion(OBJECT_SELF);
        break;
    case 20:
            effe_lampion(OBJECT_SELF);
        break;
    case 21:
            effe_lampion(OBJECT_SELF);
        break;
    case 22:
            tele_dime(OBJECT_SELF);
        break;
    case 23:
            lampion_disparition(OBJECT_SELF);
        break;
    case 24:
            lampion_disparition(OBJECT_SELF);
        break;
    case 25:
            haunted(OBJECT_SELF);
        break;
    case 26:
            haunted(OBJECT_SELF);
        break;
    case 27:
            tele_self(OBJECT_SELF);
        break;
    case 28:
            //DelayCommand(1.8,tele_self(OBJECT_SELF));
            tele_self(OBJECT_SELF)
        break;
    case 29:
            //DelayCommand(1.8,tele_dime(OBJECT_SELF));
            tele_dime(OBJECT_SELF)
        break;
    case 30:
            coupure_magie(OBJECT_SELF);
        break;
    default:

        break;
    }
    SendMessageToPC(OBJECT_SELF,sMessageEffetMagiqueIncontrole);
}
Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.


Je vous livre ensuite le script de spell hooking

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
#include "x2_inc_switches"
#include "inc_perso"

void main()
{
 
  int nSpell = GetSpellId();

  // retourne le niveau du lanceur
  int nLevel = GetCasterLevel(OBJECT_SELF);

  // retourne la classe du lanceur
  int nClass = GetLastSpellCastClass();

 
  int nSpellDC = GetSpellSaveDC();

 
  location lLoc = GetSpellTargetLocation();

 
  object oCible = GetSpellTargetObject();

  // si un objet lance le sort, cette fonction retourne l'objet en question
  object oItemUsed = GetSpellCastItem();

 

  if(!GetLocalInt(OBJECT_SELF,"nBugTeleporte"))
  {
      SetActionMode(OBJECT_SELF,ACTION_MODE_EXPERTISE,FALSE);
      SetActionMode(OBJECT_SELF,ACTION_MODE_IMPROVED_EXPERTISE,FALSE);



          if (!GetLocalInt(OBJECT_SELF,"nSubit") && (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_ARCANE_ARCHER || nClass == CLASS_TYPE_ASSASSIN || nClass == CLASS_TYPE_OUTSIDER || nClass == CLASS_TYPE_PALE_MASTER || nClass == CLASS_TYPE_SORCERER || nClass == CLASS_TYPE_WIZARD) )
          {
            int nPuiss_magie = GetLocalInt(GetArea(OBJECT_SELF),"puiss_magie");
            if ((d100(1) < nPuiss_magie) || GetLocalInt(OBJECT_SELF,"nCoupMagi") == 1)
            {
                FloatingTextStringOnCreature("Vous n'arrivez pas percevoir une quantite de magie suffisante pour etre manipulee",OBJECT_SELF,FALSE);
            }
            else
            {
                string sPropID = Get2DAString("des_crft_spells","IPRP_SpellIndex",nSpell);
                int nInnateLevel = StringToInt(Get2DAString("des_crft_spells","Level",nSpell));
                int nPropID = StringToInt(sPropID);
                if (nPropID == 0)
                {
                    WriteTimestampedLogEntry("***X2UseMagicDevice (Warning): Found no property matching SpellID "+ IntToString(nSpell));
                }
                int nMeta = 0;
                if (GetMetaMagicFeat() != METAMAGIC_NONE) nMeta = d10(1);
                int nHasa = d6(2);
                int nModifJoueur = GetLocalInt(OBJECT_SELF,"nModiSecret");
                if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("Les valeurs sont: lvl de sort = ("+ IntToString(nInnateLevel)+") base du DD = (" + IntToString(20) +") jet de des au hasard (" + IntToString(nHasa)+") difficulte de metamagie = (" + IntToString(nMeta)+") modificateur de zone = (" + IntToString(nPuiss_magie) +")",OBJECT_SELF);
                if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("DD = ("+ IntToString(nInnateLevel + 20 + nHasa + nMeta + nPuiss_magie) +")",OBJECT_SELF);
                int nResult = check_comp(GetSkillRank(SKILL_SPELLCRAFT,OBJECT_SELF,FALSE),nInnateLevel + 20 + nHasa + nMeta + nPuiss_magie + nModifJoueur,OBJECT_SELF);
                if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("result = ("+IntToString(nResult)+")",OBJECT_SELF);
                if (nResult == -99){
                    SetModuleOverrideSpellScriptFinished();
                    ExecuteScript("nefa_magi",OBJECT_SELF);
                    }else if(nResult <=-5){
                        SetModuleOverrideSpellScriptFinished();
                        ExecuteScript("nefa_magi",OBJECT_SELF);
                        }else if (nResult <=0){
                            SetModuleOverrideSpellScriptFinished();
                            FloatingTextStringOnCreature("Vos talents vous font defauts. Vous n'arrivez pas a sculpter la magie et a produire un effet efficace.",OBJECT_SELF,FALSE);
                }
            }
        }
    }
    else
    {
        SetLocalInt(OBJECT_SELF,"nBugTeleporte",0);
        SetModuleOverrideSpellScriptFinished();
    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Voila les deux script en rapport avec l'affaire. Je vous met l'include du spell hooking en bonus au cas ou ça aurait un rapport

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
int check_comp (int nComp, int nDD, object oMage) //renvoie 1 en cas de reussite, 0 en echec, et 2 en echec critique.
{
    if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("tranfere comp = ("+IntToString(nComp)+") transfert DD = ("+IntToString(nDD)+")",oMage);
    int nDes = d20(1);
    if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("Jet de des = ("+IntToString(nDes)+")",oMage);
    if (nDes == 1) return -99;
    if (nDes == 20)return 99;
    int nMarge = nDes + nComp -nDD;
    return nMarge;
}

int check_carac (int nCarac, int nDD, object oMage) //renvoie 1 en cas de reussite, 0 en echec, et 2 en echec critique.
{
    if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("tranfere comp = ("+IntToString(nCarac)+") transfert DD = ("+IntToString(nDD)+")",oMage);
    int nDes = d10(1);
    if (GetLocalInt(GetModule(),"Debug")) FloatingTextStringOnCreature("Jet de des = ("+IntToString(nDes)+")",oMage);
    if (nDes == 1) return 99;
    if (nDes == 20)return -99;
    int nMarge = nDes + nCarac -nDD;
    return nMarge;
}

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Voila l'ensemble des scripts. Si vous trouviez une solution je vous jure que vous aurez une statue a votre nom sur le module ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 01/08/2007 20:18:01 Sujet du message :

(ps : outch... Ils sont vraiment hostiles mes scripts quand on les voient comme ça je trouve... Bon courage)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 01/08/2007 21:00:41 Sujet du message :

NWScript :
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Je vois pas pourquoi tu mets déjà OBJECT_SELF. oMage serait peut être mieux =) ... Tu demandes à mettre une local sur l'objet même... le problème, c'est que ton script là... il sait pas grand chose de ton objet. Et si j'suis à peu près ce que tu veux, c'est ton PJ (qui est donc oMage) qui bug. Il faut que tu saches que OBJECT_SELF ne renverra que par des rares occasions, aux joueurs. Si tu mets un script dans un dialogue, et que tu mets un objet représentant OBJECT_SELF, ça sera le PNJ de la conversation qui sera concerné, et non le joueur. Si tu mets un script dans le OnUsed d'un plaçable pour une téléportation ou autres effets, et que tu dis OBJECT_SELF, ça sera le plaçable qui est ciblé, et non celui qui va l'utiliser.

Bon je me demande si tu sais vraiment à quoi sert le spellhooking... Celui-ci s'enclenche que si le joueur LANCE un sort. Or, ici tu ne LANCE PAS un sort, mais tu crées un EFFET. Le SH ne fera donc aucun effet sur celui-ci.

Bon tu vas m'expliquer en détail, ce que tu veux que ton script fasse, tu me dis:

-Où il est placé ?
-Quel sont les effets à lancer ?
-Quel est le tag de destination ?
-Autres... ?

Je verrais pour faire 1 ou 2 tests chez moi, et je t'enverrais ce que j'ai fait.

EDIT: Evite les triples posts Wink
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 01/08/2007 22:32:39 Sujet du message :

Alors, pour le object_self je sais pas pourquoi j'ai mis ça, une etourderie. Je sais tres bien à quoi il se rapporte et dans quels cas. Le truc est que durant les tests ça a marché, pour ça que ça m'a echappé.

Ensuite oui je sais a quoi sert le spell hooking hein, j'ai etudié la chose avec precision. Je sais que ça a pas de rapport avec les effets mais les sorts. le truc c'est que justement mes effets intervienent apres un jet d'art de la magie raté via un test dans le spell hooking.

En gros je fais en sorte que chaque lancement de sort nessecite un jet d'art de la magie (connaissance des sorts dans la version française du jeu, mais c'est moche) et que si ce jet est raté de plus de 5 le joueur se prenne un des effets que j'ai fais dans le script avec les effets de teleportation.

J'ai donc mon script de spell hooking qui fais le test, et en cas de test raté j'ai le gros script avec tous les effets qui se lance et le joueur qui s'en prend plein la tronche.

Le script de spell hooking est placé nul part et est apellé par le module au lancement d'un sort. Le gros script avec tous les effets est placé nul part et est apellé par le spell hooking en cas d'echec. J'ai enfin le dernier petit script qui est un include permettant de faire des jets de comps et de caracs a ma sauce dans les scripts.

Les effets sont tous ceux dans le gros script ils sont tous parfaitement fonctionnels a part les deux qui teleportent. Je suis desolé j'avais mis des grosses lignes de commentaires pour qu'ils soient tres visibles mais visiblement j'ai du faire une fausse manip, elles ont disparue. Je vous remet le script avec les deux fonctions teleportant bien visible.

Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :

#include "X0_I0_SPELLS"

location Decalage(location lLoc, float fRayon = 10.0) //permet un decalage de 10 metre de rayon
{
vector vPos = GetPositionFromLocation(lLoc);

float fR = IntToFloat(Random(100)+1)/100 * fRayon; //Definition des coordonnes polaires du nouveau point
float fTheta = IntToFloat(Random(360));

vPos.x += fR*cos(fTheta); //Calcul des modifications faites aux coordonnes initiales
vPos.y += fR*sin(fTheta);

lLoc = Location(GetAreaFromLocation(lLoc), vPos, 0.0); //Redefinition de la location apres application du decalage

return lLoc;
}
//
//
// PREMIERE FONCTION TELEPORTATION BUGGEE
//
//
void tele_dime (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_LIGHTNING_M),oMage);
string sTag_dest = "WpTeleMage0"+IntToString(Random(6)+1);  // TAG DE DESTINATION
AssignCommand(oMage, ClearAllActions(TRUE));
object oDest = GetObjectByTag(sTag_dest); //solution de Flumby mise en oeuvre RECHERCHE DE L'OBJET VIA LE TAG
AssignCommand(oMage,JumpToLocation(GetLocation(oDest))); //solution de Flumby mise en oeuvre TELEPORTATION ELLE MEME
//AssignCommand(oMage,JumpToObject(GetObjectByTag(sTag_dest))); //tous les anciens essais
//AssignCommand(oEntering,JumpToObject(GetObjectByTag(sWPTag)));
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,1.0)); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez dans un endroit lointaint. Heureusement vos esprit vous reviennent tres rapidement.";
}
//
//
// SECONDE FONCTION TELEPORTATION BUGGE
//
//
void tele_self (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
AssignCommand(oMage, ClearAllActions(TRUE));
AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),6.0)));  TELEPORTATION PLUS OBTENTION DE LA LOCALISATION VIA LA FONCTION DECALAGE (QUI MARCHE) LA TELEPORTATION A LIEU SUR UNE LOCATION ALEATOIRE DANS UN RAYON DE 6 METRE AUTOUR DU MAGE
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1)))); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez une courte distance, sonne sous le choc.";
}

//
//
// FIN DES TELEPORTATIONS BUGGE, LE RESTE EST FONCTIONEL (CES FONCTIONS SONT APELLE DANS LE SWITCH DE LA FONCTION MAIN DE CE SCRIPT. ELLES SONT APELLE PAR UNE DES DERNIERE CONDITIONS)
//
//

void degats(object oMage)
{
effect eDam;
int nMetaMagic = GetMetaMagicFeat();
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
eDam = EffectDamage(d12(15),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
case METAMAGIC_MAXIMIZE:
eDam = EffectDamage(12*10,DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
default:
eDam = EffectDamage(d12(10),DAMAGE_TYPE_SLASHING,DAMAGE_POWER_PLUS_TWENTY);
break;
}

effect eVis = EffectVisualEffect(234);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et vous la sentez parcourir et dechirer votre corps.";
}

void deat_soul(object oMage)
{
effect eVis = EffectVisualEffect(VFX_IMP_DEATH_L);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oMage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous, vous sentez votre ame s'etirer et se tordre comme si l'on vous l'arrachait avant de vous effondrer, mort.";

}

void deat_implo(object oMage)
{
object oTarget;
float fDelay;
//effect eDeath = EffectDeath();
//eDeath = SupernaturalEffect(eDeath);
effect eImplode= EffectVisualEffect(VFX_FNF_IMPLOSION);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImplode, GetLocation(oMage));
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
fDelay = GetRandomDelay(0.4, 1.2);
//Make Constit save
if(!MySavingThrow(SAVING_THROW_FORT, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
{
//Apply death effect and the VFX impact
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe se retourne contre vous et dechiquete votre corps et tout ceux aleantours.";
}

void knoc_down(object oMage)
{
int nMetaMagic = GetMetaMagicFeat();
float fDuration;
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
case METAMAGIC_EXTEND:
fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<6.0) fDuration = 6.0;
break;
case METAMAGIC_MAXIMIZE:
fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<3.0) fDuration = 3.0;
break;
default:
fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous assome pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectStunned(),oMage,fDuration*6.0);
}

void confused(object oMage)
{
int nMetaMagic = GetMetaMagicFeat();
float fDuration;
switch (nMetaMagic)
{
case METAMAGIC_EMPOWER:
fDuration = (d6(3) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
case METAMAGIC_EXTEND:
fDuration = (d6(2)*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<6.0) fDuration = 6.0;
break;
case METAMAGIC_MAXIMIZE:
fDuration = (6*2.0 - GetAbilityModifier(ABILITY_CONSTITUTION,oMage));
if (fDuration<3.0) fDuration = 3.0;
break;
default:
fDuration = (d6(2) - GetAbilityModifier(ABILITY_CONSTITUTION,oMage))*1.0;
if (fDuration<3.0) fDuration = 3.0;
break;
}
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'energie qui vous echappe parcours votre corps et vous rend confus pour une courte duree (" +FloatToString(fDuration,2,0)+ " rounds)";
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectConfused(),oMage,fDuration*6.0);
}

void aveugle(object oMage)
{
int nVfxGenreRace;
if (GetGender(oMage) == GENDER_FEMALE)
{
switch (GetRacialType(oMage))
{
case RACIAL_TYPE_HUMAN:
nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_FEMALE;
break;
case RACIAL_TYPE_ELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_FEMALE;
break;
case RACIAL_TYPE_HALFORC:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_FEMALE;
break;
case RACIAL_TYPE_HALFELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_FEMALE;
break;
case RACIAL_TYPE_HALFLING:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_FEMALE;
break;
case RACIAL_TYPE_DWARF:
nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_FEMALE;
break;
case RACIAL_TYPE_GNOME:
nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_FEMALE;
break;
default:
SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race eu lieu. Merci de prevenir le MD Arfost le plus vite possible.");
break;
}
}
else
{
switch (GetRacialType(oMage))
{
case RACIAL_TYPE_HUMAN:
nVfxGenreRace = VFX_EYES_RED_FLAME_HUMAN_MALE;
break;
case RACIAL_TYPE_ELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_ELF_MALE;
break;
case RACIAL_TYPE_HALFORC:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFORC_MALE;
break;
case RACIAL_TYPE_HALFELF:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFELF_MALE;
break;
case RACIAL_TYPE_HALFLING:
nVfxGenreRace = VFX_EYES_RED_FLAME_HALFLING_MALE;
break;
case RACIAL_TYPE_DWARF:
nVfxGenreRace = VFX_EYES_RED_FLAME_DWARF_MALE;
break;
case RACIAL_TYPE_GNOME:
nVfxGenreRace = VFX_EYES_RED_FLAME_GNOME_MALE;
break;
default:
SendMessageToPC(OBJECT_SELF,"Une exception dans la determination de votre race eu lieu. Merci de prevenir le MD Arfost le plus vite possible. C'est vrai quoi, ne pas avoir de race c'est le bordel.");
break;
}
}
effect eYeux = SupernaturalEffect(EffectVisualEffect(nVfxGenreRace));
effect eBlindness = SupernaturalEffect(EffectBlindness());
eBlindness = EffectLinkEffects(eYeux,eBlindness);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eBlindness,oMage);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "vous sentez vos yeux vous bruler soudainement, puis tout deviens sombre autours de vous.";
}
void invocation (object oMage)
{

effect eVis;
string sBlueprint;
location lLoc;
lLoc = GetLocation(oMage);
int iNbSpawn = d2(1);
int i;
for (i = 1; i <= iNbSpawn; i++)
{
switch (d10(1))
{
case 1:
sBlueprint = "NW_S_SUCCUBUS";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 2:
sBlueprint = "NW_S_VROCK";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 3:
sBlueprint = "NW_S_CTRUMPET";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_CELESTIAL,FALSE);
break;
case 4:
sBlueprint = "NW_S_SLAADDETH";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3,FALSE);
break;
case 5:
sBlueprint = "NW_S_BALOR";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
break;
case 6:
sBlueprint = "NW_S_SUCCUBUS";
eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE,FALSE);
break;
default:
//
break;
}

lLoc = Decalage(lLoc,8.0);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eVis,lLoc);
CreateObject(OBJECT_TYPE_CREATURE,sBlueprint,lLoc,TRUE);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "une legere faille s'ouvre sous vos yeux. Vous arrivez a la controler mais le temps que vous le fassiez quelques creatures en sont sortie.";
}
}

void effe_lampion (object oMage)
{
effect eVis = EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE);
eVis = SupernaturalEffect(eVis);
int nDuration = GetCasterLevel(oMage);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eVis,oMage,TurnsToSeconds(nDuration));
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "la magie que vous tentiez de maitriser se concentre en vous et vous illumine d'une lueur etrange.";
}

void tele_self (object oMage)
{
SetLocalInt(OBJECT_SELF,"nBugTeleporte",1); //variable de bidouille pour couper les sorts dans le spell hooking et stopper le bug
effect eko = EffectKnockdown();
AssignCommand(oMage, ClearAllActions(TRUE));
AssignCommand(oMage,JumpToLocation(Decalage(GetLocation(oMage),6.0)));
//DelayCommand(0.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eko, oMage,IntToFloat(d6(1)))); //Application du ko en commentaire
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "sans que vous ayez le temps de comprendre vous vous teleportez une courte distance, sonne sous le choc.";
}

void lampion_disparition (object oMage)
{
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
effect eVis2 = EffectVisualEffect(VFX_FNF_PWKILL);
effect eInvi = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
effect eInvi2 = EffectInvisibility(INVISIBILITY_TYPE_NORMAL);
eInvi2 = EffectLinkEffects(eInvi,eInvi2);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oMage);
DelayCommand(2.0,ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis2,oMage));
float fDelay;
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, GetLocation(oMage),FALSE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
fDelay = GetRandomDelay(0.4, 1.2);
if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, 30, SAVING_THROW_TYPE_CHAOS, OBJECT_SELF, fDelay))
{
//Apply death effect and the VFX impact
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(), oTarget, IntToFloat(d6(1))));
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, GetLocation(oMage));
}
DelayCommand(4.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eInvi2,oMage,100.0+d100(1)));
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "... pouf";
}

void haunted (object oMage)
{
location lLoc = GetLocation(oMage);
string sFinTag = GetStringLeft(GetName(oMage),5);
int nNbGhost = d4(1);
int i;
for (i = 1; i <nNbGhost; i++)
{
CreateObject(OBJECT_TYPE_CREATURE,"ameenpeine",Decalage(lLoc,10.0),FALSE,"ghost_"+sFinTag);
}
AdjustFactionReputation(GetObjectByTag("ghost_"+sFinTag),oMage,-50);
SetLocalString(oMage,"sTagGhost","ghost_"+sFinTag);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "des creatures ethere viennent vous hanter.";
}

void coupure_magie (object oMage)
{
SetLocalInt(oMage,"nCoupMagi",1);
sMessageEffetMagiqueIncontrole = sMessageEffetMagiqueIncontrole + "l'etrange impression d'un manque vous envahis.";
}

string sMessageEffetMagiqueIncontrole;

void main()
{

int nEffet = GetLocalInt(OBJECT_SELF,"nEffet");
sMessageEffetMagiqueIncontrole = "Pendant l'incantation vous perdez le controle de votre magie et ";
if (nEffet == 0) nEffet = d12(1) + d10(1);

switch (nEffet)
{
case 0:
// statements ...
// condition would also evaluate as true if x == 0, which should not happen . . .
// but . . . lets put this in here just as a safety device Smile
break;
case 1:
// statements ...
// condition would also evaluate as true if x == 0, which should not happen . . .
// but . . . lets put this in here just as a safety device Smile
break;
case 2:
degats(OBJECT_SELF);
break;
case 3:
degats(OBJECT_SELF);
break;
case 4:
deat_soul(OBJECT_SELF);
break;
case 5:
deat_implo(OBJECT_SELF);
break;
case 6:
knoc_down(OBJECT_SELF);
break;
case 7:
knoc_down(OBJECT_SELF);
break;
case 8:
knoc_down(OBJECT_SELF);
break;
case 9:
knoc_down(OBJECT_SELF);
break;
case 10:
confused(OBJECT_SELF);
break;
case 11:
confused(OBJECT_SELF);
break;
case 12:
confused(OBJECT_SELF);
break;
case 13:
confused(OBJECT_SELF);
break;
case 14:
aveugle(OBJECT_SELF);
break;
case 15:
aveugle(OBJECT_SELF);
break;
case 16:
invocation(OBJECT_SELF);
break;
case 17:
invocation(OBJECT_SELF);
break;
case 18:
effe_lampion(OBJECT_SELF);
break;
case 19:
effe_lampion(OBJECT_SELF);
break;
case 20:
effe_lampion(OBJECT_SELF);
break;
case 21:
effe_lampion(OBJECT_SELF);
break;
case 22:
tele_dime(OBJECT_SELF);
break;
case 23:
lampion_disparition(OBJECT_SELF);
break;
case 24:
lampion_disparition(OBJECT_SELF);
break;
case 25:
haunted(OBJECT_SELF);
break;
case 26:
haunted(OBJECT_SELF);
break;
case 27:
tele_self(OBJECT_SELF);
break;
case 28:
//DelayCommand(1.8,tele_self(OBJECT_SELF));
tele_self(OBJECT_SELF)
break;
case 29:
//DelayCommand(1.8,tele_dime(OBJECT_SELF));
tele_dime(OBJECT_SELF)
break;
case 30:
coupure_magie(OBJECT_SELF);
break;
default:

break;
}
SendMessageToPC(OBJECT_SELF,sMessageEffetMagiqueIncontrole);
}
Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.


Voila ça devrait etre plus clair cette fois. Le probleme est donc maintenant (car avec les effets ko en delay la teleportation marche) qu'il relance le sort apres chaque teleportation. En gros il commence a lancer son sort, le spellhooking le coupe et lance l'effet teleportation (n'importe lequel des deux, puisque je peux bloquer mes scripts pour les tests sur un effet en particulier) une fois la teleportation faite il relance le sort, et ainsi de suite... Pour l'instant je coupe le deuxieme lancement dans le spellhooking via la variable "nBugTeleportation" ainsi le script fonctionne, mais ça fait moche car on voit deux fois l'animation de sort coupée, et on à deux fois le message "machin lance tel sort" en plus le deuxieme passage sur le spellhooking et la variable bouffent de la ressource pour pas grand chose.

Donc la question c'est : Y'a-t-il un moyen autre qu'un delay de 2 secondes sur l'apelle de l'effet de teleportation (qui est vraiment laid car le mage reste la sans bouger 2 secondes avant de se tp) ou la bidouille que j'ai faite pour empecher le mage de relancer son sort
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 02/08/2007 12:50:43 Sujet du message :

J'ai toujours pas compris ... tu m'escuseras mais tu me perds la :s

Tu dis comprendre le spellhooking, mais tu parles toujours de lancé un sort. Or il n'y que des effets. De plus, ton test là, on s'en moque du spellhooking, pourquoi il interviendrait? Tu nous as toujours pas dit (ou alors j'ai raté) ou était placé ce script... Car si tu parles de test via un script (examiner les connaissances, versus un jet, etc...) alors le SH n'interviendra pas. Et j'crois que tu parles de ça, parce que j'ai pas vu à un moment ou le personnage LANCE un sort (donc via un script de SORT et non pas un script dans un OnUsed, un Dialogue ou autre... (à moins d'utiliser la fonction CastSpell (un truc comme ça), mais je l'ais pas vu)).

Donc ça peut pas provenir du spellhooking, ou alors j'ai rien compris à ce que tu demandais ... désolé. Bon j'essaie de faire un truc rapide, sans l'éditeur, tu me dis si ça peut être bon, sinon bein désolé, faut que j'comprenne un minimum quoi Confused

NWScript :
void BK_Teleport(object oMage, string sDest);
void BK_Teleport(object oMage, string sDest)
{
//sDest = "WpTeleMage01" //*1
object oWayp = GetWaypointByTag(sDest);
location lWayp = GetLocation(oWayp);
effect eKnock = EffectKnockdown(); //*2
effect eLight = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLight, oMage);
AssignCommand(oMage, JumpToLocation(lWayp));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oMage, 1.0);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


*1 t'enlèves les "//" au début si tu veux que ce soit un tag précis (donc pas la peine de mettre sDest dans la fonction. Par contre, j'te conseil de tester déjà sur UN waypoint, et non faire un truc aléatoire, si ça marche, alors là, tu fais avec un chiffre aléatoire.

*2 alors, j'suppose que c'est sur cette fonction que tu situes le spellhooking. Franchement, j'pourrais pas te répondre, mais vu les circonstances de ton script, ce sort n'est lancé que par le module, et non par le joueur, donc le SH ne devrait pas fonctionner, enfin pas fonctionner directement sur le joueur.

Test déjà avec ça. J'peux faire que ça pour l'instant, la j'suis épuisé, il se peut que j'ai du mal à comprendre, tu me diras ça se soir, ou demain après midi. La j'viens de finir mon BSR j'l'ais, et j'suis K.O. Embarassed

En passant, dans ta fonction ... tele_dime tu as 2 teleportations (tu les as mises en commentaire, mais j'te le dis quand même) :
- Une téléporte à sTag_dest, qui est donc WpTeleMage0x
- L'autre est sWPTag, mais n'apparait pas dans le script... normal?
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 02/08/2007 23:38:18 Sujet du message :

Le spell hooking c'est bien une maniere d'executer un script à chaque lancement de sort ? En tout cas c'est ça que j'ai compris et c'est comme ça que je l'utilise. Et dans mon script de spell hooking je fais le test d'art de la magie et je lance le script avec tous les effets (via un ExecuteScript) si le jet est un echec.

Les scripts sont donc nul part, y'en a un il s'execute a chaque lancement de sort et l'autre il est apellé par le premier en cas de besoin (d'echec avec une marge de 5 au jet d'art de la magie) c'est pour ça que j'ai pas dit ou ils étaient.

Les effets interviennent au lancement de sort. En fait le joueur lance un sort, le spellhooking se lance et il lance le script avec les effets.
Le spell hooking intervient parce que c'est lui qui lance le script avec les effets (via un ExecuteScript) donc a chaque execution du script avec les effets le spell hooking est forcement passé avant (puisque c'est lui qui le lance, et rien d'autre) voila pourquoi le script de spell hooking est important.

Je suis desolé je crois que j'arriverais pas a etre vraiment clair en expliquant comme ça. Je tente une autre maniere.

Le joueur lance un sort (n'importe lequel, a chaque lancement de sort fait par un joueur ça se lance.) => le Spellhooking se lance. => Si le jet est raté le spellhooking apelle le script avec les effets (via un ExecuteScript) et normalement ça s'arette la.
Le probleme c'est qu'avec les teleportations le joueur relance son sort derriere automatiquement donc tout recommence (spell hooking => script avec les effets => teleportation => relancement de sort a cause du bug => respellhooking => re script avec les effets => reteleportation, et ainsi de suite...) La question est donc, comment faire pour empecher qu'il relance le sort juste apres s'etre teleporté (sachant qu'un delay command de deux secondes ça marche, ainsi qu'une variable dans le spell hooking qui coupe le sort avant meme de faire les tests si elle est presente mais c'est moche dans les deux cas)

Ce qui fait que tu as du mal à comprendre c'est peut-etre que ce script modifie le lancement de sort pour never. Sur notre module la magie est beaucoup plus chaotique et dangeureuse que dans les ROs, pour representé ça j'ai scripté les effets qui risquent de se declencher à chaque lancement de sort.

Sinon pour la variable qui change de nom c'est rien, j'ai du faire des tests en changeant le nom de la variable.

Et felicitation pour le BSR ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 03/08/2007 12:21:12 Sujet du message :

Ok la je comprends mieux maintenant ^^

Bon je suis entrain de voir tes scripts sur l'éditeur, le problème c'est que j'ai pas leur nom mais pas grave.

Bon, je vois réellement d'erreur, tu stop bien le sort, et tu executes le script juste après.

Mais, on va voir pour tester un ou deux truc:

- Quand tu as un echec, essaie de voir pour :
-->1: Arrêter le sort
-->2: Faire une petite attente de 1 seconde, ou 0.5 secondes. (Tu as qu'à mettre un effet pour pas rendre le personnage "inutile" pendant ce petit temps)

- As tu essayé de changer le OBJECT_SELF comme je te l'ais dit? Car ça marchera surement pas de stopper le SH, vu que OBJECT_SELF ne represente personne (enfin je crois). Ou au pire tu utilises la fonction comme ça, si tu sais vraiment pas comment faire:

SetLocalInt(GetModule(), "P_"+GetName(oMage), x);

En esperant ne pas avoir de joueur ayant le même nom Embarassed

Sinon, franchement, je vois pas quoi faire Confused Enlever la fonction? :s
_________________
[http]
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Flumby
Chevalier
Inscrit le: 01 Juin 2006
Messages: 71
Répondre en citant
Posté le : 05/08/2007 18:27:00 Sujet du message :

Pour voir a quoi correspond les object_self et voir comment réagit le script, je pense qu'il faille que tu laisses des "marqueur" pour voir l'état des variables dans un log ou en jeu. L'idéal serait d'user du spawnscriptdebugger.

tu as un petit tutoriel la : [http]
_________________
Premier DM a avoir inauguré la chute d'auberge sur Joueur rebel

Preuve Smile => http:
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
arfost
Acolyte
Inscrit le: 24 Fév 2007
Messages: 20
Répondre en citant
Posté le : 07/08/2007 13:10:25 Sujet du message :

Desole d'avoir mis autant de temps a repondre. J'ai des gros problemes avec mon pc (enfin j'avais, maintenant il est tout vide mais il remarche, format power)

Donc les OBJECT_SELF dans la fonctions ils marchent, visiblement OBJECT_SELF reste vrai pour tout le script, fonctions comprises et je me suis fais chier à les transmettre en argumant pour rien via le oMage. Vous me conseillez de refaire tout les scripts avec ou pas ?

Sinon pour le bug qui relance le sort apres un appel des fonctions JumpToXXXX plus je teste plus je me rend compte que ça doit etre un bug dans le moteur du jeu. Je crois que la seule solution si je veux un script propre va être de suivre le conseil de Black Knight... Supprimer les fonctions.

Reste à voir si il vaut mieu une teleportation avec des messages en trop et une animation un peu foireuse ou pas de teleportation. J'en discuterais avec mon co-admin.

Merci a tous pour votre aide.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 28/12/2008 01:41:39 Sujet du message :


Citation :
string sTag_dest = "wp_tele_mage_0"+IntToString(Random(6)+1);
j'aimerais qu'on m'éclaire sur un point. le random(6) veux dire qu'il aura 6 possibilité comme pour un nRandom=d6();

mais le +1.....il fait quoi lui? même dans les tuto on en parle pas.

comme pour moi j'voulais faire un choix de 20 endroits différents. donc j'ai intégré la fonction:

NWScript :
string sTag_dest = "CRYPT_0"+IntToString(Random(20)+1);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


mais ce serait bien de savoir que fout mon +1....
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 28/12/2008 14:05:47 Sujet du message :

Tu pouvais tester en jeu avec des fonction tel que SpeakString ou FloatingTextString pour voir en jeu ce que ça donne, en général c'est assez simple et rapide.

Ici c'est juste l'étendu qui change, exemple :

Random(6) : 0 à 5 (6 valeurs)
Random(6)+1 : 1 à 6
d6() : 1 à 6

Donc quand on utilise le Random, on fait +1 lorsqu'on utilise pas le 0, la fonction dX() est d'ailleur basé sur ce fonctionnement.
_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 31/12/2008 22:55:03 Sujet du message :

 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 118.965ms