JeuxOnLineForumsPlusConnectés : 240 (sites) | 490 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [DD SPELL]Ray Of Frost RSS
   
Répondre
Partager Outils Rechercher
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 

[DD SPELL]Ray Of Frost

Code PHP:
//::///////////////////////////////////////////////
//:: Ray of Frost
//:: [NW_S0_RayFrost.nss]
//:: Copyright (c) 2000 Bioware Corp.
//:://////////////////////////////////////////////
/*
    If the caster succeeds at a ranged touch attack
    the target takes 1d4 damage.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: feb 4, 2001
//:://////////////////////////////////////////////

#include "NW_I0_SPELLS"    
void main()
{
    
//Declare major variables
    
object oTarget GetSpellTargetObject();
    
int nMetaMagic GetMetaMagicFeat();
    
int nCasterLevel GetCasterLevel(OBJECT_SELF);
    
int nDam d3(1);
    
effect eDam;
    
effect eVis EffectVisualEffect(VFX_IMP_FROST_S);
    
effect eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);

    if(!
GetIsReactionTypeFriendly(oTarget))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(oTargetEventSpellCastAt(OBJECT_SELFSPELL_RAY_OF_FROST));
        
eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);
        
//Make SR Check
        
if(!MyResistSpell(OBJECT_SELFoTarget))
        {
        if (
TouchAttackRanged(oTarget,TRUE)==0)
        {
        
SendMessageToPC(OBJECT_SELF,"You missed the target, and lost the magic energy in the process");
            
// Calcule la position du miss
vector vPos GetPosition(oTarget);
float vPos.x=vPos.x+Random(5.0)-2.0;
float vPos.y=vPos.y+Random(5.0)-2.0;
vPos Vector(vPos.x,vPos.y,vPos.z);
lLocation Location(GetArea(oTarget),vPos,1.0);
                
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVisoLocation);
        return;
        }
            
//Enter Metamagic conditions
            
if (nMetaMagic == METAMAGIC_MAXIMIZE)
            {
               
nDam ;//Damage is at max
            
}
            else if (
nMetaMagic == METAMAGIC_EMPOWER)
            {
               
nDam nDam nDam/2//Damage/Healing is +50%
            
}
            
//Set damage effect
            
eDam EffectDamage(nDamDAMAGE_TYPE_COLD);
            
//Apply the VFX impact and damage effect

            
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeDamoTarget);
        }
    }
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeRayoTarget1.7);

Lien direct vers le message - Vieux
Avatar de Dolanor
Dolanor
Alpha & Oméga
 
Avatar de Dolanor
 
GASP !!!!
Je m'imaginais déjà scripter ou réflechir a faire la fonction rangeTouchAttack...Mais c implementé !!
Mais pourquoi bioware l'utilise pas ??
Surement que le gars qu ia fait la fonction a du etre viré en cours de developpement et il a pas eu le temps de dire au autres developpeurs de l'utiliser lol ! :bouffon:
Enfin bon, c cool ca ^^.

Autre idée a développer : plutot que d'avoir un
Code PHP:
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget); 
avec le
Code PHP:
eVis EffectVisualEffect(VFX_IMP_FROST_S); 
si il loupe le sort, ben il ne devrais pas il y avoir un impact vu que l'on misse la cible. A la place ce qui serait sympa, mais ca demande plus de bidouille, c que le bout "aggressif" du rayon ne soit pas sur la cible elle meme si ca misse, mais un peu a coté (je ne crois pas qu'on puisse gerer ca avec les location vu que leffet beam demande un Objet, mais peut etre qu'en prenant un objet au hasard au alentour ca pourrait bien rendre (enfin faut voir si ca part derriere ce n'est peut etre pas top ^^ mais on peut gerer ca avec un shape_cone invisible qui liste les objets dans le cone et donc le rayon ciblerait un objet au hasard dans ce cone.)
Je vais essayer de voir ce que ca donne ^^ et je montre le code une fois fini.
Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
j'essairait bien un ApplyEffectToLocation, avec
Code PHP:
vector vPos GetPosition(oTarget);
float vPos.x=vPos.x+Random(5.0)-2.0;
float vPos.y=vPos.y+Random(5.0)-2.0;
vPos Vector(vPos.x,vPos.y,vPos.z);
lLocation Location(GetArea(oTarget),vPos,1.0); 
Non ? Je pense que ca devrait marcher, mais je connais mal les effets Beam...
Lien direct vers le message - Vieux
Avatar de Dolanor
Dolanor
Alpha & Oméga
 
Avatar de Dolanor
 
Mmmh, l'effet beam a ce que j'ai compris est emis d'un objet a une partie de cet objet (node hand ou head), mais apres l'autre bout est geré par le apply effect, donc oui avec ton script ca devrait le faire
la je vais me coucher, je testerai demain
Lien direct vers le message - Vieux
Avatar de Solaufein
Solaufein
Alpha & Oméga
 
Avatar de Solaufein
 
J'étais en train de me demander...
C'est normal qu'il y ait la chose suivante dans le script :

Code PHP:
int nDam Random(3) + 
J'avoue que je suis encore un sacré noob en script, donc j'aimerais avoir la confirmation de la chose suivante :

Quand on utilise la commande "Random(X)", cela génère un nombre entre 0 et X ou un nombre entre 1 et X ? Si eMRaistlin n'a pas fait d'erreur, c'est la première hypothèse la bonne... Mais je préfère être sûr ... Quelqu'un confirme ?
Lien direct vers le message - Vieux
Avatar de Slay
Slay
Roi
 
Avatar de Slay
 
Random(X) génère un nombre entre 0 et X-1...
pour générer un chiffre de 1 a 3, on peut utiliser d3()... ou Random(3)+1... ce qui revient exactement au même...
Lien direct vers le message - Vieux
Avatar de Solaufein
Solaufein
Alpha & Oméga
 
Avatar de Solaufein
 
Ok merci pour l'info !
Lien direct vers le message - Vieux
Avatar de Solaufein
Solaufein
Alpha & Oméga
 
Avatar de Solaufein
 
Voilà, j'ai fait une petite mise en page de ton script modifié eMRaistlin (et je me suis permis de remplacer "Random(3) + 1" par "d3(1)"... Mais peut-être peut-on mettre simplement "d3" ?)

Code PHP:
//:://///////////////////////////////////////////////////
//:: Ray of Frost
//:: [NW_S0_RayFrost.nss]
//:: Copyright (c) 2000 Bioware Corp.
//:://///////////////////////////////////////////////////
//
//   Bioware Effect : The target takes 1D4+1 cold damage
//   automatically (without ranged touch attack).
//
//:://///////////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: feb 4, 2001
//:://///////////////////////////////////////////////////
//:: Modified By: eMRaistlin
//:: Modified On: may 20, 2003
//:://///////////////////////////////////////////////////
//
//   Modified Effect : If the caster succeeds at a ranged
//   touch attack, the target takes 1d3 cold damage.
//
/////////////////////////////////////////////////////////

#include "NW_I0_SPELLS"
void main()
{
    
//Declare major variables
    
object oTarget GetSpellTargetObject();
    
int nMetaMagic GetMetaMagicFeat();
    
int nCasterLevel GetCasterLevel(OBJECT_SELF);
    
int nDam d3(1)
    
effect eDam;
    
effect eVis EffectVisualEffect(VFX_IMP_FROST_S);
    
effect eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);

    if(!
GetIsReactionTypeFriendly(oTarget))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(oTargetEventSpellCastAt(OBJECT_SELFSPELL_RAY_OF_FROST));
        
eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);
        
//Make SR Check
        
if(!MyResistSpell(OBJECT_SELFoTarget))
        {
        if (
TouchAttackRanged(oTarget,TRUE)==0)
        {
        
SendMessageToPC(OBJECT_SELF,"You missed the target, and lost the magic energy in the process");
                
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget);
        return;
        }
            
//Enter Metamagic conditions
            
if (nMetaMagic == METAMAGIC_MAXIMIZE)
            {
               
nDam ;//Damage is at max
            
}
            else if (
nMetaMagic == METAMAGIC_EMPOWER)
            {
               
nDam nDam nDam/2//Damage/Healing is +50%
            
}
            
//Set damage effect
            
eDam EffectDamage(nDamDAMAGE_TYPE_COLD);
            
//Apply the VFX impact and damage effect
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeDamoTarget);
        }
    }
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeRayoTarget1.7);

Le problème dans tout cela, c'est qu'une fois importé dans un module (en ayant bien pris garde à ce que le script "NW_I0_SPELLS" soit également inclus dans le module) , le message d'erreur suivant s'affiche lorsque je veux compiler "NW_S0_RayFrost.nss" :

20/05/2003 12:46:26 : Erreur. 'nw_s0_rayfrost' n’est pas compilé.
nw_s0_rayfrost.nss(31): ERREUR : PARSING VARIABLE LIST.

D'où est ce que ça peut venir ?
Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
ca vient precisement du fait que tu ai mis d3 au lieu de random(3)+1;

en fait, le d4(1) de Bioware, c'est une fonction qui fait ca :
Code PHP:
int d4(int nNb=1)
{
int nSumm 0;
while (
nNb>0)
{
nSumm Random(4)+nSumm;nNb--;}
return 
nSumm;

est qui est dans le nwscript (je crois, ou sinon, qui est hard-coded, ce qui revient au meme)

Donc, soit tu remet Random(3)+1;, soit tu met ca :

Code PHP:
int d3(int nNb=1)
{
int nSumm 0;
while (
nNb>0)
{
nSumm Random(3)+nSumm;nNb--;}
return 
nSumm;

juste au dessus du void main() de ton script, et tu pourra utiliser la fonction d3()
Lien direct vers le message - Vieux
Avatar de Slay
Slay
Roi
 
Avatar de Slay
 
Non la fonction d3() est utilisable directement sans aucun include a inserer...
Le probleme vient de cette ligne :
Code PHP:
int nDam d3(1
(ligne 30)
il manque betement un ; a la fin
(tu peux mettre directement int nDam = d3(); qui utilise la valeur 1 par défaut )
Lien direct vers le message - Vieux
Avatar de Solaufein
Solaufein
Alpha & Oméga
 
Avatar de Solaufein
 
Yes ! ça marche !
Merci à vous deux !

On devrait peut-être utiliser "int nDam = d3();" pour la version finale du script. ça a l'avantage d'être plus clair visuellement : "d3();" est plus explicite que "Random(3) + 1" pour le novice je pense (je parle en connaissance de cause huhu )

On fait comme ça ?
Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
mouarff... le n00b...

Desole, j'ignor&ais l'existence de d3(), alors ca ma saute aux yeux avant le ;



Mise a jour effectuée.
Lien direct vers le message - Vieux
Avatar de Archamedes_Fr
Archamedes_Fr
Alpha & Oméga
 
Avatar de Archamedes_Fr
 
Voici la version avec le rayon qui va à côtés, en utilisant la proposition d'eMR.

Il demeure une petite ombre au tableau, lorsque le rayon passe à côté, on voit la tache blanche sur le sol, mais pas le rayon.
Quelque chose à changer la dedans ?
Code PHP:
        vector vPos GetPosition(oTarget);
        
vPos.vPos.x+Random(5)-2;
        
vPos.vPos.y+Random(5)-2;
        
vPos Vector(vPos.x,vPos.y,vPos.z);
        
location lLocation Location(GetArea(oTarget),vPos,1.0);
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislLocation1.7f);
        return; 
J'ai essayé d'introduire un ApplyEffectAtLocation avec le eRay, mais ça change rien.

Deuxième ombre au tableau, pour le Jet de toucher à distance. Je ferai un peu plus de test ce soir, mais le jet ne semble vraiment pas difficile. Et ne semble pas varier en fonction de la taille.

Code PHP:
#include "NW_I0_SPELLS"
void main()
{
    
//Declare major variables
    
object oTarget GetSpellTargetObject();
    
int nMetaMagic GetMetaMagicFeat();
    
int nCasterLevel GetCasterLevel(OBJECT_SELF);
    
int nDam d3(1);
    
effect eDam;
    
effect eVis EffectVisualEffect(VFX_IMP_FROST_S);
    
effect eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);

    if(!
GetIsReactionTypeFriendly(oTarget))
    {
        
//Fire cast spell at event for the specified target
        
SignalEvent(oTargetEventSpellCastAt(OBJECT_SELFSPELL_RAY_OF_FROST));
        
eRay EffectBeam(VFX_BEAM_COLDOBJECT_SELFBODY_NODE_HAND);
        
//Make SR Check
        
if(!MyResistSpell(OBJECT_SELFoTarget))
        {
        if (
TouchAttackRanged(oTarget,TRUE)==0)
        {
        
SendMessageToPC(OBJECT_SELF,"You missed the target, and lost the magic energy in the process");
        
vector vPos GetPosition(oTarget);
        
vPos.vPos.x+Random(5)-2;
        
vPos.vPos.y+Random(5)-2;
        
vPos Vector(vPos.x,vPos.y,vPos.z);
        
location lLocation Location(GetArea(oTarget),vPos,1.0);
        
ApplyEffectAtLocation(DURATION_TYPE_INSTANTeVislLocation1.7f);
        return;
        }
            
//Enter Metamagic conditions
            
if (nMetaMagic == METAMAGIC_MAXIMIZE)
            {
               
nDam ;//Damage is at max
            
}
            else if (
nMetaMagic == METAMAGIC_EMPOWER)
            {
               
nDam nDam nDam/2//Damage/Healing is +50%
            
}
            
//Set damage effect
            
eDam EffectDamage(nDamDAMAGE_TYPE_COLD);
            
//Apply the VFX impact and damage effect
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeVisoTarget);
            
ApplyEffectToObject(DURATION_TYPE_INSTANTeDamoTarget);
        }
    }
    
ApplyEffectToObject(DURATION_TYPE_TEMPORARYeRayoTarget1.7);

[EDIT]
Le jet de toucher à distance, c'est D20+Bonus de DEX. Ils se sont pas cassé la tête à récupérer le BAB.
Lien direct vers le message - Vieux
Avatar de Dolanor
Dolanor
Alpha & Oméga
 
Avatar de Dolanor
 
Je pense que le probleme sur le fait que le rayon n'apparaissent pas vient du fait que l'effet beam est un rayon entre 2 objets, or si on fait avec une loc, ca marche pas.
Donc il faudrait creer un objet illusoire a la loc aleatoire calculée au dessus et ensuite appliquer l'effet de rayon sur cet objet illusoire.

Finalement ce soir je sors donc je peux pas trop bidouiller, vouinnnn

PS : pour ma solution au dessus, dites mois si c pas le genre de script qui va trop bouffer en ressource, sinon on lache l'affaire avec le rayon qui miss, il ne se lancera pas et c tout.

PS 2 : pour le jet de toucher a distance, je m'en occupe des que j'ai le temps, je gererai la bonne CA du monstre (que la dex prise en compte) et aussi le bon jet de toucher avec prise du BAB. On ne fait pas les choses qu'a moitié hannn ^^

[EDIT] le code de l'obtention du BAB se trouve ici
J'ai encore des probleme pour obtenir la bonne CA contre un jet de toucher a distance, mais je cherche, je cherche
Lien direct vers le message - Vieux
Avatar de Dolanor
Dolanor
Alpha & Oméga
 
Avatar de Dolanor
 
bon, concernant le rayon, le probleme est que tu appliques l'effet d'explosion de d'impact de froid au lieu du beam lors d'un echec, donc normal qu'il apparaisse pas. Néanmoins, apres moults test, il s'avere que l'on ne peut pas utiliser ApplyEffectTOLocation pour un effet beam.
Donc la solution est de creer un objet temporaire a la location aleatoire et ce pendant la durée du rayon (donc 1,7 sec)
Avec une creature de base, ca marche bien, mais c pas tres design ^^ Donc c pour ca j'attends de pouvoir chopper le modele "invisible" d'une creature, comme ca l'objet apparaitra sans prendre de ressource ou si peu, de part sa taille et par son invisibilité, une fois la durée du rayon écoulé, je detruit l'objet et voila.

Maintenant il me faut des renseignement des caids des script. Car je ne sais pas si le code en lui est tres pêu consommateur de ressource, car je ne pense pas qu'u_ne creation d'objet a la volée soit anodine au nouveau ressource. Donc...need backup ^^.

En tout cas, le code est bientot fini pour le ray of frost, il suffira de l'appliquer pour tous les rayons et ca videra pas mal de sorts ^^. C cool
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [DD SPELL]Ray Of Frost
   

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 +1. Il est actuellement 05h28.
   

© 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