La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 01/11/2024 08:23:41


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 17/09/2005 09:24:50 Sujet du message : Problèmes "engine" avec le Spell-Hooking

Cet outil "formidable" me cause un gros problème, j'ai trouvé un moyen imparfait de le circonscrire mais celà nuit à son extension d'utilisation :

Je vous cite des portions de code et décris ce qui se passe.
J'ai envie de standardiser mes modifications de sorts (>100) et afin que le script de spell-hooking reste lisible, je construis actuellement une petite bibliothèque (plusieurs fichiers include) avec mes modifications de fonctions.

NWScript :
//:: //
//:: Created Lylver 2005-09-16
//:: include pour sorts
//:: ly_lib_spell
//:: //
struct spell_data{
  int nSpId ; // GetSpellId(); returns the SPELL_* constant of the spell cast
  object oTgtObj ; // GetSpellTargetObject(); returns the targeted object of the spell, if valid
  location lTgtLoc ; // GetSpellTargetLocation(); returns the targeted location of the spell, if valid
  int nClass ; // GetLastSpellCastClass(); gets the class the PC cast the spell as
  object oCItem ; // GetSpellCastItem(); if an item cast the spell, this function gets that item
  int nSSDC ; // GetSpellSaveDC(); gets the DC required to save against the effects of the spell
  int nLevel ; // GetCasterLevel(OBJECT_SELF); gets the level the PC cast the spell as
  int nMeta ; // GetMetaMagicFeat(); Get the metamagic type (METAMAGIC_*) of the last spell cast by the caller
};

void dump_spell( struct spell_data stS, string sScript = "" ){
  WriteTimestampedLogEntry(sScript+" : "+
  "Spell ID : "+IntToString(stS.nSpId)+
  " Cible : "+GetName(stS.oTgtObj)+
  " Class nb : "+IntToString(stS.nClass)+
  " Item Name : "+GetName(stS.oCItem)+
  " Spell DC : "+IntToString(stS.nSSDC)+
  " Caster Level : "+IntToString(stS.nLevel)+
  " Metamagic : "+IntToString(stS.nMeta));
}
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.


de là je commence à fusionner quelques sorts dans mon script de hooking principal.
Je mets en spoiler pour la lisibilité globale du post, le script en lui même n'est pas le but.

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 :
//:: Update Lylver 2005-09-16
//:: + spell hooking tnb : chgt RAISE_DEAD
//:Confused/
//:Confused////////////////////
//:: created Lylver 2005-06-10
//:: spell-hooking main
//:: 1st purpose : scrolls DC for thieves
//:Confused////////////////////
/*
GetSpellId(); // returns the SPELL_* constant of the spell cast
GetSpellTargetObject(); // returns the targeted object of the spell, if valid
GetSpellTargetLocation(); // returns the targeted location of the spell, if valid
GetLastSpellCastClass(); // gets the class the PC cast the spell as
GetSpellCastItem(); // if an item cast the spell, this function gets that item
GetSpellSaveDC(); // gets the DC required to save against the effects of the spell
GetCasterLevel(OBJECT_SELF); // gets the level the PC cast the spell as
*/

#include "x2_inc_switches"
#include "ly_lib_spell"
#include "ly_nw_i0_spells"
#include "ly_x0_i0_spells"

#include "x2_inc_spellhook"

#include "ly_s0_firebrand"

#include "ly_s0_virtue"
#include "ly_s0_missstorm1"
#include "ly_s0_missstorm2"
#include "ly_s0_divpower"

void main()
{
  struct spell_data stS ;
  stS.nSpId = GetSpellId();
  stS.oTgtObj = GetSpellTargetObject();
  stS.lTgtLoc = GetSpellTargetLocation();
  stS.nClass = GetLastSpellCastClass();
  stS.oCItem = GetSpellCastItem();
  stS.nSSDC = GetSpellSaveDC();
  stS.nLevel = GetCasterLevel(OBJECT_SELF);
  stS.nMeta = GetMetaMagicFeat();

  // dump_spell( stS, "sow_mod_spells" ) ;
  // Loop Lock
/*  if( GetLocalInt(OBJECT_SELF," BUSY") ){
      WriteTimestampedLogEntry(" ;Loop Lock");
      return ;
  } else {
      SetLocalInt(OBJECT_SELF," BUSY",TRUE);
  }*/

  /* resoud un probleme de DC pour les sorts lances via parchemin pour les voleurs
      et introduit DC pour les parchemins au dessus du niveau du caster
  */


  if( GetIsObjectValid(stS.oCItem) &&
      GetIsPC(OBJECT_SELF) &&
    ( GetBaseItemType(stS.oCItem) == BASE_ITEM_SPELLSCROLL ) &&
    ( GetLastSpellCastClass() == CLASS_TYPE_INVALID ) ){
      int nProfane = GetLevelByClass(CLASS_TYPE_WIZARD)
        + GetLevelByClass(CLASS_TYPE_SORCERER)
        + GetLevelByClass(CLASS_TYPE_BARD)
        + GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE)
        + GetLevelByClass(CLASS_TYPE_PALEMASTER)
        + GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER)
        + GetLevelByClass(CLASS_TYPE_HARPER)
        + GetLevelByClass(CLASS_TYPE_SHADOWDANCER) ;
      int nDivine = GetLevelByClass(CLASS_TYPE_CLERIC)
        + GetLevelByClass(CLASS_TYPE_DRUID)
        + GetLevelByClass(CLASS_TYPE_SHIFTER)
        + GetLevelByClass(CLASS_TYPE_PALADIN)
        + GetLevelByClass(CLASS_TYPE_HARPER)
        + GetLevelByClass(CLASS_TYPE_RANGER) ;
      int nTypeMagie = (nDivine > nProfane) ? nDivine : nProfane ;
      int nSkillUMD = d20() + GetSkillRank(SKILL_USE_MAGIC_DEVICE) + nTypeMagie ;
      int nDC_UMD = stS.nSSDC-10 + GetCasterLevel(OBJECT_SELF) ;
      if( stS.nSpId == SPELL_RAISE_DEAD ){ nDC_UMD = 2 ; }
      if( nDC_UMD > nSkillUMD ){
        SendMessageToPC(OBJECT_SELF,"Utilisation des Objets Magiques : Jet "
            +IntToString(nSkillUMD)+", DC = "+IntToString(nDC_UMD)+"");
        SetModuleOverrideSpellScriptFinished();
        return ;
      } else {
        SendMessageToPC(OBJECT_SELF,"Utilisation des Objets Magiques : Jet "
            +IntToString(nSkillUMD)+", DC = "+IntToString(nDC_UMD)+"");
      }
  }

/* classic spell-hooking */
/*
  switch (stS.nSpId) {
      case SPELL_FIREBRAND:
        ly_s0_firebrand(stS) ;
        SetModuleOverrideSpellScriptFi nished();
        DeleteLocalInt(OBJECT_SELF,&qu ot;BUSY");
        // DoMissileStorm(stS,1, 15, SPELL_FIREBRAND, VFX_IMP_MIRV_FLAME, VFX_IMP_FLAME_M, DAMAGE_TYPE_FIRE, FALSE, TRUE);
        // SetModuleOverrideSpellScriptFi nished();
        break ;
      case SPELL_DIVINE_POWER: ly_s0_divpower(stS) ; break ;
      case SPELL_ISAACS_LESSER_MISSILE_ST ORM: ly_s0_missstorm1(stS) ; break ;
      case SPELL_ISAACS_GREATER_MISSILE_S TORM: ly_s0_missstorm2(stS) ; break ;
      case SPELL_VIRTUE: ly_s0_virtue(stS) ; break ;
  } // end switch statement  */

}
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 ... surprise en jeu, dés que le niveau d'appel de fonctions commence à s'imbriquer : le moteur nwn perd les pédales... Très joli certes pour Brandons de feu mais carrément délire la répétition *10 du sort. Voici les logs dans le cas de la modification suivante

NWScript :
/* classic spell-hooking */

  switch (stS.nSpId) {
      case SPELL_FIREBRAND:
        ly_s0_firebrand(stS) ;
        SetModuleOverrideSpellScriptFinished();
        // DeleteLocalInt(OBJECT_SELF,&qu ot;BUSY");
        // DoMissileStorm(stS,1, 15, SPELL_FIREBRAND, VFX_IMP_MIRV_FLAME, VFX_IMP_FLAME_M, DAMAGE_TYPE_FIRE, FALSE, TRUE);
        // SetModuleOverrideSpellScriptFi nished();
        break ;}
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.


Log en spoiler :
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 :

Citation :
[lylver] WatchDog: [Talk] Set Chef de la garde de Castelmort en Hostile
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:09] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] sow_mod_spells : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:09:16] ly_s0_firebrand : Spell ID : 440 Cible : Chef de la garde de Castelmort Class nb : 255 Item Name : Spell DC : 18 Caster Level : 10 Metamagic : 0
[Sat Sep 17 10:10:33] Chef de la garde de Castelmort Died

sympa la répétition ...

sans appel de fonction, du moins avec 1 seul niveau d'imbrication : retour à la normale

NWScript :
/* classic spell-hooking */

  switch (stS.nSpId) {
      case SPELL_FIREBRAND:
        // ly_s0_firebrand(stS) ;
        // SetModuleOverrideSpellScriptFi nished();
        // DeleteLocalInt(OBJECT_SELF,&qu ot;BUSY");
        DoMissileStorm(stS,1, 15, SPELL_FIREBRAND, VFX_IMP_MIRV_FLAME, VFX_IMP_FLAME_M, DAMAGE_TYPE_FIRE, FALSE, TRUE);
        SetModuleOverrideSpellScriptFinished();
        break ;}
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 donc : ca limite sérieusement l'utilisation standard du spell-hooking si on est obligé de coller toutes ses modifs en un seul pavé : problème de lisibilité.

Alors : Bug ?
Personnellement, ce genre de limitation programmatique me laisse perplexe et refroidi quant à la fiabilité/robustesse du système, je sais pas ce qu'ils ont bricolé pour autoriser le spell-hooking, mais c'est pas clair. Pourquoi est-ce que le script de spell-hooking se lance "fires" plus d'une fois ????
Je préssens qu'il doivent attendre la sortie du script indiqué dans leur indicateur de spell-hooking. (le nom du script est déclaré au moment du chargement du module)
et que les digressions par appels de fonctions ou ExecuteScript doit bien mettre le bazar.

Je laisse ceci ouvert à votre sagacité, dans l'espoir de trouver une solution robuste et ... performante.
 
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 63.32ms