Les forums JOL

Les forums JOL (http://forums.jeuxonline.info/index.php)
-   NWN2 - La Tour des Arcanes (http://forums.jeuxonline.info/forumdisplay.php?f=481)
-   -   Bugs et autres bizarreries (http://forums.jeuxonline.info/showthread.php?t=843290)

Deyonara 08/11/2007 14h26

Bugs et autres bizarreries
 
1 pièce(s) jointe(s)
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.

Deyonara 08/11/2007 16h29

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);



Deyonara 14/11/2007 22h16

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.

Deyonara 05/12/2007 23h40

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.

El@ndIr 13/09/2010 01h11

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 :merci:

Tink 14/09/2010 14h44

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. ^^'

Deyonara 14/09/2010 19h30

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.

Tink 14/09/2010 20h14

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 ?

C.DuK 15/09/2010 11h07

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.

Tink 15/09/2010 18h02

Bien compris ! :)
Je n'avais jamais pensé à entrer directement le numéro de ligne, du coup. Merci pour le tuyau ! ^^

Khagnil 15/09/2010 20h33

Citation:

Envoyé par C.DuK (Message 21344249)
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 :monstre:

El@ndIr 16/09/2010 01h58

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 :)

Deyonara 17/09/2010 20h59

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.

Khagnil 18/09/2010 14h32

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 :)


Fuseau horaire GMT +1. Il est actuellement 08h01.

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés.