La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 17/05/2024 06:36:56


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 05/04/2006 18:09:19 Sujet du message : [système] Vidage de zone / eboueur

Je me suis décidé à faire mon propre système de vidange, apparement il marche, simplement je me rend pas bien compte s'il est mieux ou moins bien que les autres.
Il est basé sur des créatures "éboueurs" qui tournent dans les zones.
Le principe :
- a la sortie d'une zone (joueur) j'enregistre la zone sur la créature, dans une liste.
- sur le heartbeat de la créature :
*si il y a des joueurs dans la zone, ou si elle est seule mais qu'il n'y a rien a nettoyer elle va dans la suivante dans sa liste
*sinon, elle attend (10 heartbeat ~ 1 minute, modifiable) puis elle commence le nettoyage. Pour éviter le lag, elle en fait pas beaucoup à chaque HB (présentement elle vide 5 loot, ou détruit 5 items ou tue 5 créatures de rencontres)
*Une fois qu'il n'y a plus rien a nettoyer, elle saute dans la zone suivante dans sa liste.

J'ai prévu une liste de 30 zones max (modifiable) après quoi ça appelle une autre créature en renfort. Comme ça chaque bête a sa liste de zone et elles ne devraient pas etres débordées, ni se croiser.


Les scripts :

OnExit de chaque zone
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
////////////////////////////// ///////
///sv_area_onexit                ///
///                              ///
/// sur le OnExit des zones      ///
/// la premire sortie d'un PJ    ///
/// ajoute la zone a la liste    ///
/// de l'eboueur                  ///
///                              ///
/// By Sith Vicious              ///
/// 05/04/2006                    ///
////////////////////////////// ///////

void main()
{
    object oExit = GetExitingObject();
    if (!GetIsPC(oExit)) return;
    if (!GetLocalInt(OBJECT_SELF,"NETTOYAGE_OK"))
    {
        object oMod = GetModule();
        object oEboueur = GetLocalObject(oMod,"EBOUEUR");
        object oTemp = GetFirstObjectInArea(OBJECT_SELF);
        location lLoc = GetLocation(oTemp);
        if (!GetIsObjectValid(oTemp))
        {
            lLoc = Location(OBJECT_SELF,Vector(10.0,10.0,0.0),0.0);
        }
        if (oEboueur == OBJECT_INVALID)
        {
            oEboueur = CreateObject(OBJECT_TYPE_CREATURE,"sv_crea_eboueur",lLoc,FALSE,"SV_EBOUEUR_1");
        }
        SetLocalLocation(oEboueur,"TEMP_LOCATION",lLoc);
        SignalEvent(oEboueur,EventUserDefined(16258));
        SetLocalInt(OBJECT_SELF,"NETTOYAGE_OK",TRUE);
    }
}
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.


(c'est possible de rajouter ça dans le OnEnter si vous avez pas de OnExit générique, juste changer la définition de oExit)

Ajouter une créature dans la palette (resref "sv_crea_eboueur" ou changer la ref dans les scripts)
Mettre comme scripts (et ceux la uniquement, vider les autres) :

OnUserDefined
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
////////////////////////////// ///////
/// sv_oud_eboueur                ///
///                              ///
/// sur le OnUserDefinedEvent    ///
/// de l'eboueur                  ///
/// ajoute une zone a sa liste    ///
/// recree un autre eboueur si    ///
/// sa liste est pleine          ///
///                              ///
/// By Sith Vicious              ///
/// 05/04/2006                    ///
////////////////////////////// ///////

const int NB_MAX_ZONES_A_NETTOYER = 30;

void main()
{
    int nEvent = GetUserDefinedEventNumber();
    if (nEvent == 16258)
    {
        int nCount = GetLocalInt(OBJECT_SELF,"NB_LOCATIONS");
        if (!nCount) SetLocalInt(OBJECT_SELF,"MA_ZONE_EN_COURS",1); //1ere zone
        location lLoc = GetLocalLocation(OBJECT_SELF,"TEMP_LOCATION");
        SetLocalLocation(OBJECT_SELF,"NETTOYAGE_"+IntToString(++nCount),lLoc);
        DeleteLocalLocation(OBJECT_SELF,"TEMP_LOCATION");
        SetLocalInt(OBJECT_SELF,"NB_LOCATIONS",nCount);
        if (nCount >= NB_MAX_ZONES_A_NETTOYER)
        {
            string sNumero = IntToString( StringToInt( GetStringRight( GetTag(OBJECT_SELF),1 ) )+1);
            CreateObject(OBJECT_TYPE_CREATURE,"sv_crea_eboueur",lLoc,FALSE,"SV_EBOUEUR_"+sNumero);
        }
    }
}
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.


OnSpawn
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
////////////////////////////// ///////
///sv_osp_eboueur                ///
///                              ///
/// sur le OnSpawn de l'eboueur  ///
/// le rend invisible et          ///
/// l'enregistre sur le module    ///
///                              ///
/// By Sith Vicious              ///
/// 05/04/2006                    ///
////////////////////////////// ///////

void main()
{
    effect eInvis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eInvis,OBJECT_SELF);
    SetLocalObject(GetModule(),"EBOUEUR",OBJECT_SELF);
    SetPlotFlag(OBJECT_SELF,TRUE);
    SetImmortal(OBJECT_SELF,TRUE);
}
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.


OnHeartBeat
Ce message est un spoiler, et risque de vous informer de choses que vous auriez dû apprendre par vous même (fin d'un jeu, film, etc). À vos risques et périls (ludiques), vous pouvez le voir en cliquant sur cet avertissement.
Spoiler :
NWScript :
////////////////////////////// ///////
/// sv_ohb_eboueur                ///
///                              ///
/// sur le OnHeartBeat            ///
/// de l'eboueur                  ///
/// change de zone si il y a des  ///
/// joueurs ou rien a nettoyer    ///
/// sinon attend 1 minute puis    ///
/// nettoie progressivement      ///
///                              ///
/// By Sith Vicious              ///
/// 05/04/2006                    ///
////////////////////////////// ///////

void main()
{
    int nCount = GetLocalInt(OBJECT_SELF,"NB_LOCATIONS");
    if (!nCount) return;
    int nCurrent = GetLocalInt(OBJECT_SELF,"MA_ZONE_EN_COURS");
    if (GetAILevel() != AI_LEVEL_VERY_LOW)//y a du monde dans la zone, on se barre
    {
        DeleteLocalInt(OBJECT_SELF,"MES_BATTEMENTS"); //remet les battements  0
        if (nCount==1) return; //nulle part ou aller
        nCurrent = (nCurrent == nCount) ? 1 : nCurrent+1;
        SetLocalInt(OBJECT_SELF,"MA_ZONE_EN_COURS",nCurrent);
        location lCible = GetLocalLocation(OBJECT_SELF,"NETTOYAGE_"+IntToString(nCurrent));
        JumpToLocation(lCible);
        return;
    }
    //la zone est vide
    int nHB = GetLocalInt(OBJECT_SELF,"MES_BATTEMENTS");
    if (!nHB) //on vient d'arriver, on verifie qu'il y ait quelque chose  nettoyer, sinon ca sert a rien d'attendre
    {
        if (!GetIsObjectValid(GetNearestObjectByTag("BodyBag"))
            && ! GetIsObjectValid(GetNearestObject(OBJECT_TYPE_ITEM))
            && ! GetIsObjectValid(GetNearestObject(OBJECT_TYPE_CREATURE)) )
        {
            //DeleteLocalInt(OBJECT_SELF,& quot;MES_BATTEMENTS"); //remet les battements  0
            if (nCount==1) return; //nulle part ou aller
            nCurrent = (nCurrent == nCount) ? 1 : nCurrent+1;
            SetLocalInt(OBJECT_SELF,"MA_ZONE_EN_COURS",nCurrent);
            location lCible = GetLocalLocation(OBJECT_SELF,"NETTOYAGE_"+IntToString(nCurrent));
            JumpToLocation(lCible);
            return;
        }
    }
    //On attend
    SetLocalInt(OBJECT_SELF,"MES_BATTEMENTS",++nHB);
    if (nHB >= 10) //en gros une minute qu'on est la, personne en vue, on nettoie
    {
        object oBodyBag = GetNearestObjectByTag("BodyBag"); //vidage des sacs de loot
        object oTemp;
        int i,j = 1;
        while (GetIsObjectValid(oBodyBag) && j<6)
        {
            oTemp = GetFirstItemInInventory(oBodyBag);
            while (oTemp != OBJECT_INVALID)
            {
                DestroyObject(oTemp,0.5*j);
                oTemp = GetNextItemInInventory(oBodyBag);
            }
            oBodyBag = GetNearestObjectByTag("BodyBag",OBJECT_SELF,++j);
        }
        if (j > 5) return;
        object oItem = GetNearestObject(OBJECT_TYPE_ITEM); //destruction des items au sol
        while (GetIsObjectValid(oItem) && j<6)
        {
            DestroyObject(oItem);
            oItem = GetNearestObject(OBJECT_TYPE_ITEM,OBJECT_SELF,++i);
            j++;
        }
        if (j > 5) return;
        oItem = GetNearestObject(OBJECT_TYPE_CREATURE);
        i = 1;
        while (GetIsObjectValid(oItem) && j<6)
        {
            if (GetIsEncounterCreature(oItem)) DestroyObject(oItem);
            oItem = GetNearestObject(OBJECT_TYPE_CREATURE,OBJECT_SELF,++i);
            j++;
        }
        if (j==1) // plus rien dans la zone ==&gt; hop on change
        {
            DeleteLocalInt(OBJECT_SELF,"MES_BATTEMENTS"); //remet les battements  0
            if (nCount==1) return; //nulle part ou aller
            nCurrent = (nCurrent == nCount) ? 1 : nCurrent+1;
            SetLocalInt(OBJECT_SELF,"MA_ZONE_EN_COURS",nCurrent);
            location lCible = GetLocalLocation(OBJECT_SELF,"NETTOYAGE_"+IntToString(nCurrent));
            JumpToLocation(lCible);
            return;
        }
    }
}
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.



Donc voila, je l'ai essayé il marche, mais j'ai pas de gros module avec plein des joueurs à disposition, donc si ça interesse quelqu'un d'essayer ce système (qui a l'avantage de pas être trop compliqué à mettre en place) j'aimerai savoir si il est valable en conitions réelles et s'il bouffe pas trop en ressources.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 06/04/2006 09:38:05 Sujet du message :

Mon commentaire : très intéressant
les améliorations à faire
- ton code sur le OnExit, mémorise plutôt l'emplacement de l'éboueur en objet local sur le module lui-même, tu économiseras une boucle sur tous les objets de la zone
- désactive le OnPerception de l'éboueur et met une faction neutre envers tout le monde, sinon en 6-10 secondes entre deux HB, il peut lui prendre l'envie d'aller attaquer des monstres.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 06/04/2006 11:00:06 Sujet du message :

Je fais ça pour toi Sith, car tu m'a beaucoup aidé. C'est loin d'être le même système mais tu en fais ce que tu veux.


Dans les événements de la zone:



OnEnter:

NWScript :
//:Confused///////////////////////// /////////////////////
//:: Generic PC Tracker- Onenter Script
//:: Copyright (c) 2004 Basalope Production Agency
//:Confused///////////////////////// ////////////////////
/*
  Place this script in the Onenter event under
  Area Properties.  Place the Onexit script in
  the area's Onexit event under Area Properties.
  Then place the userdefined script in the
  OnUserdefined event.  Once that is done, the
  area will be cleaned whenever the last PC leaves
  the area.
*/

//:Confused///////////////////////// ////////////////////
//:: Created By:  Besalope
//:: Created On:  4/18/04
//:Confused///////////////////////// ////////////////////
void main()
{
if(GetIsPC(GetEnteringObject()) == TRUE)
  {
  if(GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 0)
  {
  SignalEvent(OBJECT_SELF,EventUserDefined(3002)); //added v1.30
  SetLocalInt(OBJECT_SELF,"PCs_In_Area",1);
  SetLocalString(OBJECT_SELF,"PC Tracker Ran","False"); //added boolean logic check so that the tracker will only be triggered once per cycle of PCs in the area v1.28
  DelayCommand(45.0f,SignalEvent(OBJECT_SELF,EventUserDefined(3001)));
  DelayCommand(45.0f,SignalEvent(OBJECT_SELF,EventUserDefined(2998))); //added v1.28 - Not sure why this wasn't in earlier.. fires the skybox checker
  }
  else
  {
  int nOld = GetLocalInt(OBJECT_SELF,"PCs_In_Area");
  int nNew = (nOld + 1);

  SetLocalInt(OBJECT_SELF,"PCs_In_Area",nNew);
  }
  }
}
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.




Dans le onExit:

NWScript :
//:Confused///////////////////////// /////////////////////
//::  Generic Onexit Script
//::  Copyright (c) 2004 Basalope Production Agency
//:Confused///////////////////////// ////////////////////
/*
    Place this script in the area onexit event.
*/

//:Confused///////////////////////// ////////////////////
//:: Created By:  Besalope
//:: Created On:  4/18/04
//:: Modified par AZAZEL le 20 mars 2006
//:Confused///////////////////////// ////////////////////

void main()
{
  if(GetIsPC(GetExitingObject()) == TRUE)
  {
  if(GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 1)
  {
    DelayCommand(2.0f,SignalEvent(OBJECT_SELF,EventUserDefined(3000))); //changed delay to 60 seconds instead of 30
    DelayCommand(1.9f,SetLocalInt(OBJECT_SELF,"PCs_In_Area",0)); //added a delay due to extra NPCs spawning
  }
  else
  {
    int nOld = GetLocalInt(OBJECT_SELF,"PCs_In_Area");
    int nNew = (nOld - 1);

    SetLocalInt(OBJECT_SELF,"PCs_In_Area",nNew);
  }
  }
}
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.




Et dans le OnUserdefined: (((PARTIE 1)))


NWScript :
//:Confused///////////////////////// /////////////////////
//:: Area Onuserdefined
//:Confused///////////////////////// ////////////////////
/*
    Place this script in the area userdefined event

    case 2998: sets skybox depending on weather
              (only while PCs are in the area)

    case 2999: checks how many PCs are in the
              area. (when a PC enters and every 5
              minutes there after, unless the area
              is empty)

    case 3000: wipes the area clean of items,
              creatures, drops, and resets the
              encounters.  (60 seconds after the
              last player leaves the area or when
              case 2999 finds 0 PCs in the area)

    case 3001: Boolean Logic used with 2999

    case 3002: Generic NPC Spawner
                **See below for setup details**

*/

//:Confused///////////////////////// ////////////////////
//:: Created By:  Besalope
//:: Created On:  12/19/04
//:Confused///////////////////////// ////////////////////

void main()
{
    int nUser=GetUserDefinedEventNumber();
    switch(nUser)
        {
        case 2998: //This checks the weather type of the area every thirty seconds (but only when players are in the area) and sets the according skybox.
          {
            if(GetLocalInt(OBJECT_SELF,"PCs_In_Area")>= 1) //this sets the area to only check the weather if there is a player in the area
            {
              int nWeather = GetWeather(OBJECT_SELF);

              switch(nWeather)
              {
                case WEATHER_CLEAR:
                {
                SetSkyBox(SKYBOX_GRASS_CLEAR);
                break;
                }
                case WEATHER_RAIN:
                {
                SetSkyBox(SKYBOX_GRASS_STORM);
                break;
                }
                case WEATHER_SNOW:
                {
                SetSkyBox(SKYBOX_ICY);
                break;
                }
              }
              DelayCommand(180.0f,SignalEvent(OBJECT_SELF,EventUserDefined(2998))); //the delay command sets how often the area is checked while a player is in the area.
            }
            break;
          }

        case 2999: //case 2999 was added to ensure that the number of PCs in the area is as accurate as possible
          {
            SetLocalInt(OBJECT_SELF,"PCs_Found",0);
            object oPC = GetFirstObjectInArea();
            while(GetIsObjectValid(oPC))
                {
                if(GetIsPC(oPC) == TRUE) //removed DM check v1.28
                  {
                  SetLocalInt(OBJECT_SELF,"PCs_Found",GetLocalInt(OBJECT_SELF,"PCs_Found")+1);
                  }
                oPC = GetNextObjectInArea();
                }
            if(GetLocalInt(OBJECT_SELF,"PCs_Found") != GetLocalInt(OBJECT_SELF,"PCs_In_Area"))
            {
            SetLocalInt(OBJECT_SELF,"PCs_In_Area",GetLocalInt(OBJECT_SELF,"PCs_Found"));
            }
            if(GetLocalInt(OBJECT_SELF,"PCs_Found") == 0)
            {
            SignalEvent(OBJECT_SELF,EventUserDefined(3000));
            SetLocalString(OBJECT_SELF,"PC Tracker Ran","False");
            }
            else
            {
            DelayCommand(300.0f,SignalEvent(OBJECT_SELF,EventUserDefined(2999)));
            }
            break;
            }




        case 3000:
            {
            object oArea = GetArea(OBJECT_SELF);
            object oChk = GetFirstObjectInArea(oArea);
            while(GetIsObjectValid(oChk) && (GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 0))
                {
                int nChk = GetObjectType(oChk);

                switch(nChk)
                {
                case OBJECT_TYPE_CREATURE:
                    {
                    SetImmortal(oChk,FALSE);
                    SetPlotFlag(oChk,FALSE);
                    DelayCommand(0.1f,DestroyObject(oChk));
                    break;
                    }
///////////////////////////&nb sp;                   ////////////////////////////// ///////
                //* case OBJECT_TYPE_ITEM:
                  // {
                  // SetImmortal(oChk,FALSE);
                  // SetPlotFlag(oChk,FALSE);
                  // DelayCommand(0.1f,DestroyObjec t(oChk));
                  // break;
                  // }
                // case OBJECT_TYPE_PLACEABLE:
                //  {
                  //  if(GetStringLowerCase(GetName( oChk)) == "remains")
                  //  {
                  //  object oItem = GetFirstItemInInventory(oChk);
                  //  while(GetIsObjectValid(oItem))
                  //      {
                  //      DestroyObject(oItem);
                  //      oItem = GetNextItemInInventory(oChk);
                  //      }
                  //  AssignCommand(oChk,SetIsDestro yable(TRUE));
                  //  DestroyObject(oChk);
                    // }
                  // break;
                  // }

////////////////////////////// ////////////////////////////// ///////////////////
/* warning: 5 unclosed block {} */
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.







*******************************************************************************************




(((PARTIE2)))


NWScript :
}/* suspect block end found !*/

                oChk = GetNextObjectInArea(oArea);
                }/* suspect block end found !*/

            object oObject = GetFirstObjectInArea(GetArea(OBJECT_SELF));
            while(GetIsObjectValid(oObject) && (GetLocalInt(OBJECT_SELF,"PCs_In_Area") == 0))
                {
                if (GetObjectType(oObject) == OBJECT_TYPE_ENCOUNTER)
                {
                SetEncounterActive(TRUE, oObject);
                }
                oObject=GetNextObjectInArea();
                }
            break;
            }/* suspect block end found !*/


        case 3001: //added v1.28 Boolean logic check
            {
            if(GetLocalString(OBJECT_SELF,"PC Tracker Ran") == "False") // Part of the boolean logic check v1.28 - This is the part that makes sure it hasn't already been triggered
            {
            SetLocalString(OBJECT_SELF,"PC Tracker Ran","True"); // Part of the boolean logic check v1.28 - Indicates that the tracker has been activated
            SignalEvent(OBJECT_SELF,EventUserDefined(2999));
            }
            else
            {
            return;
            }
            break;
            }

        case 3002: //added v1.30 Generic NPC Spawner
            /*
            Generic NPC Spawner Configuration
            1. Create a Waypoint at Spawn Location
            2. Define the creature to spawn by naming the Waypoint: SPWN_[resref of creature you want to spawn]  i.e. SPWN_waterdhavianguar
            3. Next, define the type of NPC types include [Waypoint Walkers, Posted, Sitting, and Merchant]
              To define the type one of the following to the start of the Waypoint's Tag: WP_  POST_  SIT_  MER_  NIGHT_  DAY_  NORM_
            4. Now you define the NPC's Tag (add whatever you want after the definer from step 3) - TAG MUST BE UNIQUE!          i.e. POST_waterdhavianguard1
            4a. If you want a Waypoint walker, add _01 to the end of the tag    i.e. WP_waterdhavianwatcher1_01
            */

            {
            object oSP = GetFirstObjectInArea();
            string nOSPTag = "";
            while(GetIsObjectValid(oSP))
                {
                if(GetTag(oSP) == nOSPTag)
                {
                oSP = GetNextObjectInArea();
                }
                else
                {
                if((GetObjectType(oSP) == OBJECT_TYPE_WAYPOINT) || (GetObjectType(oSP) == OBJECT_TYPE_STORE))
                  {
                  if(GetStringUpperCase(GetStringLeft(GetName(oSP),5)) == "SPWN_")
                  {
                  string nresref = GetStringRight(GetName(oSP),GetStringLength(GetName(oSP))-5);



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),3)) == "WP_") //Spawner for Waypoint Walkers
                  {
                  string sSPTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-3);
                  string sNPCTag = GetStringLeft(sSPTag,GetStringLength(sSPTag)-3);
                  CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),5)) == "POST_") //Spawner for posted NPCS
                  {
                  string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-5);
                  CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "SIT_") //Spawner for sitting NPCS
                  {
                  string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4);
                  CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                  DelayCommand(0.5f,AssignCommand(GetObjectByTag(sNPCTag),ActionSit(GetNearestObjectByTag("Chair"))));
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "MER_") //Spawner for Merchant NPCS
                  {
                  string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4);
                  CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                  if(GetStoreGold(oSP) <= 1000)
                    {
                    SetStoreGold(oSP,100000);
                    }
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),6)) == "NIGHT_") //Spawner for Night-Only NPCs
                  {
                  if((GetTimeHour() >= 18) || (GetTimeHour() <= 6)) //change times as per your module
                    {
                    string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-6);
                    CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                    }
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),4)) == "DAY_") //Spawner for Day-Only NPCs
                  {
                  if((GetTimeHour() <= 18) && (GetTimeHour() >= 6)) //change times as per your module
                    {
                    string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-4);
                    CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                    }
                  }



                  if(GetStringUpperCase(GetStringLeft(GetTag(oSP),5)) == "NORM_") //Spawner for Normal NPCs that do not need any special treatment
                  {
                    string sNPCTag = GetStringRight(GetTag(oSP),GetStringLength(GetTag(oSP))-5);
                    CreateObject(OBJECT_TYPE_CREATURE,GetStringRight(GetStringLowerCase(GetName(oSP)),GetStringLength(GetName(oSP))-5),GetLocation(oSP),FALSE,sNPCTag);
                  }



                  }
                  }
                nOSPTag = GetTag(oSP);
                oSP = GetNextObjectInArea();
                }

                }
            break;
            }

        break;
        }/* 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.

_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
Dernière édition par AZAZEL11 le 20/04/2006 16:46:44; édité 7 fois
 
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 : 06/04/2006 11:42:21 Sujet du message :

>Lylver : J'ai pas compris ta remarque sur le OnExit. Je fais pas de boucle, je prends juste le premier objet pour tenter d'avoir une position accessible pour le nettoyeur, histoire que le moteur n'ait pas à recalculer une position valide quand il arrive dans la zone. Si il n'y a pas d'objet je le jette un peu au hasard, de toute façon c'est pas si grave, l'important c'est juste qu'il soit dans la zone. Enfin je t'ai peut-être mal compris.

-Pour le OnPerception : ben il en a pas, l'éboueur a juste les 3 scripts de mon post, les autres il en a pas besoin, et effectivement ça lui ferait faire que des bétises. Par contre effectivement, le mettre amical envers tout le monde c'est une bonne idée, ça évitera le cas de ces stupides attaques d'opportunités (que même un monstre sans scripts lance à tout bout de champ, ça m'énerve). Ou lui coller un effet "sanctuaire" en plus au spawn pourquoi pas.

>Azazel : ben justement, le principe c'était de changer la logique des systèmes comme celui là. Surtout d'éviter le comptage des PJ, et d'éviter de faire plein d'opérations inutiles sur les objets des zones. Avec un système comme celui que tu présente, déjà il y a le risque d'erreurs en comptage des joueurs (ie dans ton OnExit, tu attends 2 secondes avant de passer la variable des joueurs à 0, si un ou plusieurs joueurs entrent pendant ce temps, ils ne seront pas pris en compte). Et à chaque fois qu'une zone va se trouver vide, tu boucle sur tous ses objets, qui sont la plupart du temps pas visés par le nettoyage (des triggers, des WP, des meubles pour la deco etc.).
J'ai tenté d'innover en me servant du comptage automatique des PJ en fonction native Bioware via l'IA des monstres, et limiter au maximum les boucles inutiles. Considérant qu'il vallait mieux que le nettoyage aille lentement mais surement, plutot que d'avoir des opérations dans tous les sens. Et d'avoir du lag si par exemple un joueur a vider 300 objets inutiles au sol.

Je suis pas convaincu que mon système soit vraiment plus léger, ça demande à être vérifié et surement amélioré, mais je crois quand même qu'il peut apporter une nouvelle façon d'envisager ces systèmes de nettoyage.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 06/04/2006 16:55:29 Sujet du message :

ok d'ak. Mais pour les objets je les ai mis actifs seulement ici car je les ai désactivés sur mon module (seules les créatures sont visées). Avec ce trio de script, tous les pnjs du module, tous sans exception sont en spawn (via WP). Alors pour les intéressés d'économie de ressources, voilà une solution.
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
zogzog59
Grand Chevalier
Inscrit le: 16 Jan 2005
Messages: 123
Répondre en citant
Posté le : 08/04/2006 12:49:36 Sujet du message :

zog zog ....

salut azazel11, j'ai une question a propos de ton set de script ?!

tu dis que ce set de script permet d'économiser des ressources déja c'est un bon point ca ^^ !

tu dis ensuite, que les pnj spawn via un WP ? Donc il faut assigner un wp à chaques pnj créés sur la zone utilisant se set de script ??
_________________
Les vaux module rp
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 18/04/2006 01:02:11 Sujet du message :

c'est exactement ça.

1-tu places les 3 scripts dans les événements de la zone
2-tu places un WayPoint sur la map
3-tu le nomme (sans fautes) avec (SPWN_)au début et avec le resref de la créature (blueprint) ex: SPWN_creature001
4-Donner le tag de ce meme waypoint commencant soit par (SIT_)pour que le pnj s'assoit sur la chaise la plus proche, (WP_) pour le faire marcher mais il faut PLUSIEURS WP attention aux tags ici!!!, (POST_) pour que le pnj aille un *poste de garde* , (NIGHT_)/(DAY_) pour que le pnj spawn le jour ou la nuit, (MER_) pour les marchands et (NORM_) pour *normal* , et a la fin tu fini le tag afin qu'il soit UNIQUE!!! ex: SIT_clown01


donc il faut nommer le WP et lui donner un tag pour que le script s'exécute
(le script cherche des waypoints nommés (et non le tag)commencant par SPWN_ , le tag sert a définir la fonction que fera le pnj, le nom du WP sert juste à le faire spawner.

Bref, si tu as des questions dis moi le!Very Happy
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 20/04/2006 10:04:47 Sujet du message :

Bonjour a toutes et a tous, voila j'ai un petit souci le Scripts "Area Onuserdefined" de AZAZEL11 me marque une erreur est t'il possible de m'aider ? ligne 233

d'avance merci bien a vous.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 20/04/2006 16:45:49 Sujet du message :

Problème résolu, J'ai édité le OnUserDefined et j'ai placé ce script en deux sections. Suffit de copier/coller en joignant les 2 bouts. J'ai pas trop compris pourquoi qu'en un morceau ça ne faisait pas mais bon,
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 20/04/2006 18:08:45 Sujet du message :

Je te remerci bien pour ta reponce si rapide je test et je te dit.Razz

:(bon voila, plus d'erreur et apres essais les monstres et leur drop disparaise bien mais les drops dejat au sol reste et si tu pose une item au sol elle ne disparais pas non plus, suis bien triste *sniff* et comme je ne sais pas trop faire les scripts je suis obliger de m'en remettre a vous.

d'avance merci pour votre aide.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 21/04/2006 00:31:58 Sujet du message :

c'est voulu, je l'ai moi meme désactiver. Il suffit juste d'enlever les // à chaque ligne concernant les OBJECTS a case 3000 (remettre actif la fonction des objets)


relis le script, tu verras ou il y a toute une section (en vert) , suffit d'effacer les //, c'était encore plus économique a mon sens de désactiver cette section car il y très peu d'objet trainant sur le sol...alos le script fait une boucle pour rien, mais si tu y tiens, tu sais maintenant quoi faire pour réactiver cette section.^^ Au pire si tu veux, j'ai un script de poubelle magique, (efface tout item à la fermeture d'un tonneau exemple)


vala
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
P.Patoche
Chevalier
Inscrit le: 14 Avr 2006
Messages: 70
Localisation: France 77
Répondre en citant
Posté le : 21/04/2006 09:47:55 Sujet du message :

Bon ok et un grand merci a toi pour ton aide et ton temp passer pour m'aider, sa marche tres bien, et je veus bien ton system de poubelle stp *deprime vue la qualité des scripts,et se dit qu'il est incapable d'en faire des comme ca*.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 21/04/2006 16:10:22 Sujet du message :

En réponse à la question de Sith plus : effectivement il n'y a pas de boucles, j'ai mal vu.
----
J'ai refait complétement l'éboueur du TNB2 (un peu moins de 400 zones)
il marche au poil maintenant.
Vous le trouverez là-bas (version éludée des scripts pour garder l'essentiel):
http://nwvault.ign.com/View.php?view=scripts.Detail&id=2998

Je n'utilise pas de créatures comme le fait Sith Vicious. Le principe est de déclencher une surveillance de la zone via les évênements OnEnterArea et OnExitArea.

J'ai rencontré un bug sur le OnExitArea lorsqu'il s'agit d'une déconnexion de PJs et c'est pour cela que je ne suis pas revenu sur ce post plus tôt.

Donc maintenant le coeur du système se trouve sur le heart-beat du module. J'ai longtemps hésité mais les tests de consommation CPU sont bons et j'ai économisé plusieurs fonctions que j'avais dispersées sur plusieurs scripts en une seule gestion des zones actives.

Le côté "optimal" de la chose c'est que cette liste des zones est maintenant à géométrie variable :
- elle ne comprend que ce qu'il y a besoin de gérer
- on peut débogger son évolution en mode console grâce à "## dm_dumpmodulelocals"
- elle se compacte automatiquement lorsqu'un zone est vide de joueurs (en même temps que le passage du nettoyeur !)
- j'ai trouvé un système assez futé pour éviter le risque de "too many instructions" : on envoie un signal personnalisé (SignalEvent comme dans le système custom au-dessus). Le nettoyeur n'a donc aucun risque de se bloquer et cela réparti la charge CPU .. tout simplement en faisant confiance au moteur temps réel de nwn : il se débrouille pour gérer les priorités des "SignalEvent" tout en conservant l'ordre dans lequel ils ont été envoyés (je n'étais pas sûr de ce fait mais les examens des logs me satisfont)

Le système combine le nettoyeur et la fonction de centralisation des heart-beats de zones.
De façon annexe vous trouverez aussi un système de Spawn Statique déja connu mais à ma sauce pour intégrer le nettoyage des créatures.

Je vous mets à la suite le coeur du système : le script de heart-beat voyez en téléchargement pour le reste. (J'ai anglicisé pour avoir un retour de nos américains favoris : large public)
NWScript :

//:: //
//:: Updated 2006-04-12 Lylver
//:: complete rebuild of GC &amp; Zone hooking : merge
//:: Zone passivated remains in list for some HB
//:: ly_onexit_loop no more needed
//:: Event 2001 -&gt; 2199 for GC
//:: Event 1001 -&gt; 1199 for zone ExecuteScript
//:: //////////////////
//:: Lylver 2005-04-12
//:: tn_mod_hb.nss
//:: module Heart-Beat
//:: Optimizing by hooking fonction
//:: and passivation
//:: //////////////////
#include "ly_lib_area"

void CompactHole(int m, int j);
void PassivateArea(int m, int j);
void DoAreaScript(int m, int j);
int UnchainPassive(int m, int j);

void main()
{
  object oMod = GetModule();
  object oArea ;
  int nBZone = GetLocalInt(oMod,"N_FHB_AREA");
  string sMesg;
  int n;
  int i = 0; // compteur de trou
  //
  // General loop over all area hooked
  //
  for( n=1 ; n <= nBZone ; n++ ){
      oArea = GetLocalObject(oMod,"FHB_AREA"+IntToString(n));
      if( GetLocalInt(oMod,"FHB_ACTIF"+IntToString(n)) ){ // fast check, one call + test
       
        if( NbPlayerorDMInArea(oArea) == 0 ){
            PassivateArea(n, i);
        } else {
            DoAreaScript(n, i);
        }
       
        if( i != 0 ){
            CompactHole(n, i);
        }
        //
      } else {
        // le prochain n m'ecrase ou alors je suis elude
        if( UnchainPassive(n, i) == 1 ){
            i++;
        } else {
        // je reste passif et je decompte mon nb de HB + compacter
       
        if( i != 0 ){
            CompactHole(n, i);
        }
        //
        }
      }
  } // for : next hooked area check
  if( i != 0 ){
     
      SetLocalInt(oMod,"N_FHB_AREA",nBZone - i) ;
      sMesg = "Hooked Zone Count : "+IntToString(nBZone - i);
      WriteTimestampedLogEntry(sMesg);
      // SendMessageToAllDMs(sMesg);
  }
}

void CompactHole(int m, int j)
{
  object oMod = GetModule();
  object oArea = GetLocalObject(oMod,"FHB_AREA"+IntToString(m)) ;
 
  // si il y a eu un ou plusieurs trous : compactage obligatoire
 
  SetLocalObject(oMod,"FHB_AREA"+IntToString(m-j),oArea);
  if( GetLocalInt(oMod,"FHB_ACTIF"+IntToString(m)) ){
      SetLocalInt(oMod,"FHB_ACTIF"+IntToString(m-j),TRUE);
     
      // pas de changement FHB_ACTIF sur la zone
  } else {
      DeleteLocalInt(oMod,"FHB_ACTIF"+IntToString(m-j)) ;
  }
  DeleteLocalInt(oMod,"FHB_ACTIF"+IntToString(m)) ;
  SetLocalInt(oArea,"FHB_LIDX",m-j); // Cross-Ref
  DeleteLocalObject(oMod,"FHB_AREA"+IntToString(m)) ; // efface mon doublon
}

void PassivateArea(int m, int j)
{
  object oMod = GetModule();
  object oArea = GetLocalObject(oMod,"FHB_AREA"+IntToString(m)) ;
  DeleteLocalInt(oMod,"FHB_ACTIF"+IntToString(m)) ; // passivation (bof bof ptet pas utile
 
  DeleteLocalInt(oArea,"FHB_ACTIF") ; // passivation : fast tag
 
 
  string sMesg = "Hooked Zone : "+GetTag(oArea)+"-"+GetName(oArea)+" passivated";
  // SendMessageToAllDMs(sMesg);
  WriteTimestampedLogEntry(sMesg);
  // raz variable de statut
  DeleteLocalInt(oArea,"PC_HERE") ;
}

void DoAreaScript(int m, int j)
{
  object oMod = GetModule();
  object oArea = GetLocalObject(oMod,"FHB_AREA"+IntToString(m)) ;
 
  SetLocalInt(oMod,"FHB_ACTIF"+IntToString(m),TRUE);
  SetLocalInt(oArea,"FHB_COUNT",20); // 20 heart-beats ~ 120s -&gt; 200s
  string sScript = GetLocalString(oArea,"FHB_SCRIPT");
  if( sScript != "" ){
      SetLocalObject(oMod,"AREA_FOR_SC"+IntToString(m),oArea);
      // Signal Event is better
      SignalEvent(oMod,EventUserDefined(1000+m));
  }
}

int UnchainPassive(int m, int j)
{
  object oMod = GetModule();
  object oArea = GetLocalObject(oMod,"FHB_AREA"+IntToString(m)) ;
  // gestion compactage liste
 
  // et envoyer le GC dans la zone
  int k=0;
  int nHB = GetLocalInt(oArea,"FHB_COUNT") - 1;
  if( nHB > 0 ){
      SetLocalInt(oArea,"FHB_COUNT",nHB); // attends avant de purger
  } else {
      // Unchain from the list := delete reference + increment hole count
      DeleteLocalObject(oMod,"FHB_AREA"+IntToString(m));
      DeleteLocalInt(oArea,"FHB_LIDX"); // Cross-Ref
      k=1 ;
      // mieux avec signal event, reloop GC
      SetLocalObject(oMod,"AREA_FOR_SC"+IntToString(m),oArea);
      SignalEvent(oMod,EventUserDefined(2000+m));
  }
  return k;
}
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.


Un petit effet de bord qui m'a donné des sueurs froides : au démarrage du module toutes les zones ou des PNJs sont posés viennent "s'arrimer" (hook) dans la liste.
Je vous précise que j'en profite pour repasser toutes ces zones en spawn statique
Enfin bref, sueurs froides donc : 97 zones hookées au démarrage...
mais quasiment rien en temps CPU pour la gestion et retour à 0 zones hookées au bout de 2 minutes : mission accomplie !
Je pense que le système peut gérer des modules à plus de 100 joueurs présents (Laughing: en les mettant 1 par zone)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 21/04/2006 18:14:08 Sujet du message :

POUBELLEvoila le script a mettre dans le OnUsed d'un contenant (barrique, caisse, etc...)


NWScript :
void main()
{
object oItem;
oItem = GetFirstItemInInventory(OBJECT_SELF);
    while(GetIsObjectValid(oItem))
    {
    SetPlotFlag(oItem,FALSE);
    SetIsDestroyable(TRUE,FALSE,FALSE);
    DestroyObject(oItem,0.0);
    oItem = GetNextItemInInventory(OBJECT_SELF);
    }
}
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.

_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
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 : 21/04/2006 18:44:40 Sujet du message :

Le SetIsDestroyable sert à rien, c'est uniquement pour les créatures pour que leur corps disparaisse pas.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 21/04/2006 19:30:03 Sujet du message :

sur notre module on a un système de cadavre, on peut emporter un corps via un item, le corps se place dans l'inventaire du pj transportant le pj mort...

Tu te rend compte? lol j'imagine la scène du pj jettant le corps d'un autre a la poubelle...
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 25/04/2006 11:49:10 Sujet du message :

Une qui fait joli (animation)
NWScript :

// OnOpen de la poubelle
// by Lylver 2004-06-19
// inspire par d'autres
void main() {
  effect eFumee = EffectVisualEffect(VFX_DUR_PIXIEDUST);
  ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eFumee,OBJECT_SELF,3.0f)) ;
}
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.


NWScript :

// OnClose de la poubelle
// by Lylver 2004-06-19
// inspire par d'autres
void main() {
  object oCoffre = OBJECT_SELF ;
// Vide les objets dans oCoffre
  object oItem = GetFirstItemInInventory(oCoffre);
  while (oItem != OBJECT_INVALID) {
      DestroyObject(oItem);
      oItem = GetNextItemInInventory(oCoffre);
  }
  effect eEf1 = EffectVisualEffect(VFX_IMP_DEATH_WARD);
  effect eEf2 = EffectVisualEffect(VFX_IMP_DEATH);
  effect eEf3 = EffectVisualEffect(VFX_IMP_BREACH);
  ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,eEf1,oCoffre )) ;
  ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,eEf2,oCoffre )) ;
  ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT,eEf3,oCoffre )) ;
}
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
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 16/12/2006 05:37:38 Sujet du message :

RÉSOLU' PROBLÈME VENANT D'AILLEURS








le bien, le mal...l'un ne va pas sans l'autre..j'avais un système impect mais voila depuis un temps il me lâche quelques fois..

j'ai un ennui qui me dépasse a vrai dire.

explications:

VOIR MON POST PLUS HAUT POUR LES SCRIPTS(MA PREMIÈRE RÉPONSE^^)


problème: ==> intermitent

sur le module depuis un certain temps (il a grossit depuis) mes pnjs *despawn* une seconde après que lorsque nous sommes en MD et qu'on *dépossède* un pnj ou quand on les *possèdent* . À savoir si nwn ne *perdrait* pas le fil pendant cette seconde(possède/dépossède) et qui considèrerait la zone comme vide même si ce n'est pas le cas...

Ou bien si c'est parce que nous avons 2 scripts différents (un pour les zones intérieures/extérieures) mais avec les même chiffre pour les signalevents. Ça je ne sais pas si ça cause problème.


enfin avant d'entrer dans les détails plus approfondis, il n'y aurait pas une âme charitable qui pourrait me donner son avis sur la question à savoir le POURQUOI mes pnjs *despawn* de facon non-désirée?
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
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 126.6ms