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:30:31


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 21/03/2006 06:23:18 Sujet du message : Économie de ressources

Bonjour, enfin je suis heureux de ne pas avoir un problème mais juste d'avoir besoin de vos avis^^. Bon voilà, tout le monde sait qu'il est toujours préférable de ne pas placer une multitude de pnjs pour des raisons de IA à gérer par le host. J'ai peut être une solution quant aux pnjs, j'ai pensé de mettre tous mes pnjs en *spawn* par script dans le OnEnter de la zone. Et j'ai aussi mis le script de *balayage* dans le OnUserDefined de la zone également. Donc ainsi une zone vide de PJs se retrouve automatiquement sans pnjs à l'intérieur de cette dernière.


Le principe du spawn marche avec des points de passage. Le point de passage déterminant la position et l'orientation qu'aura le pnj concerné. De la façon que j'ai fait le script on doit placer chaque point de passage avec un tag unique. Je vous montre les 2 scripts et j'aimerais savoir si c'est efficace en économie de ressources avec le procédé que j'utilise (car c'est pénible quelque peu à appliquer pour chaque zone on s'entend là dessus...).

Et surtout, savoir si mon script du OnEnter ne pourrait être pas plus simple (en utilisant le même tag de tous les points de passage pour la zone pour la même créature avec une commande spécifique du genre, GetNextItemInArea). Tappez pas si j'ignore les bases des commandes élémentaires du scriptage mais je parviens enfin à décoder, mais je ne suis aucunement familier avec les commandes *raccourcis*.

Bon voici, pour le OnEnter: (un exemple pour 3 gardes identiques, meme resref mais qui doivent avoir un point de passage unique *le p'tit problème...*)


NWScript :
//cree par Azazel, le 16 mars 2006
// script de spawn des pnjs de la zone
// a mettre dans le OnEnter de la zone


void main()
{



object oTarget;

object oPC = GetEnteringObject();
object oSpawn;
location lTarget;



lTarget = GetLocation(oTarget);
if (!GetIsPC(oPC)) return;
{
ExploreAreaForPlayer(GetArea(oPC), oPC);
oTarget = GetObjectByTag("222"); //tag des points de passages
oTarget = GetWaypointByTag("222"); //idem
oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget);
lTarget = GetLocation(oTarget);
oTarget = GetObjectByTag("223");
oTarget = GetWaypointByTag("223");
oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget);
lTarget = GetLocation(oTarget);
oTarget = GetObjectByTag("224");
oTarget = GetWaypointByTag("224");
oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "lancierleilon002", lTarget);
}

}
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 pour le OnUserDefined:



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;
                    }
                //* case OBJECT_TYPE_ITEM:
                  // {
                  // SetImmortal(oChk,FALSE);
                  // SetPlotFlag(oChk,FALSE);
                  // DelayCommand(0.1f,DestroyObject(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,SetIsDestroyable(TRUE));
                  //  DestroyObject(oChk);
                    // }
                  // break;
                  // }
                }
                oChk = GetNextObjectInArea(oArea);
                }
            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;
            }

        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() >= 1Cool || (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() <= 1Cool && (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;
        }
}
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.

_________________
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 : 21/03/2006 13:23:51 Sujet du message :

http://www.system-tek.com/nwinter/phpbb2/viewtopic.php?t=8603&p=121493

Voila un petit bout du static spawn global basé là-dessus, j'ai des scripts onenter sur toutes les zones
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 :

//:Confused///
//:: Created 2006-02-19, Lylver
//:: comme sur Armada : static spawn
//:Confused/
#include "ly_lib_pnj"
#include "ly_lib_item"
void main()
{
  object oPC = OBJECT_SELF ;
  object oArea = GetArea(oPC) ;
  string sAtag = GetLocalString(oArea,"ATAG") ;
  int bMesg = FALSE ;
  if( sAtag == "" ){
      sAtag = GetTag(oArea) ;
      if( sAtag != "" ) bMesg = TRUE ;
  }
  if( !GetIsPC(oPC) ) return ;
  string sPCID = GetPCID(oPC) ;
  int bSpawn = GetLocalInt(oArea,sPCID) ;
  int nDelay = GetLocalInt(oArea,"DELAI") ;
  if( nDelay == 0 ) nDelay = 24 ;
  if( !bSpawn ){
      SetLocalInt(oArea,sPCID,TRUE) ;
      DelayCommand(HoursToSeconds(nDelay),DeleteLocalInt(oArea,sPCID));
  }
  switch( StringToInt(sAtag) ){
      // Albion - Esterel : interieur Abbaye
      case 209 :{
        SpawnPNJ("PNJ_ADELME");
        break;
        }
      // CastelMort - le bourg
      case 509 :{
        SpawnPNJ("GUERRIERCM","0509",1,0,"GUERRIERCM1");
        SpawnPNJ("GUERRIERCM","0509",2,0,"GUERRIERCM2");
        SpawnPNJ("GUERRIERCM","0509",3,0,"GUERRIERCM3");
        SpawnPNJ("GUERRIERCM","0509",4,0,"GUERRIERCM4");
        SpawnPNJ("GUERRIERCM","0509",5,0,"GUERRIERCM5");
        SpawnPNJ("GUERRIERCM","0509",6,0,"GUERRIERCM6");
        SpawnPNJ("GUERRIERCM","0509",7,0,"GUERRIERCM7");
        SpawnPNJ("GUERRIERCM","0509",8,0,"GUERRIERCM8");
        SpawnPNJ("GUERRIERCM","0509",9,0,"GUERRIERCM9");
        SpawnPNJ("GUERRIERCM","0509",10,0,"GUERRIERCM10");
        break;
      }
      // Labyrinthe - 3
      case 1903 :{
        SpawnPNJ("TN_GOLEM_DEAMB","",1,0,"DEAMB03");
        if( !bSpawn ){
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",1,0,"GOLEMFLESH31");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",2,0,"GOLEMFLESH32");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",3,0,"GOLEMFLESH33");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",4,0,"GOLEMFLESH34");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",5,0,"GOLEMFLESH35");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",6,0,"GOLEMFLESH36");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",7,0,"GOLEMFLESH37");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",8,0,"GOLEMFLESH38");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1903",9,0,"GOLEMFLESH39");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1903",10,0,"GOLEM_OS310");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1903",11,0,"GOLEM_OS311");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1903",12,0,"GOLEM_OS312");
        }
        break;
      }
      // Labyrinthe - 4
      case 1904 :{
        SpawnPNJ("TN_GOLEM_DEAMB","",1,0,"DEAMB04");
        if( !bSpawn ){
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",1,0,"GOLEMFLESH41");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",2,0,"GOLEMFLESH42");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",3,0,"GOLEMFLESH43");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",4,0,"GOLEMFLESH44");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",5,0,"GOLEMFLESH45");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",6,0,"GOLEMFLESH46");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",9,0,"GOLEMFLESH49");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_CHAIR","1904",11,0,"GOLEMFLESH411");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1904",7,0,"GOLEM_OS47");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1904",8,0,"GOLEM_OS48");
            if( d3() != 1 ) SpawnPNJ("TN_GOLEM_OS","1904",10,0,"GOLEM_OS410");
        }
        break;
      }
      // Labyrinthe - 7
      case 1907 :{
        if( !bSpawn ){
            SpawnPNJ("SOW_MINOS_TYRAN","1907",1,0,"TYRAN1");
            SpawnPNJ("SOW_MINOS_TYRAN","1907",2,0,"TYRAN2");
        }
        break;
      }
      // Lyon - la ville
      case 3001 :{
        SpawnPNJ("PNJ_GARDEDELYON","3001",1,0,"PNJ_GARDEDELYON1");
        SpawnPNJ("PNJ_GARDEDELYON","3001",2,0,"PNJ_GARDEDELYON2");
        SpawnPNJ("PNJ_GARDEDELYON","3001",3,0,"PNJ_GARDEDELYON3");
        SpawnPNJ("PNJ_GARDEDELYON","3001",4,0,"PNJ_GARDEDELYON4");
        SpawnPNJ("PNJ_GARDEDELYON","3001",5,0,"PNJ_GARDEDELYON5");
        break;
      }
      // Le Bouchon lyonnais - La Grande Salle
      case 3101 :{
        SpawnPNJ("PNJ_DEUX_FLEURS","",1,2);
        SpawnPNJ("PNJ_GASTON","",1,2);
        break;
      }
      // Lyon - Ecu d'Or
      case 3703 :{
        SpawnPNJ("PNJ_ETANHAWK");
        break;
      }
/* etc */
}
}
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.


Les points de spawns on la tête suivante : SP_<ResRef>_01 ou SP_<AreaTag>_0<n>

Le gain :
- en conjonction avec l'éboueur de zones, c'est indispensable côté CPU
- désign également, t'es toujours ennuyé pour placer les déclencheurs de spawns : la c'est propre dans l'éditeur, on visualise exactement là ou va se trouver le PJ, et ca consomme des ressources alors que les PJs sont en train de transitionner : ils ne s'en aperçoivent pas (lag du au spawn)
 
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 90.071ms