JeuxOnLineForumsPlusConnectés : 298 (sites) | 440 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Désactiver Arrêt du Temps RSS
   
Répondre
Partager Outils Rechercher
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
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
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
Personne ne sait quelquechose à ce sujet, même des chtites bribes d'infos ?

Merci d'avance !
Lien direct vers le message - Vieux
Avatar de Deyonara
Deyonara
Alpha & Oméga
 
Avatar de Deyonara
 
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);
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
Donc si je te suis bien Deynora, il faut mettre le script de eMRaistlin en include des sorts que je modifierais .
Je n'ai pas besoin du ro_include ?

Merci à Toi Deynora de tes réponses
Lien direct vers le message - Vieux
Avatar de Deyonara
Deyonara
Alpha & Oméga
 
Avatar de Deyonara
 
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.
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
Je te remercie Deynora pour tes explications qui sont comme toujours lumineuses !
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
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...
Lien direct vers le message - Vieux
Avatar de Deyonara
Deyonara
Alpha & Oméga
 
Avatar de Deyonara
 
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.
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
Merci pour tes explications !
Tu n'as pas saccagé le script, tu l'as rendu compréhensible

D'autre part, penses tu que l'on puisse appliquer ce genre de restriction pour la lecture d'un parchemin de sort ?
Lien direct vers le message - Vieux
Avatar de Deyonara
Deyonara
Alpha & Oméga
 
Avatar de Deyonara
 
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é.
Lien direct vers le message - Vieux
Avatar de Camelia d'Oriel
Camelia d'Oriel
Alpha & Oméga
 
Avatar de Camelia d'Oriel
 
D'accord ! Merci de ta patience
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Désactiver Arrêt du Temps
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +2. Il est actuellement 03h57.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite