Bugs et autres bizarreries

Répondre
Partager Rechercher
Comme il a été constaté sur >> CE SUJET << sur les forums de neverwinternights2.fr, utiliser la fonction "GetHasSpell(...)" se révèle plutôt acrobatique par rapport aux classes qui doivent mémoriser les sorts.

Deux cas se présentent :
  • la mémorisation avec métamagie est simplement signalée par des utilisations supplémentaires du même sort :
    Par exemple, en ayant mémorisé "Stimulant" et son équivalent avec la métamagie "Incantation statique", "GetHasSpell(...)" me renvoie 4 utilisations disponibles.
  • les conversions spontanées se rajoutent selon la classe en nombre de sorts mémorisés +1 :
    Par exemple, avec un prêtre, si je mémorise un sort de niveau 1, son équivalent "Soins" et "Blessure" sera détecté. Sinon, pour toutes les classes, le sort "Convocation de créatures" sera détecté également.

Et encore ça n'est qu'un maigre aperçu des aberrations que l'on pourra remarquer grâce à un script de test habilement créé par Kylban. Personellement j'ai utilisé le script suivant, sur un plaçable utilisable :
Code PHP:

void main()
{
    
object oPC GetLastUsedBy();
    
int nSpell,nNumSpell,nMaxSpells;
    
string szMessage;
    for(
nSpell=0;nSpell<=1500;nSpell++)
    {
        
nNumSpell GetHasSpell(nSpell,oPC);
        if(
nNumSpell!=0)
        {
            
nMaxSpells += nNumSpell;
            
// Assigne un numéro simple à une contante
            // Liste le nombre de fois qu'un sort peut être lancé
            
szMessage += "<color=white>Sort :</color> <color=#77FF77>"+GetStringByStrRef(StringToInt((Get2DAString("spells","Name",nSpell))))+"</color>";
            
szMessage += "\n- Identifiant : <color=#77FF77>"+IntToString(nSpell)+"</color>";
            
szMessage += "\n- Nombre d'utilisations : <color=#77FF77>"+IntToString(nNumSpell)+"</color>";
            
szMessage += "\n\n";
        }
    }
    
//Donne le nombre total de sort en mémoire
    
SendMessageToPC(oPC,szMessage+"<color=white>Total des sorts mémorisés :</color> <color=#77FF77>"+IntToString(nMaxSpells)+"</color>");

Dans mon test, j'ai mémorisé les sorts "Lumière", "Stimulant", ainsi "Résistance" et "Stimulant" en incantation statique.

Bon appétit.
Miniatures attachées
Cliquez sur l'image pour la voir en taille réelle

Nom : youpi.jpg
Taille : 185x434
Poids : 23,3 Ko
ID : 31298  
Comme il a été constaté sur >> CE SUJET << sur les forums de neverwinternights2.fr, il semblerait que la fonction "SetInfiniteFlag(...)" supprime toute variable locale inscrite sur un item contenu dans une échoppe.

Carter_DC a trouvé une solution alternative, grâce au morceau de script suivant :
Code PHP:

// A mettre dans le script de l'événement "OnItemAcquired" du module.

object oItem GetModuleItemAcquired();
object oPreviousOwner GetModuleItemAcquiredFrom();

// On vérifie d'où provient l'item acquis :
if(GetObjectType(oPreviousOwner)==OBJECT_TYPE_STORE)
{
    
// s'il vient d'un magasin, on y place une copie de l'item :
    
CopyItem(oItem,oPreviousOwner,TRUE);

Dans l'éditeur de script, les constantes FEAT_BACKGROUND_DEVOUT et FEAT_BACKGROUND_FARMER se sont vu déclarer la même valeur (1719). Utiliser la seconde reviendra en fait à utiliser la première.


Si vous désirez vous servir de la constante FEAT_BACKGROUND_FARMER, il faudra utiliser sa véritable valeur : 1720.
Dans l'éditeur de script, les constantes IP_CONST_CASTSPELL_ISAACS_LESSER_MISSILE_STORM_13 et IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15 se sont vu déclarer les valeurs 586 et 587.

En fait, ces valeurs correspondent déjà aux constantes IP_CONST_CASTSPELL_IRON_BODY_15 et IP_CONST_CASTSPELL_IRON_BODY_20.


Si vous désirez vous servir des constantes suivantes, il faudra utiliser leur valeur réelle :

Pour IP_CONST_CASTSPELL_ISAACS_LESSER_MISSILE_STORM_13, il faudra utiliser la valeur 378.
Pour IP_CONST_CASTSPELL_ISAACS_GREATER_MISSILE_STORM_15, il faudra utiliser la valeur 379.
Je me permet de deterrer ce topic for intéressant, etant en train de scripter un systeme d'interraction avec des compagnon d'armes type henchmen en ce moment.

J'ai peut etre mal regarde dans nwscript.nss mais je n'ai pas reussi a mettre la main sur Aide De Groupe...

Mass Aid en anglais (theoriquement^^). Je n'arrive pas a trouver cette constante, si quelqu'un a la solution ce serait super!

Deuxieme question, j'ai un dialogue permettant au PJ de demander un buff au pnj (buff apparaissant dans les choix de dialogue selon ce que le pnj a en memoire a l'instant t).
Lorsqu'on demande un buff pour la premiere fois tout se passe bien, lorsqu'on redemande de buffer (un autre ou le meme) le pnj se met en position type je vais commencer a caster, mais ne fait rien.
Si on lui RE-demande encore une fois, il buff.

Il semblerait qu'il y ait une regle d'1/2... Meme avec un ClearAllActions() apres avoir lance le buff ca ne corrige pas le probleme.
(fonction : CastSpellAtObject de memoire, pas mis d'assign command ceci dit, peut etre cela vient-il de la ?)

Si la encore quelqu'un a une idee... je suis preneur
Effectivement, aide de groupe ne semble pas avoir de constante dédiée, à moins qu'ils aient fait une faute d'orthographe dans son nom et qu'elle soit par conséquent ailleurs dans la liste, ce qui est possible...

Cela dit, tu doit pouvoir créer toi même la constante nécessaire pour l'utiliser via un script. Je te conseille de créer un nouveau script pour te servir de "sac à constantes" et d'y ajouter une ligne comme suit :

const int SPELL_MASS_AID = 1052;

Tout ça doit rester en dehors d'une fonction (pas de void main() dans ce script, surtout). Par la suite, tu n'as qu'à mettre un include au début du script ou tu as besoin de la constante, comme ceci :
#include "nom_du_script_a_constantes"

Et la constante toute neuve devrait apparaître dans la liste de constantes pour ce script, mais je garanti rien vu que je suis pas super calé dans ce domaine (enfin ce que j'ai fais de cette manière à fonctionné, jusqu'ici ! ^^)

Si je me suis pas trompé, la déclaration d'une constante fonctionne ainsi :
const signifie qu'on déclare une constante, et pas une variables.
int signifie que la constante contient un nombre.
SPELL_ devant le nom de la constante déclarée doit permettre de faire le lien avec le spells.2da, mais c'est la partie pour laquelle je ne suis pas certain. Personnellement, j'ai testé avec SKILL_ pour ajouter les constantes de nouvelles compétences que j'ai créé et ça a marché, alors ça devrait faire de même pour SPELL_ ^^'
1052 est le numéro de ligne du sort aide de groupe (mass aid) dans le spells.2da.

Voilà. Essaie toujours ça et dit moi si ça fonctionne. C'est tout ce que j'ai a proposer, je le craint...
Pour ce qui est de ta deuxième question, je n'ai pas de solution sur le sujet, n'ayant jamais expérimenté là dessus. ^^'
Concernant SPELL_, il s'agit juste d'un repère dans le nom de la constante. Rien de bien compliqué, donc.

Le plus important, c'est la valeur attribuée à la constante. Le nom importe peu au final, et on pourrait tout autant l'appeler SORT_AIDE_GROUPE que rien ne changerait.
Mais du coup, comme on n'indique pas à quel .2da la constante se réfère dans sa déclaration, où est-ce que ça se fait ?
Si on utilise un GetHasSpell(), il ira automatiquement chercher dans le spells.2da, peut importe la constante ?
Les fonctions savent toutes seules avec quel 2da elles travaillent. Les constantes ne sont ni plus moins que des numéros de lignes du dit 2da.

En gros avec:
Code PHP:

const int SPELL_MASS_AID 1052;
GetHasSpellSPELL_MASS_AID ); 
Le jeu ira regarder à la ligne 1052 de spell.2da.
Cependant,
Code PHP:

GetHasSpell1052 ); 

Aurait tout aussi bien fonctionné. Les constantes ne sont juste que des noms donnés à des variables, ce qui importe ce sont leur valeur.
Citation :
Publié par C.DuK
Les fonctions savent toutes seules avec quel 2da elles travaillent. Les constantes ne sont ni plus moins que des numéros de lignes du dit 2da.

En gros avec:
Code PHP:

const int SPELL_MASS_AID 1052;
GetHasSpellSPELL_MASS_AID ); 
Le jeu ira regarder à la ligne 1052 de spell.2da.
Cependant,
Code PHP:

GetHasSpell1052 ); 

Aurait tout aussi bien fonctionné. Les constantes ne sont juste que des noms donnés à des variables, ce qui importe ce sont leur valeur.
Les scripts dans NWN2 étant ce qu'ils sont la deuxième solution semble ne pas toujours fonctionner
Khagnil, confirmes-tu qu'il y a parfois des erreurs lorsqu'on n'indique que l'entier lie a la constante ?

Quels sont les effets indesirables dues a cette maniere de faire ?

Merci
Réponse 1 : Non, à moins que comme moi tes doigts puissent bégayer lorsque tu tapes la valeur. Le tout est de la chercher dans le fichier 2DA. Il y a sûrement plus de risques d'avoir une erreur en tapant le nom (car certaines constantes sont mal déclarées dans le jeu lui-même). Le fichier 2DA détient donc l'ultime vérité.

Réponse 2 : Aucun. Le script non-compilé sera même un peu plus léger pour ton module. Ah si, en relisant le script plus tard, peut-être que tu passeras un peu plus de temps à vérifier le fichier 2DA, si tu as oublié à quoi correspondait la valeur.
De mémoire, il y a des cas où si tu mets un chiffre à la place d'une constante égale à cette valeur cela ne compile pas... mais sur le principe cela devrait fonctionner
Répondre

Connectés sur ce fil

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