Login: Pass:
Tink



Inscrit le: 05 Jan 2007
Messages: 136
Message Posté le: 26/06/2009 18:07 Sujet du message: [résolu] respawn à moitié fonctionnel
Bonjour à tous ! J'ai un petit problème et je ne croit pas avoir trouvé la solution à celui-ci dans les sujets déjà existant, vous m'excuserez donc si il en existe une que je n'aurais pas vu... Confused

Mon soucis est avec le script de respawn (celui du jeu de base, qui utilise le NW_DEATH_TEMPLE). Au moment du respawn, je suis bien transporté au point désigné, mais le personnage ne perd ni exp ni or alors que c'est bien spécifié dans le script (je crois... Confused ).

Sauriez-vous d'où peut venir le problème ? Merci d'avance pour vos éventuelles réponses !

Le script en question (nw_o0_respawn) :
Code:

//::///////////////////////////////////////////////
//:: Generic On Pressed Respawn Button
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
// * June 1: moved RestoreEffects into plot include
*/
//:://////////////////////////////////////////////
//:: Created By:   Brent
//:: Created On:   November
//:://////////////////////////////////////////////
#include "nw_i0_plot"

// * Applies an XP and GP penalty
// * to the player respawning
void ApplyPenalty(object oDead)
{
    int nXP = GetXP(oDead);
    int nPenalty = 50 * GetHitDice(oDead);
    int nHD = GetHitDice(oDead);
    // * You can not lose a level with this respawning
    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
       nNewXP = nMin;
    SetXP(oDead, nNewXP);
    int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));
    // * a cap of 10 000gp taken from you
    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;
    }
    AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
    DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
    DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}

///////////////////////////////////////////////////////////////////////
// this function resets variabls and clears the arenas in the fighter
// 'gauntlet' subplot in chapter one
///////////////////////////////////////////////////////////////////////

void ClearArena(object oPC,string sArena)
{
    if(sArena == "Map_M1S4C")
    {
        DestroyObject(GetObjectByTag("M1S04CHRUSK02"));
        DestroyObject(GetObjectByTag("M1S4CBeast"));
        SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4HruskDef",0);
    }
    else if(sArena == "Map_M1S4D")
    {
        DestroyObject(GetObjectByTag("M1S04CFASHI02"));
        DestroyObject(GetObjectByTag("M1S4DBeast"));
        SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4FashiDef",0);
        CreateItemOnObject("M1S04IBADGELVL01",oPC);
    }
    else if(sArena == "Map_M1S4E")
    {
        DestroyObject(GetObjectByTag("M1S04CAGAR02"));
        DestroyObject(GetObjectByTag("M1S4EBeast"));
        SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4AgarDef",0);
        CreateItemOnObject("M1S04IBADGELVL02",oPC);
    }
    else if(sArena == "Map_M1S4F")
    {
        DestroyObject(GetObjectByTag("M1S04CCLAUDUS02"));
        DestroyObject(GetObjectByTag("M1S4FBeast",0));
        DestroyObject(GetObjectByTag("M1S4FBeast",1));
        SetLocalInt(GetObjectByTag(sArena),"NW_A_M1S4ClaudusDef",0);
        CreateItemOnObject("M1S04IBADGELVL03",oPC);
    }
    SetLocalInt(oPC,"NW_L_M1S4Won",FALSE);
    SetLocalInt(GetModule(),"NW_G_" + sArena + "_Occupied",FALSE);
}

//////////////////////////////////////////////////////////////////////////////


void main()
{
    object oRespawner = GetLastRespawnButtonPresser();
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
    RemoveEffects(oRespawner);
    //* Return PC to temple



    string sDestTag =  "NW_DEATH_TEMPLE";
    string sArea = GetTag(GetArea(oRespawner));
    /*
      CHAPTER 1 SPECIAL CASE
    */
    if (sArea == "MAP_M1S3B")
    {
        sDestTag = "M1_WIZSPAWN";
    }
    else
    if (sArea == "Map_M1S4E" || sArea == "Map_M1S4C" || sArea == "Map_M1S4D" || sArea == "Map_M1S4F")
    {
        sDestTag = "M1_FIGSPAWN";
        ClearArena(oRespawner,sArea);
    }
    else
    /*
      CHAPTER 2 SPECIAL CASE
    */
/*
    if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(GetLocation(GetObjectByTag("M2Q2F2_M2Q2G")), GetLocation(oRespawner)) < 5.0 && GetLocalInt(GetModule(),"NW_M2Q2E_WoodsFreed") == 0)
    {

      sDestTag = "WP_M2Q2GtoM2Q2F";
    }
    else
*/
    // * Druid Match
    if (sArea == "MAP_M2Q2E2")
    {
      sDestTag = "WP_M2Q2E_ENDDCC";
      DestroyObject(GetObjectByTag("M2Q2EWELCARFT"));
      DestroyObject(GetObjectByTag("M2Q2EHENNAFT"));
      DestroyObject(GetObjectByTag("M2Q2EJANKENFT"));
      DestroyObject(GetObjectByTag("M2Q2EELGARFT"));
      // * June 2002: Destroy pets as well
      DestroyObject(GetObjectByTag("M2Q2EWELCARFTPET"));
        DestroyObject(GetObjectByTag("M2Q2EHENNAFTPET"));
        DestroyObject(GetObjectByTag("M2Q2EJANKENFTPET"));
        DestroyObject(GetObjectByTag("M2Q2EELGARFTPET"));
     
     
      SetLocalInt(GetObjectByTag("M2Q2EJAER"),"NW_M2Q2E_LFIGHT",FALSE);
    }
    /*
       CHAPTER 3 SPECIAL CASE
    */
    else
    // * time travel dungeon past - Dungeon
    if (sArea == "M3Q2G")
    {
        sDestTag = "WP_ALTERNATE_SPWN";
    }
    // * time travel dungeon past - Grove
    else
    if (sArea == "M3Q2I")
    {
        sDestTag = "WP_ALTERNATE_SPWN";
    }
    if (GetIsObjectValid(GetObjectByTag(sDestTag)))
    {

        if (sDestTag == "NW_DEATH_TEMPLE")
        {
            object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
            //SetLocalInt(oPriest, "NW_L_SAYONELINER", 10);

            //AssignCommand(oPriest, DelayCommand(3.0,ActionStartConversation(oRespawner)));
            AssignCommand(oPriest, DelayCommand(2.1, PlayVoiceChat(VOICE_CHAT_TALKTOME, oPriest)));

            SetLocalLocation(oRespawner, "NW_L_I_DIED_HERE", GetLocation(GetLastRespawnButtonPresser()));
            SetLocalInt(oRespawner, "NW_L_I_DIED", 1);
            SetLocalObject(oPriest, "NW_L_LASTDIED", GetLastRespawnButtonPresser());
            // * April 2002: Moved penalty here, only when going back to the death temple
            ApplyPenalty(oRespawner);
        }
        object oSpawnPoint = GetObjectByTag(sDestTag);
        AssignCommand(oRespawner,JumpToLocation(GetLocation(oSpawnPoint)));
        // * mak
    }
    else
    {
        // * do nothing, just 'res where you are.
    }
 }


Dernière édition par Tink le 28/06/2009 10:20; édité 1 fois
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Laban
Modérateur


Inscrit le: 03 Juin 2007
Messages: 103
Message Posté le: 27/06/2009 10:18 Sujet du message:
C'est curieux, si tu es bien porté au waypoint "NW_DEATH_TEMPLE" tu devrais subir les pénalités.

Ajoute un
Code:
SendMessageToPC( GetFirstPC(), "fonction lancée" );
au début de la fonction ApplyPenalty() et recompile pour voir si tu reçois le message.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Tink



Inscrit le: 05 Jan 2007
Messages: 136
Message Posté le: 27/06/2009 18:23 Sujet du message:
J'ai testé et le message ne s'affiche pas, mais je crois avoir trouvé la source du problème :

J'ai des versions modifiées des scripts gui_death_respawn et gui_death_respawn_self sur mon module et il semble qu'elles soient utilisées à la place du nw_o0_respawn (qui ne fonctionne pas, en fait : il ressuscite le personnage sur place comme si le Waypoint NW_DEATH_TEMPLE n'existait pas)

Comme j'avais intégrés ces modifications il y a longtemps et qu'elles ne figurent pas dans les scripts de module (onRespawn et autres), j'avais un peu oublié leur existence. Les deux scripts contiennent les lignes suivantes :

Code:
void main()
{
   object oPJ = OBJECT_SELF;
   object oZone = GetObjectByTag("zone_hrp");
   float fOrientation = GetFacing(oPJ);
   vector vPosition = GetPosition(GetObjectByTag("NW_DEATH_TEMPLE"));
   location lEndroit = Location(oZone, vPosition, fOrientation);
   effect eRes = EffectResurrection();

   WakeUpCreature(oPJ);
   RemoveDeathScreens(oPJ);
   AssignCommand(oPJ, JumpToLocation(lEndroit));
   ApplyEffectToObject(DURATION_TYPE_INSTANT, eRes, oPJ);
}


Effectivement, elles ne contiennent aucune ligne de perte d'or et d'exp :s
Du coup j'ai ajouté la fonction des pénalités et son appel comme ceci :

Code:
#include "ginc_death"

void ApplyPenalty(object oDead)
{
    int nXP = GetXP(oDead);
    int nPenalty = 50 * GetHitDice(oDead);
    int nHD = GetHitDice(oDead);
    // * You can not lose a level with this respawning
    int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

    int nNewXP = nXP - nPenalty;
    if (nNewXP < nMin)
       nNewXP = nMin;
    SetXP(oDead, nNewXP);
    int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));
    // * a cap of 10 000gp taken from you
    if (nGoldToTake > 10000)
    {
        nGoldToTake = 10000;
    }
    AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
    DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
    DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}

void main()
{
   object oPJ = OBJECT_SELF;
   object oZone = GetObjectByTag("zone_hrp");
   float fOrientation = GetFacing(oPJ);
   vector vPosition = GetPosition(GetObjectByTag("NW_DEATH_TEMPLE"));
   location lEndroit = Location(oZone, vPosition, fOrientation);
   effect eRes = EffectResurrection();

   WakeUpCreature(oPJ);
   RemoveDeathScreens(oPJ);
   AssignCommand(oPJ, JumpToLocation(lEndroit));
   ApplyEffectToObject(DURATION_TYPE_INSTANT, eRes, oPJ);
   ApplyPenalty(oPJ);
}


De cette manière ça à l'air de fonctionner.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Laban
Modérateur


Inscrit le: 03 Juin 2007
Messages: 103
Message Posté le: 27/06/2009 22:36 Sujet du message:
OK. Résolu, donc ?
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Argyl



Inscrit le: 26 Juil 2006
Messages: 347
Message Posté le: 28/06/2009 0:08 Sujet du message:
Qu'est-ce qu'il est impatient cet homme, boudiou ! Very Happy
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Tink



Inscrit le: 05 Jan 2007
Messages: 136
Message Posté le: 28/06/2009 10:20 Sujet du message:
Résolu, donc ^^
Et désolé pour le dérangement ! Confused
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Laban
Modérateur


Inscrit le: 03 Juin 2007
Messages: 103
Message Posté le: 29/06/2009 8:22 Sujet du message:
Bien.

*Bat bruyamment Argyl avec une flamberge sans texture* Sacripant, ne t'ai-je donc pas appris à distinguer la concision de l'impatience ?
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Argyl



Inscrit le: 26 Juil 2006
Messages: 347
Message Posté le: 1/07/2009 12:49 Sujet du message:
Euh ..... Nan !

En grève de DAME tant que la flamberge sera sans texture (et la roue de moulin aussi d'ailleurs Twisted Evil )
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
New Kleth



Inscrit le: 02 Oct 2009
Messages: 4
Message Posté le: 6/11/2009 10:31 Sujet du message:
Je sais que ma question arrive comme un cheveux dans la soupe mais je ne sais pas où la poser et trouve inutile d'ouvrir un topic. Donc voilà ma question : comment s'appelle le langage de script, j'ai vaguement abordé le java par un moment et il s'y apparente.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé Envoyer l'e-mail
Argyl



Inscrit le: 26 Juil 2006
Messages: 347
Message Posté le: 6/11/2009 17:18 Sujet du message:
C'est du NwScript. Ça a comme beaucoup de langage, beaucoup de points communs, mais comme tout langage ça a ses défauts propres, ses avantages propres et ses propres limites.
Répondre en citant
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   

Page 1 sur 1
Sauter vers:  

 

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

Traduction par : phpBB-fr.com
Powered by phpBB © 2001, 2007 phpBB Group