JeuxOnLineForumsPlusConnectés : 319 (sites) | 767 (forums)Créer un compte
Neverwinter Nights 2
La Tour des Arcanes
Répondre
Partager Outils Rechercher
Soriel
Dame
 
Technique / toolset

Erreur de Compilation

Bonjour,

Je viens récemment de me décider de passer de nwn1 à nwn2 et suis encore en train de me faire à l'éditeur.
Mon soucis réside dans l'installation d'un hak. J'ai suivi à la lettre les instructions données.
Cependant un grand nombre de plaçables ne fonctionnent pas et en vérifiant le module, j'ai eu ce message:

Error: Erreur de compilation plc_only_use_once: plc_only_use_once.nss(36): ERREUR : NO RIGHT BRACKET ON EXPRESSION

Il s'agit de ce hak (les trois volumes):

http://neverwintervault.org/project/nwn2/prefab/placeable/city-state-project-volume-i

Les haks, je ne connais pas du tout. Pour les projets auxquels j'ai participé sous nwn1, je m'occupais de scripts et mapping, un autre avait les haks en charge: je n'y ai donc jamais touché avant.
Si quelqu'un avec une patience d'ange et n'hésitant pas à me parler comme si j'avais cinq ans et n'y connaissais rien pouvait m'aider, je lui en serais éternellement reconnaissante.
Merci.
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
En gros un hak (ou erf), c'est un conteneur de ressources, un peu comme une archive zip (mais sans compression je crois). Tu peux ouvrir ces conteneur avec un logiciel qui gère ces formats, de mémoire j'utilisais NwnPacker.

Tu vas ouvrir ton hak avec le logiciel que tu auras choisi, et tu auras dedans une liste de ressources (d'autre fichiers). Il y aura quelque part le script en question : plc_only_use_once.nss.
Une fois que tu l'auras trouvé, tu pourras le coller ici pour qu'on le regarde. On le corrigera et tu n'auras plus qu'à refaire le hak.
Lien direct vers le message - Vieux
Soriel
Dame
 
Merci beaucoup.

J'ai trouvé le script en question. Je cous le colle ici.

Code:
//::///////////////////////////////////////////////
//:: OnUse: activates the placeable, and sets a flag to prevent further uses
//:: plc_only_use_once
//:: Copyright (c) 2014 4760.
//:://////////////////////////////////////////////
/*

    Simple script to run the Activate animation of a placeable that supports it.

    Placeables that are running this script will remain in their activated state after execution.

*/
//:://////////////////////////////////////////////
//:: Created By: Thierry Petitjean
//:: Created On: 29/04/2014
//:://////////////////////////////////////////////


void ActionCreateObject(string sCreateWeaponPLC, string sCreateWeaponIT, location lWhere)
{
    object oWeapon;
       object oSELF = OBJECT_SELF; 
    // CreateObject returns an object, but DelayCommand only works with void functions, so we wrap CreateObject within ActionCreateObject
    oWeapon = CreateObject(OBJECT_TYPE_PLACEABLE, sCreateWeaponPLC, lWhere);
    // au cas où l'objet n'aurait pas été créé (non utilisation du hak "Item placeables" de Kivinen)
    if (GetObjectByTag(sCreateWeaponPLC) == OBJECT_INVALID)
    {
        oWeapon = CreateObject(OBJECT_TYPE_ITEM, sCreateWeaponIT, lWhere);
    }
    // mais de toute façon, même si le placeable existe, il doit maintenant faire référence à l'objet choisi et pas la version par défaut
    else
    {
        SetLocalString(oWeapon, "item_resref", sCreateWeaponIT);
        // mise à l'échelle
        float fEchelle = GetLocalFloat(oSELF, "fScale");
        if (fEchelle == 0f) fEchelle = 1.0;
        SetScale(oWeapon, GetScale(oSELF, SCALE_X)*fEchelle, GetScale(oSELF, SCALE_Y)*fEchelle, GetScale(oSELF, SCALE_Z)*fEchelle);
    }
}

void main()
{
   // note that nActive == 1 does  not necessarily mean the placeable is active, that depends on the initial state of the object
       object oSELF = OBJECT_SELF; 
    int bDontRun = GetLocalInt(oSELF, "IS_ACTIVATED_BY_OTHER_PLC");
    if (bDontRun != 0)
    {
        string sMessage = (GetGlobalInt("nLangue")==0?"Nothing happens. There must be another way...":"Rien ne se passe. Il doit y avoir une autre méthode");
        SendMessageToPC(GetFirstPC(FALSE), sMessage);
        return;
    }
       int nActive = GetLocalInt(oSELF, "IS_PLC_ACTIVATED");
    float fDuration = GetLocalFloat(oSELF, "fDuration");
    string sCreateWeaponPLC = GetLocalString(oSELF, "sCreateWeaponPLC");
    string sCreateWeaponIT = GetLocalString(oSELF, "sCreateWeaponIT");
    float fDistance =  GetLocalFloat(oSELF, "fDistance"); // distance entre le pivot de la statue et celui de la hache à créer
    float fAngle =  GetLocalFloat(oSELF, "fAngle"); // angle (en degrés) entre les deux pivots par rapport au Nord
    float fHeading =  GetLocalFloat(oSELF, "fHeading"); // angle (en degrés) entre la position par défaut de l'arme à créer (placeable à plat) et celle recherchée
    location lWhere = GetLocation(oSELF);
   // * Play Appropriate Animation
    if (!nActive)
    {
        ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE, fDuration);
        if (GetStringLength(sCreateWeaponPLC) > 0)
        {
            // calcul de la position où créer l'objet libéré par l'activation
            vector vCoordinates = GetPositionFromLocation(lWhere); // position de la statue
            vector vOffset; // position RELATIVE de l'objet à créer par rapport à la statue
            float fFacing = GetFacing(oSELF) - fHeading; // alignons l'objet avec la statue
             // restons dans l'intervalle [0 ; 360[
            if (fFacing < 0.0) fFacing += 360.0;
            if (fFacing > 360.0) fFacing -= 360.0;
            vOffset.x = fDistance * cos(fFacing + fAngle) * GetScale(oSELF, SCALE_X);
            vOffset.y = fDistance * sin(fFacing + fAngle) * GetScale(oSELF, SCALE_Y);
            vOffset.z = 0.0;
            lWhere = Location(GetArea(oSELF), vCoordinates + vOffset, fFacing);
            // l'animation dure quelques secondes : attendons le temps suffisant avant de créer l'objet
            DelayCommand(fDuration-0.1, ActionCreateObject(sCreateWeaponPLC, sCreateWeaponIT, lWhere));
            // y a-t-il un deuxième objet à créer ?
            sCreateWeaponPLC = GetLocalString(oSELF, "sCreateShieldPLC");
            sCreateWeaponIT = GetLocalString(oSELF, "sCreateShieldIT");
            fAngle =  GetLocalFloat(oSELF, "fAngle2"); // angle (en degrés) entre les deux pivots par rapport au Nord
            if (GetStringLength(sCreateWeaponPLC) > 0)
            {
                // calcul de la position où créer l'objet libéré par l'activation
                vOffset.x = fDistance * cos(fFacing + fAngle) * GetScale(oSELF, SCALE_X);
                vOffset.y = fDistance * sin(fFacing + fAngle) * GetScale(oSELF, SCALE_Y);
                vOffset.z = GetLocalFloat(oSELF, "fZ");
                lWhere = Location(GetArea(oSELF), vCoordinates + vOffset, fFacing);
                // l'animation dure quelques secondes : attendons le temps suffisant avant de créer l'objet
                DelayCommand(fDuration+0.5, ActionCreateObject(sCreateWeaponPLC, sCreateWeaponIT, lWhere));
            }
        }
        SetLocalInt(oSELF, "IS_PLC_ACTIVATED", 1);
    }
    else
    {
        int bReversible = GetLocalInt(oSELF, "bReversible");
        if (bReversible != 0)
        {
            ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE);
            SetLocalInt(oSELF, "IS_PLC_ACTIVATED", 0);
        }
    }
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
Je ne vois pas d'erreur particulière à la ligne 36. Cependant le script n'a pas de crochet fermant le main (dernière ligne), ça pourrait provoquer l'affichage d'une erreur bizarre.
Lien direct vers le message - Vieux
Avatar de Perouk'
Perouk'
Duc
 
Avatar de Perouk'
 
Le compilateur comprend bien le "0f" ?
En remplaçant par 0.0 est-ce que cela change quelque chose ?

Je me pose la question car c'est le seul endroit ou un float est déclaré comme ça. Partout ailleurs il y a des 0.0.
Lien direct vers le message - Vieux
Avatar de Mythyzyn
JOL Mythyzyn
Alpha & Oméga
 
Avatar de Mythyzyn
 
Oui, comme tu dis Perouk

if (fEchelle == 0f) fEchelle = 1.0;

=> if (fEchelle == 0.0) fEchelle = 1.0;

Et ça devrait rouler ;-)
Lien direct vers le message - Vieux
Soriel
Dame
 
Merci beaucoup. Je vais tenter ça.
Lien direct vers le message - Vieux
Soriel
Dame
 
En effet, plus de message d'erreur... en revanche les plaçables absents ne sont pas apparus.
Lien direct vers le message - Vieux
Avatar de Mythyzyn
JOL Mythyzyn
Alpha & Oméga
 
Avatar de Mythyzyn
 
Les placeables absents de où ne sont pas apparus où ? ^^
Lien direct vers le message - Vieux
Soriel
Dame
 
En gros... après avoir installé le hak et importé le erf, un nouveau répertoire est apparu dans la liste des placeables de l'éditeur. Et toute une partie de la liste (la nouvelle) ne fonctionne pas. Rien n'apparait et si je regarde les propriétés, il n'y a pas d'apparence (alors qu'il y a des noms comme airship, scarecrow, boat...).
Lien direct vers le message - Vieux
Avatar de Claudius33
Claudius33
Grand duc
 
Avatar de Claudius33
 
Bonsoir,

Je pose quand même la question, on ne sait jamais :
Est-ce que le hak a bien été associé au module? Propriétés du module Hak Paks.
Puis sauver, fermer l'éditeur, rouvrir et charger le module.
Lien direct vers le message - Vieux
Soriel
Dame
 
Oui, j'ai même essayé plusieurs fois. J'ai même vérifié dans la description de son auteur si le erf et le 2da comportaient les trois parties.
Lien direct vers le message - Vieux
Soriel
Dame
 
Si quelqu'un q une idée, la moindre... Je suis un peu coincée dans mon projet...




Dernière modification par Soriel ; 24/04/2016 à 09h51.
Lien direct vers le message - Vieux
Avatar de Claudius33
Claudius33
Grand duc
 
Avatar de Claudius33
 
Il peut y avoir un pb de numérotation entre l'erf et le placeable.2da. Ces haks (citystate, ...) contiennent peut être des placeables.2da qui entrent en conflit avec le placeable.2da actif ou entre eux.

C'est un peu lourdingue car il faut parfois renuméroter soi même et s'assurer qu'il n'y a qu'un seul placeable.2da en les fusionnant en un seul. Mais cela peut créer un décalage de numération avec les erf fournis.

Dans ce cas, prendre les placeables un par par un, pour chacun cliques dans la propriété apparence puis sur la petite flèche qui s'affiche et fais défiler la liste pour choisir la bonne. (En fait le toolset est très permissif, tu peux prendre un abreuvoir et lui donner une apparence de lampadaire si ça te fait plaisir). Une fois toutes les apparences fixées, exportes les blueprints corrigés dans un erf à toi. Si tu voies toutes les apparences voulues fait simplement comme ça sans te prendre la tête avec les fusions de placeable.2da.

rhjsae n'est pas très clair dans ses explications, je comprends que le 2 peut être utilisé indépendamment du 1, mais que le placeable.2da du 3 contient les éléments du 1. Bref en utilisant les 3, il y a peut être un décalage ...
Lien direct vers le message - Vieux
Soriel
Dame
 
Ok, merci.
En gros, il va falloir que je mette les mains dans le cambouis ^^ (fallait bien que ça arrive un jour)

J'aurais une dernière question, si je dois renuméroter les 2da, y en a-t-il un de base et comment fais-je pour m'assurer qu'il n'y a pas conflit entre celui la et celui que je vais refaire?
Lien direct vers le message - Vieux
Répondre

Outils Rechercher
Rechercher:

Recherche avancée

Thème visuel : Fuseau horaire GMT +1. Il est actuellement 02h56.
   

© 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