Voir le sujet précédent ¤
Voir le sujet suivant
|
Auteur |
Message |
omega
Grand Chevalier
Inscrit le: 09 Jan 2004
Messages: 116
|
Posté le : 11/03/2005 15:25:06 Sujet du message : composants
Salut, je repose la question, car j'ai eu une reponse, mais ca marche pas.
Voila, je voulais rajouter des composants aux sorts, pour eviter qu'ils soient lancés en boucle. On m'a conseille de mettre ca au debut :
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.
et ca a la fin :
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.
ce qui fait, que pour un script de base, par exemple, benediction, ca donne :
NWScript :#include "NW_I0_SPELLS"#include "x2_inc_spellhook"void main() { object opc = GetLastSpellCaster(); if ( GetItemPossessedBy( opc, "rebelle") != OBJECT_INVALID) { if (! X2PreSpellCastCode()) { return; } object oTarget = GetSpellTargetObject(); int nDuration = 1 + GetCasterLevel( OBJECT_SELF); effect eVis = EffectVisualEffect( VFX_IMP_HEAD_HOLY); effect eDur = EffectVisualEffect( VFX_DUR_CESSATE_POSITIVE); if( GetIsObjectValid( oTarget) && GetObjectType( oTarget) == OBJECT_TYPE_ITEM) { if ( GetBaseItemType( oTarget) == BASE_ITEM_BOLT) { SignalEvent( GetItemPossessor( oTarget), EventSpellCastAt( OBJECT_SELF, GetSpellId(), FALSE)); IPSafeAddItemProperty( oTarget, ItemPropertyOnHitCastSpell( 123, 1), RoundsToSeconds( nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING ); ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, GetItemPossessor( oTarget)); ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eDur, GetItemPossessor( oTarget), TurnsToSeconds( nDuration)); return; } } effect eImpact = EffectVisualEffect( VFX_FNF_LOS_HOLY_30); effect eAttack = EffectAttackIncrease( 1); effect eSave = EffectSavingThrowIncrease( SAVING_THROW_ALL, 1, SAVING_THROW_TYPE_FEAR); effect eLink = EffectLinkEffects( eAttack, eSave); eLink = EffectLinkEffects( eLink, eDur); int nMetaMagic = GetMetaMagicFeat(); float fDelay; if ( nMetaMagic == METAMAGIC_EXTEND) { nDuration = nDuration * 2; } ApplyEffectAtLocation( DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation()); oTarget = GetFirstObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation( OBJECT_SELF)); while( GetIsObjectValid( oTarget)) { if( GetIsReactionTypeFriendly( oTarget) || GetFactionEqual( oTarget)) { fDelay = GetRandomDelay( 0.4, 1.1); SignalEvent( oTarget, EventSpellCastAt( OBJECT_SELF, SPELL_BLESS, FALSE)); DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, oTarget)); DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds( nDuration))); } oTarget = GetNextObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation( OBJECT_SELF)); } } SendMessageToPC( opc, "Il vous manque un composant"); } 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 voila, ca marche pas !!!!
Merci de votre aide
|
|
Revenir en haut |
|
|
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
|
Posté le : 10/04/2005 19:22:40 Sujet du message :
Euh cela m'interesse aussi donc si une ^^ame charitable pouvait se pancher sur la question, merci d'avance...
|
|
Revenir en haut |
|
|
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
|
Posté le : 11/04/2005 00:35:16 Sujet du message :
C'est vrai qu'écrit comme ça, ça risque d'avoir du mal à fonctionner.
Bon je propose un autre truc, non testé par contre.
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.
Ce qu'on fait : on regarde s'il a le composant, s'il l'a, on le détruit, et on lance le sort, s'il l'a pas, on lui dit qu'il lui manque le composant.
PS : vous me direz si cela fonctionne.
|
|
Revenir en haut |
|
|
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes |
Posté le : 11/04/2005 01:29:40 Sujet du message :
Il est inutile d'aller modifier les scripts des sorts. Il existe désormais un outil FA-BU-LEUX pour ce genre de chose, le spell-hooking.
Pour tous les détails, voir cette adresse : [http]
Ça permet en quelques lignes d'ajouter des conditions aux scripts qu'on veut, en un seul script global. Faut bien lire comme ça fonctionne, et ça vaut le coup de s'y intéresser, vraiment _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
|
|
Revenir en haut |
|
|
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
|
Posté le : 11/04/2005 01:47:31 Sujet du message :
On a hate de voir ton tutorial traduit en francais
Merci
|
|
Revenir en haut |
|
|
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers |
Posté le : 11/04/2005 10:45:11 Sujet du message :
Même moi qui suit pas une bête en anglais je comprend le lexicon, il font claire et la présentation fait remarquer les éléments important.
Rapidement sa marche comme sa :
On mets cette variable dans le OnModuleLoad (on peut la mettre ailleur, mais sa depend des cas)
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.
Ensuite il faut faire un script nommer " nom_script"
Dedans tu met ce que tu veux en utilisant les fonctions encadrer et commenter sur le lexicon, et utilisé de preférence un switch comme dans l'exemple.
Voilà c'est plus simple qu'il n'y parait. _________________ Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
|
|
Revenir en haut |
|
|
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes |
Posté le : 11/04/2005 11:28:03 Sujet du message :
C'est même encore mieux que ça : la variable X2_S_UD_SPELLSCRIPT on la met tout bêtement sur le module en cliquant sur le bouton [...] proposant les variables dans le menu des propriétés du module
Ensuite, on peut (comme dans l'exemple donné par le tutorial anglais) par exemple empêcher tous les sorts d'être utilisés durant le jour, et ce en 2 ou 3 lignes de code. Avant, il aurait fallu ouvrir tous les scripts de sort un par un et les changer.
On peut faire des zones de non magie...
On peut faire des sorts à composantes...
On peut multiplier ou diminuer la puissance des sorts dans certaines zones...
On peut créer des effets de sorts aléatoires ou dangereux pour l'utilisateur...
Et tant d'autre encore ! Et le plus beau, c'est qu'on peut très facilement sélectionner tous les sorts pour chacun des exemples ci-avant, ou un seul sort, ou 3 seulement. Ça ouvre des perspectives vraiment géniales _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
|
|
Revenir en haut |
|
|
Baldurien
L'homme qui chutait sur le macadam
Inscrit le: 12 Sep 2002
Messages: 14066
Localisation: Quadran Alpha |
Posté le : 11/04/2005 12:53:52 Sujet du message :
|
|
Revenir en haut |
|
|
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
|
Posté le : 11/04/2005 20:25:44 Sujet du message :
Bon pour stan, ça ne fonctionne pas. J'ai essayé sur boule de feu, on voit l'effet visuelle, mais la BDF n'éclate pas et aucun dégât, même si on a le composant.
Sinon, Ce spell-hooking modifie l'ensemble des sorts si j'ai bien compris. Mais là si je veux juste un composant pour ce sort est-il possible de l'utiliser?
|
|
Revenir en haut |
|
|
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
|
Posté le : 11/04/2005 20:40:17 Sujet du message :
Citation :Bon pour stan, ça ne fonctionne pas. J'ai essayé sur boule de feu, on voit l'effet visuelle, mais la BDF n'éclate pas et aucun dégât, même si on a le composant. Oula euh là ça ne peut pas venir de la minucule modif que je conseillais.Là il faut t'en prendre à ton sort, soit t'as lancé une boule de feu à retardement, soit t'as pas les bons réglages de ton module et les boules de feu font pas de dégats aux non hostile.Ou tu as mal placé les modifs à faire
Mais vive le spell-hooking
|
|
Revenir en haut |
|
|
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes |
Posté le : 11/04/2005 22:20:20 Sujet du message :
Avec le spell hooking, tu peux modifier d'un seul coup l'ensemble des sorts, comme tu peux si tu le souhaites ne modifier qu'un seul sort parmi tous ceux existant. Suffit de lire le tutorial _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
|
|
Revenir en haut |
|
|
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
|
Posté le : 12/04/2005 12:44:08 Sujet du message :
Oui j'ai lu le tutorial, pour moi ça reste complexe, désolé. J'ai bien compris le début, mais c'est pour faire mon script sur un seul sort que je nage...
Sinon c'est bien le script en plus qui fait bugger. Ca doit venir de l'endroit ou je l'ai mis.
Voilà mon script:
NWScript :void main(){ object opc = GetLastSpellCaster(); object oComposant= GetItemPossessedBy( opc, "tag_du_composant"); if ( oComposant != OBJECT_INVALID) { DestroyObject( oComposant, 0.0); if (! X2PreSpellCastCode()) { return; } object oCaster = OBJECT_SELF; int nCasterLvl = GetCasterLevel( oCaster); int nMetaMagic = GetMetaMagicFeat(); int nDamage; float fDelay; effect eExplode = EffectVisualEffect( VFX_FNF_FIREBALL); effect eVis = EffectVisualEffect( VFX_IMP_FLAME_M); effect eDam; location lTarget = GetSpellTargetLocation(); if ( nCasterLvl > 10) { nCasterLvl = 10; } ApplyEffectAtLocation( DURATION_TYPE_INSTANT, eExplode, lTarget); object oTarget = GetFirstObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); while ( GetIsObjectValid( oTarget)) { if ( spellsIsTarget( oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) { if(( GetSpellId() == 341) || GetSpellId() == 58) { SignalEvent( oTarget, EventSpellCastAt( OBJECT_SELF, SPELL_FIREBALL)); fDelay = GetDistanceBetweenLocations( lTarget, GetLocation( oTarget))/ 20; if (! MyResistSpell( OBJECT_SELF, oTarget, fDelay)) { nDamage = d6( nCasterLvl); if ( nMetaMagic == METAMAGIC_MAXIMIZE) { nDamage = 6 * nCasterLvl; } else if ( nMetaMagic == METAMAGIC_EMPOWER) { nDamage = nDamage + nDamage / 2; } nDamage = GetReflexAdjustedDamage( nDamage, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_FIRE); eDam = EffectDamage( nDamage, DAMAGE_TYPE_FIRE); if( nDamage > 0) { DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_INSTANT, eDam, oTarget)); DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, oTarget)); } } } } oTarget = GetNextObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } } else SendMessageToPC( opc, "Il vous manque un composant"); } /* suspect block end found !*/
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.
Dernière édition par Yan the salor le 12/04/2005 12:47:40; édité 2 fois
|
|
Revenir en haut |
|
|
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
|
Posté le : 12/04/2005 12:44:31 Sujet du message :
Euh...ce
/* suspect block end found !*/
ne fait pas parti de mon script...j'arrive pas à le virer, n'en tenez pas compte svp.
|
|
Revenir en haut |
|
|
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
|
Posté le : 12/04/2005 15:29:51 Sujet du message :
Effectivement ça ne fonctionnait pas.Il ne devait pas aimer le getlastspellcaster je suppose.
Je met ici un code qui fonctionne sur ce sort : (en spoiler car c'est long)
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"#include "x2_inc_spellhook"void main(){ object opc = OBJECT_SELF; object oComposant= GetItemPossessedBy( opc, "compo"); if ( oComposant != OBJECT_INVALID) { if (! X2PreSpellCastCode()) { return; } object oCaster = OBJECT_SELF; int nCasterLvl = GetCasterLevel( oCaster); int nMetaMagic = GetMetaMagicFeat(); int nDamage; float fDelay; effect eExplode = EffectVisualEffect( VFX_FNF_FIREBALL); effect eVis = EffectVisualEffect( VFX_IMP_FLAME_M); effect eDam; location lTarget = GetSpellTargetLocation(); if ( nCasterLvl > 10) { nCasterLvl = 10; } ApplyEffectAtLocation( DURATION_TYPE_INSTANT, eExplode, lTarget); object oTarget = GetFirstObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); while ( GetIsObjectValid( oTarget)) { if ( spellsIsTarget( oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) { if(( GetSpellId() == 341) || GetSpellId() == 58) { SignalEvent( oTarget, EventSpellCastAt( OBJECT_SELF, SPELL_FIREBALL)); fDelay = GetDistanceBetweenLocations( lTarget, GetLocation( oTarget))/ 20; if (! MyResistSpell( OBJECT_SELF, oTarget, fDelay)) { nDamage = d6( nCasterLvl); if ( nMetaMagic == METAMAGIC_MAXIMIZE) { nDamage = 6 * nCasterLvl; } else if ( nMetaMagic == METAMAGIC_EMPOWER) { nDamage = nDamage + nDamage / 2; } nDamage = GetReflexAdjustedDamage( nDamage, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_FIRE); eDam = EffectDamage( nDamage, DAMAGE_TYPE_FIRE); if( nDamage > 0) { DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_INSTANT, eDam, oTarget)); DelayCommand( fDelay, ApplyEffectToObject( DURATION_TYPE_INSTANT, eVis, oTarget)); } } } } oTarget = GetNextObjectInShape( SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } DestroyObject( oComposant, 0.0); } else SendMessageToPC( opc, "Il vous manque un composant"); } 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.
Encore désolé pour le code qui buggait
|
|
Revenir en haut |
|
|
Yan the salor
Seigneur
Inscrit le: 03 Oct 2004
Messages: 151
|
Posté le : 12/04/2005 15:49:47 Sujet du message :
Tu es le meilleur Stan...si je monte un persistant, je t'embauche
|
|
Revenir en haut |
|
|
Stan
Grand Chevalier
Inscrit le: 07 Avr 2005
Messages: 126
|
Posté le : 12/04/2005 16:00:11 Sujet du message :
Merci mais je suis bien loin d'être le meilleur, j'ai commencé les scripts nwn depuis 3semaines grand max
|
|
Revenir en haut |
|
|
finipe
Grand Sage du Conseil
Inscrit le: 11 Fév 2003
Messages: 519
Localisation: Nantes |
Posté le : 12/04/2005 18:26:43 Sujet du message :
Avec le spell hooking :
1 - Placer sur le module la variable :
X2_S_UD_SPELLSCRIPT - string - sort_alternatif
2 - Créer un script qui servira pour tous les sorts "modifiés", qui se nommera donc "sort_alternatif" dans notre exemple. Ce sort sera ensuite toujours le même, quel que soit le sort que l'on désire modifier.
3 - Différents exemples de ce qu'il est possible de faire avec ce script :
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. _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine
» 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII
|
|
Revenir en haut |
|
|
|