Désactiver Arrêt du Temps

Répondre
Partager Rechercher
Bon, j'ai bidouillé un peu pour que l'on puisse désactiver le sort Arrêt du Temps aux PJs. C'est utile pour les univers permanent ou les modules de fort passage.

Le script gerant Arrêt du Temps est dans NW_S0_TimeStop.nss, et se présente sous cette forme :
Code PHP:

//:://///////////////////////////////////////////// 
//:: Time Stop 
//:: NW_S0_TimeStop.nss 
//:: Copyright (c) 2001 Bioware Corp. 
//::////////////////////////////////////////////// 
/* 
    All persons in the Area are frozen in time 
    except the caster. 
*/ 
//::////////////////////////////////////////////// 
//:: Created By: Preston Watamaniuk 
//:: Created On: Jan 7, 2002 
//::////////////////////////////////////////////// 
 
void main() 

    
//Declare major variables 
    
location lTarget GetSpellTargetLocation(); 
    
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP); 
    
effect eTime EffectTimeStop(); 
    
int nRoll d4(); 
 
    
//Fire cast spell at event for the specified target 
    
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE)); 
 
    
//Apply the VFX impact and effects 
    
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELF9.0)); 
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget); 

On nottera d'ailleurs une faute, le sort ne tient pas compte de la variation de durée du sort qui est pourtant tirée (Variable nRoll).

Voici ma version, interdisant l'utilisation de ce sort (autant par Parchemin que par Magie ou Metamagie) aux PJs et corrigeant la faute de script :
Code PHP:

//::///////////////////////////////////////////////
//:: Time Stop
//:: NW_S0_TimeStop.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    All persons in the Area are frozen in time
    except the caster.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 7, 2002
//:: Updated By: Kray
//:: Updated On: 15/07/2002
//:://////////////////////////////////////////////

void main()
{
    
object oPC OBJECT_SELF;
    if(
GetIsDM(oPC))
    {
        
//Declare major variables
        
location lTarget GetSpellTargetLocation();
        
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);
        
effect eTime EffectTimeStop();
        
int nRoll d4();
        
float fDuration IntToFloat(nRoll) + 9.0f;

        
//Fire cast spell at event for the specified target
        
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE));

        
//Apply the VFX impact and effects
        
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELFfDuration));
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
    }
    else
    {
        
SendMessageToPC(oPC,"Arret du Temps est désactivé sur ce module");
    }

J'espère que ça pourra servir

Edité:
Tant que j'y suis, voici le script laissant le sort public mais corrigeant la faute de BioWare :
Code PHP:

//:://///////////////////////////////////////////// 
//:: Time Stop 
//:: NW_S0_TimeStop.nss 
//:: Copyright (c) 2001 Bioware Corp. 
//::////////////////////////////////////////////// 
/* 
    All persons in the Area are frozen in time 
    except the caster. 
*/ 
//::////////////////////////////////////////////// 
//:: Created By: Preston Watamaniuk 
//:: Created On: Jan 7, 2002 
//:: Updated By: Kray
//:: Updated On: 14/07/2002
//::////////////////////////////////////////////// 
 
void main() 

    
//Declare major variables 
    
location lTarget GetSpellTargetLocation(); 
    
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP); 
    
effect eTime EffectTimeStop(); 
    
int nRoll d4(); 
    
float fDuration IntToFloat(nRoll) + 9.0f;
 
    
//Fire cast spell at event for the specified target 
    
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE)); 
 
    
//Apply the VFX impact and effects 
    
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELFfDuration)); 
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget); 

[Message effacé à la demande de l'auteur]
[Message effacé à la demande de l'auteur]
Citation :
Provient du message de Lumina
Si vous etes si pointilleux que ça sur les règles, vous devriez mettre les "rest" pour une durée de 2 heures réelles plutot que 30 secondes.
Mais... Le rest est désactivé sur Althea

Le repos se fait uniquement dans les auberges, ou dans les tentes portables, auquel cas le joueur se doit d'y attendre deux heures
la récupération de sorts ........
livre add3 edition :

I]"Le magicien ne peut préparer ses sorts que s'il est frais et dispos, état qu'il ateint après 8 heures de sommeil .Il n'est pas obligé de dormir durant ce temps "[/I]
Mais tout déplacement , incantation, combat , utilisation de compétence et tout efforts fatiguant lui est interdit

8 heures sans bouger le temps va etre long
Pour Ceux que ca interesse de posseder quand meme le time stop, tout en gardant un gestion pas trop encombrante sur un monde persistant :

Code PHP:

void main()
{
    
object oPC OBJECT_SELF;

        
//Declare major variables
        
location lTarget GetSpellTargetLocation();
        
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);
        
effect eTime EffectTimeStop();
        
int nRoll d4();
        
float fDuration IntToFloat(nRoll) + 9.0f;

    if ((!
GetIsPC(oPC))||GetIsDM(oPC))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE));

        
//Apply the VFX impact and effects
        
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELFfDuration));
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
    }
    else
    {
    
int nNBCreature GetHitDice(oPC);
    
int nNBDone 1;
    
object oCible;

    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
        while (
nNBCreature 0)
            {
            
oCible GetNearestObject(OBJECT_TYPE_CREATURE,oPC,nNBDone);
            
//if (GetIsPC(oCible)){                                     //DECOMMENT ME
            //ApplyEffectToObject(DURATION_TYPE_TEMPORARY,ExtraordinaryEffect(EffectSlow()),oCible,fDuration);                                     //DECOMMENT ME
            //ApplyEffectToObject(DURATION_TYPE_TEMPORARY,ExtraordinaryEffect(EffectSilence()),oCible,fDuration);                                     //DECOMMENT ME
            //} else {                                     //DECOMMENT ME
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,ExtraordinaryEffect(EffectParalyze()),oCible,fDuration);
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,ExtraordinaryEffect(EffectSilence()),oCible,fDuration);
            
//}                                     //DECOMMENT ME
            
nNBDone nNBDone+1;
            
nNBCreature nNBCreature-1;
            }
    }

Voila. Si vous ne decommentez pas les lignes //DECOMMENT ME, alors vos joueurs pourront continuer a lancer arret du temps, mais cela ne freezera que les creature alentours, pour un maximum de <magelevel> creature.

[EDIT : En Cours : erreur de syntaxe]
Si vous decommentez ces lignes, alors les autres joueurs seront affectes, mais seulement ralentis. Ca me semble un peu trop puissant, du coup, le time stop.

A noter que dans les 2 cas, si le tag de la creature est "NO_TIME_STOP", alors le sort ne fonctionnera pas sur lui.
Citation :
Provient du message de Kray&amp;Ravendas
Mais... Le rest est désactivé sur Althea

Le repos se fait uniquement dans les auberges, ou dans les tentes portables, auquel cas le joueur se doit d'y attendre deux heures
Euh... ce que Kray veut dire, c'est que le repos n'est pas autorisé dans un endroit ou logiquement il n'est pas possible de se reposer, il serait saugrenu de planter sa tente en pleine ville

Il est toutefois possible de se reposer n'importe où pour autant qu'aucune menace ne l'empêche et qu'on dispose des objets magiques ad-hoc.

Il s'agit donc d'une implémentation à mi-chemin entre le NWN de base (où le mage est un orgue de Staline) et les règles de D&D (où il faut passer une nuit pour se reposer, ce qui se fait généralement en 10 secondes en le disant au DM qui tire son jet de rencontre, mais soit...).

QUant à l'arrêt du temps, ben une fois n'est pas coutume, je vais plutôt être de l'avis de Raistlin.
Flinguer un des rarissimes sorts niveau IX du mage... pas cool...
La version que j'utilise actuellement :

Code PHP:

//#include "ro_generic"
 
void main()
{
/*
//BlueGem Consomation -- "Blue Gemstone"
object oGEMBLUE;
int nGem = 0;
if (GetIsPC(OBJECT_SELF)==FALSE) //||(GetIsNvnRoDM(OBJECT_SELF)==TRUE)) Ici, je verifie si le joueur est un Joueur non MD. Si oui, alors on lui prend une Gemme
    {
    nGem = 1;
    }
if (nGem==1)
    {
    object oGem = GetFirstItemInInventory(OBJECT_SELF);
    while (GetIsObjectValid(oGem))
        {
        if (GetName(oGem)== "Blue Gemstone") // Comparaison avec le nom et pas le tag : le tag me sert au calcul de la rarete
            {
            oGEMBLUE = oGem;
            break;
            }
        oGem = GetNextItemInInventory(OBJECT_SELF);
        }
    if (GetIsObjectValid(oGEMBLUE))
        {
        int nStack = GetNumStackedItems(oGEMBLUE);
        DestroyObject(oGEMBLUE);
        if (nStack>1)
            {
            CreateItemOnObject("bluegemstone",OBJECT_SELF,nStack-1); //ATTENTION AU RESREF de la Gem, ici
            }
        nGem = 1;
        }
    }
if (ngem==0)
    {
    SendMessageToPC(OBJECT_SELF,"You do not have the Blue Gem needed to cast this spell");
    return;
    }
*/
/*
int GetNbCreature(object oArea)
{
object oTest = GetFirstObjectInArea(oArea);
int nNb = 0;
while (GetIsObjectValid(oTest))
    {
    if (GetObjectType(oTest)==OBJECT_TYPE_CREATURE)
        {
        nNb ++;
        }
    oTest = GetNextObjectInArea(oArea);
    }
return nNb;
*/
 
//SCRIPT TIMESTOP
    
object oPC OBJECT_SELF;
 
        
//Declare major variables
        
location lTarget GetSpellTargetLocation();
        
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);
        
effect eTime EffectTimeStop();
        
int nRoll d4();
        
float fDuration IntToFloat(nRoll) + 9.0f;
 
    if (
GetIsDM(oPC))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE));
 
        
//Apply the VFX impact and effects
        
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELFfDuration));
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
    }
    else
    {
    
int nNBCreature GetHitDice(oPC); //Je gere avec le nombre de dés de vie du Perso le nombre de créature stoppées par timeStop
            //Ceux qui veulent toute la zone, il suffit de remplacer GetHitDice par la fonction GetNbCreature(GetArea(OBJECT_SELF)) que j'ai commentée au dessus de timeStop
    
int nNBDone 1;
    
object oCible;
    
effect eFX;
 
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
        while (
nNBCreature 0)
            {
            
oCible GetNearestObject(OBJECT_TYPE_CREATURE,oPC,nNBDone);
            
eFX GetFirstEffect(oCible);
 
            
AssignCommand(oCible,ClearAllActions());
 
            
DelayCommand(0.2,SetCommandable(FALSE,oCible));
 
            
DelayCommand(fDuration,SetCommandable(TRUE,oCible));
 
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE),oCible,fDuration);
            
nNBDone nNBDone+1;
            
nNBCreature nNBCreature-1;
            }
    }

Des fois que ca serve ^^
Whouaou

C'est quoi ce sujet?!? Il est tout vieux, il sent le renfermé, ya des toiles d'araignées partout!

Que des gens qu'on ne voit plus lol

...
Il m'ont tous laissé tomber OOouiinn

M'en fout, je vais faire la grève des vieux NA!
Que tout ceux qui étaient sur les forums Nw JOL depuis 2000 me rejoignent!! Gniark gniark




Em, tu utilise des composantes sur Ragnarok?!
Ça doit être terriblement ennuyant de refaire tous les scripts de sort...
toute facon, j'ai mis sous commentaire le include #ro_generic, mais dedans, y'a un calcul de l'attaque magique.

J'ai refait toutes les regles du jeu, donc j'ai dut refaire tous les sorts du jeu (j'en ai meme rajoute une 40aine au passage ^^)

C'est un peu fastidieux, mais le resultat est la

(PS : et timestop, comme certains autres sort de level 9 que j'ai crée, ainsi que resurection et invisibilité, sont soumis a la consomation d'un Gemstone,qui est assez simple a trouver, mais limite quand meme un peu l'utilisation de ces sorts puissants mais un peu desequilibrants... Y'a qu'a voir Invisibilité : soit tu met True Sight a tout tes monstres, soit un mage de niveau 7 peu tranquillement se ballader dans la grotte d'un dragon... :/)

[PUB PERSO]
Bein, vient essayer : click sur ma sign
[/PUB PERSO]
Citation :
Provient du message de Skanzo Sylan
Whouaou

C'est quoi ce sujet?!? Il est tout vieux, il sent le renfermé, ya des toiles d'araignées partout!

Que des gens qu'on ne voit plus lol

...
Il m'ont tous laissé tomber OOouiinn

M'en fout, je vais faire la grève des vieux NA!
Que tout ceux qui étaient sur les forums Nw JOL depuis 2000 me rejoignent!! Gniark gniark




Em, tu utilise des composantes sur Ragnarok?!
Ça doit être terriblement ennuyant de refaire tous les scripts de sort...
Sniifff, bon ba je ne pourrai pas venir , je suis sur le forum de Jol que depuis 5 mois lol

Donc Tant pis ..... c'est pas grâve lol.
Bah si on compte mes brefs passages au temps de BG2, ça doit passer
Mais NWN n'est sorti que depuis moins d'un an donc...

Et puis personne ne t'a laissé tomber, sisi, je t'assure, ils vont revenir !
Version que j'utilise actuellement (depuis l'ajout de EffectParalyse)

Code PHP:

//#include "ro_generic"

void main()
{
//BlueGem Consomation -- "Blue Gemstone"
/*
if (BlueGem(1,OBJECT_SELF)==FALSE)
    {
    SendMessageToPC(OBJECT_SELF,"You do not have the Blue Gem needed to cast this spell");
    return;
    }
*/
//SCRIPT TIMESTOP
    
object oPC OBJECT_SELF;

        
//Declare major variables
        
location lTarget GetSpellTargetLocation();
        
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);
        
effect eTime EffectTimeStop();
        
int nRoll d4();
/*
////////////////////////////////////////////////////////////////
//:MODIF 2-2 HERE
///////////////////////////////////////////////////////////////
                if ((GetIsSecondClass(OBJECT_SELF,10)==TRUE) || (GetIsSecondClass(OBJECT_SELF,9)==TRUE))
                    {
                    nRoll = nRoll*3/2;
                    }
*/
        
float fDuration IntToFloat(nRoll) + 9.0f;

    if (
GetIsDM(oPC))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE));

        
//Apply the VFX impact and effects
        
DelayCommand(0.75ApplyEffectToObject(DURATION_TYPE_TEMPORARYeTimeOBJECT_SELFfDuration));
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
    }
    else
    {
    
int nNBCreature GetHitDice(oPC)*3/2;
    
int nNBDone 1;
    
object oCible;
//    effect eFX;
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);
        while (
nNBCreature 0)
            {
            
oCible GetNearestObject(OBJECT_TYPE_CREATURE,oPC,nNBDone);
//            eFX = GetFirstEffect(oCible);
//            AssignCommand(oCible,ClearAllActions());
//            DelayCommand(0.2,SetCommandable(FALSE,oCible));
//            DelayCommand(fDuration,SetCommandable(TRUE,oCible));
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneParalyze(),oCible,fDuration);
            
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE),oCible,fDuration);
            
nNBDone nNBDone+1;
            
nNBCreature nNBCreature-1;
            }
    }

voila.
J'aimerais bien que tu m'expliques comment ça marche ton script à base de gemmes bleues...ça m'intéresse...
Peut-on utiliser ce script pour d'autres sorts ?
Ou met-on ce script ?
Qu'est ce que le ro_include ?

Merci d'avance pour ta réponse eMRaistlin
En fait il s'agit de lancer un sort si le magicien/ensorceleur possède un objet précis.

Donc il suffit de rajouter une condition dans le script du sort :...

object oGemme = GetItemPossessedBy(OBJECT_SELF,"GemmeBleue");
if(GetIsObjectValid(oGemme))
{... ... ...

...pour que le sort s'exécute. Si c'est le cas, on détruit l'objet en question :

DestroyObject(oGemme);
Euh ça dépend, en fait, la modification que j'ai proposé est juste un palliatif très simple, plutôt qu'une modification du sort dans son intégralité, je planifie de refaire ce sort pour mon module, d'ailleurs.

La version de eMRaistlin est plus aboutie de ce côté là, mais les lignes utiles à la vérification de la présence d'une gemme, puis à son élimination, sont en fait commentées ( mises après "//" ). Je n'ai regardé que rapidement mais il te suffit de supprimer les "//" devant chaque ligne de codes, ou alors les "/* ... ... */" qui entourent une suite de lignes de codes, pour rendre ces lignes actives dans le script.

En ce qui concerne l'include, les fonction auxquelles il ferait référence sont apparemment définies dans le script qu'il a posté. J'ai cru distinguer la fonction "int GetNbCreature(object oArea)", qui gère la paralysie de toutes les créature d'une zone entière, ainsi que la consommation de la gemme qui se fait dès le début du script, jusqu'à la définition de la fonction "GetNbCreature".

Après c'est à ta convenance. eMRaistlin propose deux possibilités : l'une gèle toutes les créatures dans toute la zone, l'autre agit comme une aire d'effet, gelant toutes les créatures se trouvant jusqu'à une certaine distance du lanceur de sort.

Si tu préfères garder le sort original, mais le restreindre à un sacrifice d'objet, la condition que j'ai proposée trois posts plus haut suffira. Mais bien sûr, il restera une plaie pour un module multijoueur.

Je suppose que ce qui t'intéresse, c'est surtout la consommation de l'objet. Je te remets le script de eMRaistlin légèrement modifié. Non pas qu'il ne soit pas bien mais pour te donner une autre manière de le scripter, quoi qu'il en soit le résultat reste le même :
Code PHP:

void main() 

    
// On verifie que le personnage ne soit ni une IA, ni un MD. Puis on lui prend une gemme s'il en a au moins une.
    
if(GetIsPC(OBJECT_SELF))
    { 
        
object oGem GetItemPossessedBy("TagDeLaGemme"); 
        if(
GetIsObjectValid(oGem))
        { 
            
int nStack GetNumStackedItems(oGem);
            if(
nStack>1)
            {
                
SetItemStackSize(oGem,nStack-1);
            }
            else
            {
                
DestroyObject(oGem);
            }
        }
        else
        {
            
SendMessageToPC(OBJECT_SELF,"Vous n'avez pas la gemme vous permettant de lancer ce sort");
            return;
        }
    }

    
//SCRIPT TIMESTOP
    
location lTarget GetSpellTargetLocation();
    
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);
    
effect eTime EffectTimeStop();

    
// Fire cast spell at event for the specified target
    
SignalEvent(OBJECT_SELF,EventSpellCastAt(OBJECT_SELF,SPELL_TIME_STOP,FALSE));
    
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislTarget);

    
// Version "dés de vie du joueur"
    
int nNBCreature GetHitDice(OBJECT_SELF); // Le nombre de dés de vie du personnage définit le nombre de créature stoppées par timeStop
    
int nNBDone 1;
    
object oCible;
    while(
nNBCreature>0)
    {
        
oCible GetNearestObject(OBJECT_TYPE_CREATURE,OBJECT_SELF,nNBDone);

        
AssignCommand(oCible,ClearAllActions());

        
DelayCommand(0.2,SetCommandable(FALSE,oCible));

        
DelayCommand(12.0,SetCommandable(TRUE,oCible));

        
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE),oCible,12.0);
        
nNBDone nNBDone+1;
        
nNBCreature nNBCreature-1;
    }

    
// Version "toutes les créatures dans toute la zone"
    
object oArea GetArea(OBJECT_SELF);
    
object oCible GetFirstObjectInArea(oArea);
    while(
nNBCreature>0)
    {
        if(
GetObjectType(oCible)==OBJECT_TYPE_CREATURE);
        {
            if(
oCible!=OBJECT_SELF// Pour ne pas être victime de son propre sort
            
{
                
AssignCommand(oCible,ClearAllActions());
                
DelayCommand(0.2,SetCommandable(FALSE,oCible));
                
DelayCommand(12.0,SetCommandable(TRUE,oCible));

                
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE),oCible,12.0);
            }
        }
        
object oCible GetNextObjectInArea(oArea);
    }

Je me suis autorisée à modifier deux ou trois lignes, notamment celle qui nécessite d'être un MD pour pouvoir lancer le sort original. Pour les MDs, le sort de "Pause" est plus puissant. ^^

Tu pourrais presque rajouter un effet temporaire VFX_DUR_FREEZE_ANIMATION, pour parfaire l'illusion.
Code PHP:

//:://////////////////////////////////////////////

//:: Created By: Preston Watamaniuk

//:: Created On: Jan 7, 2002

//:://////////////////////////////////////////////



#include "x2_inc_spellhook"

#include "NW_I0_GENERIC"

object oGemme GetItemPossessedBy(OBJECT_SELF,"GemmeBleue");
if(
GetIsObjectValid(oGemme))
void immobilise(location lSpellfloat nDuration)


{

     
object oTarget GetFirstObjectInArea();

     while( 
oTarget != OBJECT_INVALID )

     {

          if (
oTarget != OBJECT_SELF)

          {

               
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION),oTarget,nDuration);

               
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneParalyze(),oTarget,nDuration);

          }

          
oTarget GetNextObjectInArea();
           
DestroyObject(oGemme);

     }

}



void main()

{

//length of the time stop spell

float nDuration 9.0;

float nTimeStop 3.75;

int i 0;

/*

  Spellcast Hook Code

  Added 2003-06-20 by Georg

  If you want to make changes to all spells,

  check x2_inc_spellhook.nss to find out more



*/



    
if (!X2PreSpellCastCode())

    {

    
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell

        
return;

    }



// End of Spell Cast Hook





    //Declare major variables

    
location lTarget GetSpellTargetLocation();

    
effect eVis EffectVisualEffect(VFX_FNF_TIME_STOP);







    
//Fire cast spell at event for the specified target

    
SignalEvent(OBJECT_SELFEventSpellCastAt(OBJECT_SELFSPELL_TIME_STOPFALSE));



    
//Apply the VFX impact and effects

    
DelayCommand(0.75immobilise(lTargetnDuration));



    for (
0IntToFloat(i)*nTimeStop <= nDurationi++)

    {

        
DelayCommand(IntToFloat(i)*nTimeStopApplyEffectToObject(DURATION_TYPE_INSTANTeVisOBJECT_SELF));

    }


Si je modifie ainsi ca devrait marcher ?
Par contre j'ai une erreur de compilation à cette ligne la : if(GetIsObjectValid(oGemme))
et je me demande si j'ai mis le "Destroy" au bon endroit...
Le "if(GetIsObjectValid(oTrucmuche))" est placé à l'extérieur de ton script... en gros il y a une condition d'exécution pour quelque chose qui n'existe pas, si ça peut te simplifier l'explication.

En ne prenant pas ceci en compte, et si je suis les premières lignes, tu demandes au joueur de posséder au moins une gemme, pour pouvoir déclarer une fonction void immobilize(... ...), qui va lui détruire une gemme par créature immobilisée.

Maintenant, il te faudrait plutôt laisser cette déclaration "void immobilize(... ...)" tranquille, vu qu'elle n'est là que pour exister et être utilisée dans le script lui même qui commencera à partir du "void main()".

En outre si tu veux effectivement dépenser une gemme par créature, tu peux la mettre dans la boucle, mais en précisant dans le "while" que la boucle doit cesser si le joueur n'a plus de gemme. Par contre c'est un peu plus délicat à faire, vu qu'un item met plus de temps à disparaître de l'inventaire qu'une boucle complète avec un while. Ca donnerait une boucle qui continue à détecter l'objet en question tant qu'il n'a pas disparu.

Pour ton script lui-même, il est presque bon, mis à par ce "if(Blabla)" placé au début. je te replace tout ça, et te remets quelques lignes dans un autre ordre :
Code PHP:

//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 7, 2002
//:://////////////////////////////////////////////
#include "x2_inc_spellhook"
#include "NW_I0_GENERIC"

void main() 

    
// Spellcast Hook Code 
    // Added 2003-06-20 by Georg 
    // If you want to make changes to all spells, 
    // check x2_inc_spellhook.nss to find out more 
    
if(!X2PreSpellCastCode())
    { 
        
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
        
return;
    }
    
// End of Spell Cast Hook

    
object oGemme GetItemPossessedBy(OBJECT_SELF,"GemmeBleue");

    
// Si le joueur ne possède pas la gemme, le script est arrété
    // grace à la commande "return".
    
if(!GetIsObjectValid(oGemme))
    {
        
FloatingTextStringOnCreature("Vous n'avez pas de gemme bleue !",OBJECT_SELF,FALSE);
        return;
    }

    
// Le script se poursuit si le joueur possède la gemme, qui est détruite.
    
DestroyObject(oGemme);

    
// Déclaration des variables
    
location lTarget GetSpellTargetLocation();
    
int nDuration DURATION_TYPE_TEMPORARY;

    
effect eVisual EffectVisualEffect(VFX_FNF_TIME_STOP);
    
effect eTime  EffectCutsceneParalyze();
    
effect eFreeze EffectVisualEffect(VFX_DUR_FREEZE_ANIMATION);
    
// Les effets eTime et eFreeze sont mis en Link, pour réagir en tant qu'effet unique,
    // das le cas d'une dissipation par exemple.
    
eTime EffectLinkEffects(eFreeze,eTime);

    
// Fire cast spell at event for the specified target
    
SignalEvent(OBJECT_SELF,EventSpellCastAt(OBJECT_SELF,SPELL_TIME_STOP,FALSE));

    
// Application des effets du sorts et visuels
    // Chaque créature dans la zone est affectée.
    
object oTarget GetFirstObjectInArea();
    while(
oTarget != OBJECT_INVALID)
    {
        
// On évite les non-créatures, ainsi que le lanceur du sort
        
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE && oTarget != OBJECT_SELF)
        {
            
// La cible est figée.
            
DelayCommand(0.75,ApplyEffectToObject(nDuration,eTime,oTarget,9.0));
        }
        
oTarget GetNextObjectInArea();
    }

    
// L'effet visuel "Arrêt du temps" est relancé pendant toute la durée du sort.
    
int i;
    for(
0IntToFloat(i)*3.75<=9.0i++)
    {
        
DelayCommand((IntToFloat(i)*3.75),ApplyEffectToObject(DURATION_TYPE_INSTANT,eVisual,OBJECT_SELF));
    }

Voilà, j'espère ne pas avoir trop saccagé ton script...

Pour la fonction "void Immobilize(... ...)", je l'ai supprimée, car elle peut être aisément insérée dans la partie principale, en mettant l'application des effets sous un "DelayCommand()". Tu remarqueras également que j'ai supprimé les variables qui ne prenaient pas de place.
Pour tout dire, le sort reste le même dans tout les cas. Que ce soit un joueur, un parchemin, une armure ou une potion, le même script sera lancé. D'un côté ça simplifie grandement les choses, d'un autre, ça les complique si tu veux faire un sort qui change selon le cas où un joueur ou un objet est impliqué.
Répondre

Connectés sur ce fil

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