Erreur de Compilation

Répondre
Partager Rechercher
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.
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.
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);
        }
    }
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.
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.
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...).
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.
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 ...
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?
Il faut éviter la plage 0 - 3000, elle est utilisée par les plaçables de l'OC, MoTB et SoZ. On peut donc commencer à 3001. La seule précaution est qu'il ne faut pas laisser de trous. Dans ce cas on laisse des lignes vides (en gros remplies de champs avec '****')

Comment en général je renumérote pour mon compte et constitue mon placeable.2da je n'ai fait très attention aux autres plages "réservées" mais je sais que rjshae évite en général les conflits avec les autres haks connus comme le mediéval de Tupoun, le BCK de Nytir, les constructions RWS, etc ...

Il faut qu'un seul et unique hak contienne le placeable.2da. Perso je le mets dans un petit hak que j'appelle xx_misc selon la campagne.
Répondre

Connectés sur ce fil

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