La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 15:41:58


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 06:53:53 Sujet du message : Prob avec un respawn

Bonjour tout le monde, j'ai visité le forum et j'y ai trouvé des instruction pour le script anti deco reco respawn... Seulement voilà, dans le OnRespawn, le personnage ne perd pas son objet (tag cartemort)... Pire, il en obtient un autre...
De l'aide svp:D j'aimerai que tout objet de tag cartemort soit supprimé de l'inventaire au respawn ! merci bcp !
Voici mon script
NWScript :
#include "nw_i0_plot"
void ApplyPenalty(object oDead)
{


    int Mort;
    Mort = 0;

    SetLocalInt(oDead, "campe_mort", Mort);

    int nXP = GetXP(oDead);
    int nPenalty;
    int nHD = GetHitDice(oDead);
    if (nHD < 11)
    {
        nPenalty = 20 * GetHitDice(oDead);
    }
    if ((nHD >= 11) && (nHD < 16))
    {
        nPenalty = 40 * GetHitDice(oDead);
    }
    if (nHD >= 16)
    {
        nPenalty = 80 * 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;

    if (nHD < 11 )
    {
        nGoldToTake =    FloatToInt(0.05 * GetGold(oDead));
    }
    if (( nHD >= 11) && (nHD < 16))
    {
        nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));
    }
    if (nHD >= 16)
    {
        nGoldToTake =    FloatToInt(0.20 * GetGold(oDead));
    }

    /*
    object oGear;
    int Pif;
    if (nHD < 10)
    {
        Pif = 20;
    }
    if ((nHD >= 10) && (nHD < 16))
    {
        Pif = Random(75);
    }
    if (nHD > 16)
    {
        Pif = Random(50);
    }

            if (Pif == 0)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_ARMS, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 1)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_ARROWS, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 2)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_BELT, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 3)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_BOLTS, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 4)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_BOOTS, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 5)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_BULLETS, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 6)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 7)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CHEST, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == Cool
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CLOAK, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 9)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 10)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 11)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 12)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_HEAD, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 13)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 14)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_LEFTRING, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 15)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_NECK, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 16)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
            if (Pif == 17)
            {
                oGear = GetItemInSlot(INVENTORY_SLOT_RIGHTRING, oDead);
                if(GetIsObjectValid(oGear))
                    DestroyObject(oGear);
            }
    */
    // * 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 oPC = GetLastRespawnButtonPresser();


    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";
    }

    //***** Respawn dasn l'arene sans penalites ! *****
    if (sArea == "Arene")
    {
        sDestTag = "NW_DEATH_ARENE";
    }
    if (sArea == "ZONEHRP")
    {
        sDestTag = "NW_DEATH_HRP";
    }

    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
    {
    object oPC = GetLastRespawnButtonPresser();

if (!GetIsPC(oPC)) return;

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC);

RemoveEffects(oPC);

object oCarte = GetItemPossessedBy(oRespawner, "cartemort");
DestroyObject(oCarte);
        object oItemToTake;
        oItemToTake = GetItemPossessedBy(GetLastRespawnButtonPresser(), "cartemort");
        if(GetIsObjectValid(oItemToTake) != 0)
        DestroyObject(oItemToTake);
}
}

Le code a colorer syntaxiquement est trop long (plus de 10240 caractères) et risque de ne pas s'afficher du tout. Vous pouvez le voir en version colorée ici.


Voilà c'est le script, un peu long, mais il n'y a pas une enorme retouche a faire je crois merci ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
-MeteZ-
Seigneur
Inscrit le: 19 Mar 2006
Messages: 205
Localisation: Région Parisienne (95)
Répondre en citant
Posté le : 22/03/2006 08:57:22 Sujet du message : Re: Prob avec un respawn

Remplace cette ligne
NWScript :

        DestroyObject(oItemToTake);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

Par:
NWScript :

        ActionTakeItem(oItemToTake, oRespawner);
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Ca marche ?
_________________
"Ne dit pas affronter les ténèbres celui qui n'a jamais connu la tombée de la nuit."
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 09:06:48 Sujet du message :

Non ca marche toujours pas Confused
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 22/03/2006 09:49:49 Sujet du message :

NWScript :

///...///

//  else /////Vire ce else
    {
    object oPC = GetLastRespawnButtonPresser();

if (!GetIsPC(oPC)) return;

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC);

RemoveEffects(oPC);

object oCarte = GetItemPossessedBy(oPC, "cartemort");
DestroyObject(oCarte);
        /*object oItemToTake;
        oItemToTake = GetItemPossessedBy(GetLastResp awnButtonPresser(), "cartemort");
        if(GetIsObjectValid(oItemToTak e) != 0)
        DestroyObject(oItemToTake); */

}
}/* suspect block end found !*/


Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Remplace la fin du script par ça pour voir (vire le else surtout). Mais je vois pas ou il peut regagner une autre carte dans ce script (en même temps il y a beaucoup de lettres, j'ai pas tout lu Smile).
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 10:03:02 Sujet du message :

Oui c'est bien ca merci Very Happy mais le probleme restant est que lors du respawn, il a peut etre plusieurs "cartemort" dans linventaire, qu'est-ce que je dois faire pour qu'il n'y en at plus du tout svp?? merci bcp
Sinon cest bien ca merci ^^
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 22/03/2006 10:09:53 Sujet du message :

Le mieux serait de t'arranger pour qu'il n'y en ait qu'une. Mais sinon tu peux faire ça. Remplace à la fin (même endroit que tatalheure) par

NWScript :

//..//
object oPC = GetLastRespawnButtonPresser();

if (!GetIsPC(oPC)) return;

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC);

RemoveEffects(oPC);

object oItem = GetFirstItemInInventory(oPC);
while (oItem != OBJECT_INVALID)
{
    if (GetTag(oItem) == "cartemort") DestroyObject(oItem);
    object oItem = GetNextItemInInventory(oPC);
}

}/* suspect block end found !*/

}/* suspect block end found !*/

Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 10:32:04 Sujet du message :

On m'anonce un ERROR TOO MANY INSTRUCTION et les autres piques de mort restent Confused , à quoi est-ce du svp ??
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 22/03/2006 10:49:05 Sujet du message :

Uh ?

J'en sais rien....
Le while à l'air correct... (too many machin c'est quand il fait une boucle infinie, comme si il avançait pas dans le while)

T'as bien recopié (question bête...)

a tout hasard (mais ça a aucun rapport normalement) :
remplace while(oItem!=OBJECT_INVALID) par while(GetIsObjectValid(oItem))

et DestroyObject(oItem); par DestroyObject(oItem,0.1);

Mais bon vraiment ça devrait rien changer, je sais pas d'ou ça vient.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 11:01:22 Sujet du message :

J'ai remplacé comme tu me l'as suggéré, et le resultat est le meme
(note : le respawn est bien plus long que d'habitude, mais c'est depuis le remplacement du début, pas depuis celui la)

Niveau erreur en recopiant, c'est possible (ou du moins en insérant)
Voilà le script : (enfin la fin, qui nous interesse)

NWScript :
// ce qui a avant ne nous interesse pas //
                if (sDestTag == "NW_DEATH_TEMPLE")
        {
            object oPriest = GetObjectByTag("NW_DEATH_CLERIC");
            //SetLocalInt(oPriest, "NW_L_SAYONELINER", 10);

            //AssignCommand(oPriest, DelayCommand(3.0,ActionStartCo nversation(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
    }/* suspect block end found !*/

{


object oPC = GetLastRespawnButtonPresser();

if (!GetIsPC(oPC)) return;

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC);

ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)), oPC);

RemoveEffects(oPC);

object oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
{
    if (GetTag(oItem) == "cartemort") DestroyObject(oItem,0.1);
    object oItem = GetNextItemInInventory(oPC);
}

}

}/* suspect block end found !*/



Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 22/03/2006 11:04:49 Sujet du message :

Arf je suis trop bete !

vire le object dans la boucle.... Very Happy (mais c'est bizare qu'il compile le script ^^)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PsyCalimero
Ecuyer
Inscrit le: 17 Jan 2006
Messages: 44
Répondre en citant
Posté le : 22/03/2006 11:17:12 Sujet du message :

Oui c'était bien ca Very Happy merci beaucoup pour ta précieuse aide Sith, ca fera des tricheurs en moins sur le module
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 57.728ms