La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/11/2024 18:16:53


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Malthus
Novice
Inscrit le: 12 Juin 2004
Messages: 8
Répondre en citant
Posté le : 12/06/2004 15:49:45 Sujet du message : Des objets qui réaparaissent dans les coffres.

Bonjour,

je chercher un script pour que les objets des coffres réaparaissent automatiquement au bout d'un temps donné.
(Histoire que tout le monde puisse se servir et pas que le premier qui passe sur le module)
Si vous avez une idée..
_________________
Bon ben je retrousse mes manches et j'y retourne encore et encore..

Malthus le noir
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Malthus
Novice
Inscrit le: 12 Juin 2004
Messages: 8
Répondre en citant
Posté le : 13/06/2004 06:57:59 Sujet du message : bon ben j'ai une solution si sa interesse qqun

Je me suis fait finalement un petit script, alors je le met si sa intéresse qqun.
Le plus gros pb est qu'il faut le personnaliser pour chaque coffre ce qui est super lourd, donc à ne placer que si le contenu du coffre est très important:

Code :
,void respawnobjet(string oItemTag)
{
 if(GetIsObjectValid(GetItemPossessedBy(OBJECT_SELF , oItemTag)) == 0)
 CreateItemOnObject(oItemTag, OBJECT_SELF, 1);
}

void main()
{

DelayCommand(600.0, respawnobjet("tagObjet1"));
DelayCommand(5.0, respawnobjet("tagObjet2"));
DelayCommand(5.0, respawnobjet("tagObjet3"));
}


Voila, si qqun à une idée d'amélioration..
_________________
Bon ben je retrousse mes manches et j'y retourne encore et encore..

Malthus le noir
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Mars
Seigneur
Inscrit le: 31 Mar 2004
Messages: 199
Répondre en citant
Posté le : 13/06/2004 10:20:03 Sujet du message :

je ne suis pas tres bon en script mais je ne pense pas qu'un delay comand soit l'ideal pour respawn un coffre. j'ai retrouvé un script que j'utilise sur mon module et qui marche tres bien
NWScript :
//:Confused///////////////////////// /////////////////////
//:: OnOpenCoffre
//:: Copyright (c) 2001 Bioware Corp.
//:Confused///////////////////////// ////////////////////
/*
Ce script permet de faire respawn les items d'un
coffre avec une probabilite.
Pour l'utiliser :
Le coffre doit avoir un tag de la forme "X_ce que vous voulez"
avec pour X l'intervalle de temps en seconde entre
2 respawns. Puis il faut placer dedans
les items qui doivent respawn, avec un tag de la forme
"n_resref" ou "n" est le pourcentage de chance que l'item
apparaisse et "resref" le resref de l'item en question.
*/

//:Confused///////////////////////// ////////////////////
//:: Created By: Tahlion, beta et modifs par Mercius
//:: Created On: 12/05/2003 18:36
//:Confused///////////////////////// ////////////////////
void main()
{
    int iNbItem = GetLocalInt(OBJECT_SELF,"nombre_item");

    if(iNbItem == 0)
    {
        object oItem = GetFirstItemInInventory(OBJECT_SELF);
        int i = 0;
        while(GetIsObjectValid(oItem))//boucle...
        {
            i++;
            string sTagProba = GetTag(oItem);
            //on prend la partie droite de l'item, donc le resref
            SetLocalString(OBJECT_SELF,"item" + IntToString(i), GetStringRight(sTagProba, GetStringLength(sTagProba) - 1 - FindSubString(sTagProba,"_")));
            //on prend la partie gauche, donc le pourcentage de chance d'apparition de l'item
            SetLocalInt(OBJECT_SELF,"proba" +IntToString(i), StringToInt(GetStringLeft(sTagProba, FindSubString(sTagProba,"_"))));

            //on detruit l'item
            DestroyObject(oItem);
            oItem = GetNextItemInInventory(OBJECT_SELF);
        }
        SetLocalInt(OBJECT_SELF,"nombre_item",i);
        SetLocalInt(OBJECT_SELF,"okgenere",1);//on peut generer les items maintenant
        iNbItem = i;
    }

    if(iNbItem > 0 && GetLocalInt(OBJECT_SELF,"okgenere") == 1)//si la boucle ci-dessus a ete faite
    {
        int i;
        for(i = 1; i <= iNbItem; i++)
        {
            //si l'item n'existe pas deja dans le coffre
            if(!GetIsObjectValid(GetItemPossessedBy(OBJECT_SELF, GetLocalString(OBJECT_SELF, "item" + IntToString(i)))))
            {
                //on calcul avec le pourcentage, pour savoir si l'item doit apparaitre ou pas
                if(d100() <= GetLocalInt(OBJECT_SELF,"proba" + IntToString(i)))
                {
                    //on cree l'item
                    CreateItemOnObject(GetLocalString(OBJECT_SELF,"item" + IntToString(i)));
                }
            }
        }
        SetLocalInt(OBJECT_SELF, "okgenere", 0);
        string sTagSelf = GetTag(OBJECT_SELF);
        DelayCommand(StringToFloat(GetStringLeft(sTagSelf, FindSubString(sTagSelf,"_"))), SetLocalInt(OBJECT_SELF, "okgenere", 1));
    }
}

////////////////////////////// ////////////////////////////// ///////////////////
////////////////////////////// ////////////////////////////// ///////////////////
////////////////////////////// ////////////////////////////// ///////////////////
/*Si votre coffre est en "intrigue", ignorer le script ci-dessous. Si votre coffre n'est pas en intrigue placer ce script sur le OnDamage du coffre. Ce code sert a ce que le coffre ne drop pas tout les items qu'il a dans sont iventaire*/

//onDamaged d'un coffre
void main()
{
  int iNbItem = GetLocalInt(OBJECT_SELF,"nombre_item");

  if(iNbItem == 0)
  {
      object oItem = GetFirstItemInInventory(OBJECT_SELF);
      int i = 0;
      while(GetIsObjectValid(oItem))//boucle...
      {
          i++;
          string sTagProba = GetTag(oItem);
          //on prend la partie droite de l'item, donc le resref
          SetLocalString(OBJECT_SELF,"item" + IntToString(i), GetStringRight(sTagProba, GetStringLength(sTagProba) - 1 - FindSubString(sTagProba,"_")));
          //on prend la partie gauche, donc le pourcentage de chance d'apparition de l'item
          SetLocalInt(OBJECT_SELF,"proba" +IntToString(i), StringToInt(GetStringLeft(sTagProba, FindSubString(sTagProba,"_"))));

          //on detruit l'item
          DestroyObject(oItem);
          oItem = GetNextItemInInventory(OBJECT_SELF);
      }
      SetLocalInt(OBJECT_SELF,"nombre_item",i);
      SetLocalInt(OBJECT_SELF,"okgenere",1);//on peut generer les items maintenant
      iNbItem = i;
  }
}

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.


Voila j'espere que ça t'aidera a+
et merci a Tahlion et Mercius pour se script
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Malthus
Novice
Inscrit le: 12 Juin 2004
Messages: 8
Répondre en citant
Posté le : 13/06/2004 11:19:01 Sujet du message : Merci pour ton code

Merci beaucoup pour ton code, mars
mais en fait je ne souhaite pas faire un respawn aléatoire sur mes coffres: je veut que le délais soit uniforme sur tout le serveur.

Je viens de finaliser un nouveau code maison qui fait exactement ce que je veut:
il suffit de le mettre sur le onOpen d'un coffre quelconque pour qu'il regenere sont contenu automatiquement tous les X temps.
la modification du delay ce fait une fois pour toute sur ce code et il fonctionne ensuite sur tout le serveur.
Je le fournis pour ceux que ca intéresse.

NWScript :

void respawnobjet(string oItemTag)
{
// on verifie que l'objet n'est pas deja dans l'inventaire
// si ce n'est pas le cas, on le cree.
if(GetIsObjectValid(GetItemPossessedBy(OBJECT_SELF , oItemTag)) == 0)
CreateItemOnObject(oItemTag, OBJECT_SELF, 1);
}
// rajouter dans la declaration pour les objets en plus item6 , item7 etc..
void balancetoutlesrespawns(string item1,string item2,string item3,string item4,string item5,int compteur ){
    int cpt=1;
    while (cpt<=compteur){
        if (cpt==1) {respawnobjet(item1);}
        if (cpt==2) {respawnobjet(item2);}
        if (cpt==3) {respawnobjet(item3);}
        if (cpt==4) {respawnobjet(item4);}
        if (cpt==5) {respawnobjet(item5);}
        //SendMessageToPC(GetLastOpene dBy(), "on respaw "+IntToString(cpt));
        // rajouter ici pour les objets en plus 6 , 7 etc..
        cpt++;
    }
    // on libere l'attente pour les respawn
    SetLocalInt(OBJECT_SELF, "respawnencours", 0);
}
void main()
{
//A la premire ouverture le coffre fait un inventaire de son propre contenu
//il cree une variable locale par objet.
float delay=5.0;// modifier ici le delay d'apparition des objects.
int compteur=0;
string item1="";
string item2="";
string item3="";
string item4="";
string item5="";
int init= GetLocalInt(OBJECT_SELF, "init");
int respawnencours= GetLocalInt(OBJECT_SELF, "respawnencours");

// avant tout on teste si une demande de respawn n'est pas deja
// en attente, si c'est le cas on fait rien: sa evite
// de saturer le serveur.
if (respawnencours !=1)
{

// on teste la presence d'une variables locale d'initialisation
if (init != 1)
{
// si on la trouve pas, on fait l'inventaire du coffre
// on cree une variable locale par objet et une pour l'init
// max objet 5: faut modifier un peu le code pour en faire plus.
// SendMessageToPC(GetLastOpenedB y(), "on initialise");
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while( GetIsObjectValid( oItem ))
  {

    compteur++;
    if (compteur==1) {SetLocalString(OBJECT_SELF, "item1", GetTag(oItem));
    item1=GetTag(oItem);
    }
    if (compteur==2) {SetLocalString(OBJECT_SELF, "item2", GetTag(oItem));
    item2=GetTag(oItem);
    }
    if (compteur==3) {SetLocalString(OBJECT_SELF, "item3", GetTag(oItem));
    item3=GetTag(oItem);
    }
    if (compteur==4) {SetLocalString(OBJECT_SELF, "item4", GetTag(oItem));
    item4=GetTag(oItem);
    }
    if (compteur==5) {SetLocalString(OBJECT_SELF, "item5", GetTag(oItem));
    item5=GetTag(oItem);
    }
        // rajouter ici pour les objets en plus 6 , 7 etc..
    oItem=GetNextItemInInventory(OBJECT_SELF);
  }
  // variable locale pour recuperer les objets
  SetLocalInt(OBJECT_SELF, "compteobject", compteur);
  SetLocalInt(OBJECT_SELF, "init", 1);


}
else
{
  // si on trouve l'init, on recupere simplement chaque objet dans les variables locales
compteur=GetLocalInt(OBJECT_SELF, "compteobject");
if (compteur >=1) {item1=GetLocalString(OBJECT_SELF, "item1");}
if (compteur >=2) {item2=GetLocalString(OBJECT_SELF, "item2");}
if (compteur >=3) {item3=GetLocalString(OBJECT_SELF, "item3");}
if (compteur >=4) {item4=GetLocalString(OBJECT_SELF, "item4");}
if (compteur >=5) {item5=GetLocalString(OBJECT_SELF, "item5");}
//SendMessageToPC(GetLastOpene dBy(), "trouve la variable locale");
}
// ensuite  il demande un respawn de tout ses objets
// a faire dans delay
// dans delay, les objets absent sont remplaces ce qui existent deja
// ne sont pas incrementes.

//SendMessageToPC(GetLastOpene dBy(), "on commande un respaw pour"+IntToString(compteu r));
// on previens qu'une demande est en attente
SetLocalInt(OBJECT_SELF, "respawnencours", 1);
// on envoi le respawn groupe avec un delay global.
DelayCommand(delay, balancetoutlesrespawns(item1,item2,item3,item4,item5, compteur));
}
}
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 contre j'ai quelques questions pour les "pros" du code neverwinter:
1) Est il possible de déclarer des tableaux dans un code?
2) Est il possible de déclarer des tableaux en variable locale?

Existe t-il un tutoriel bien fait pour apprendre les bases de ce code?
Parsque la franchement je code à l'aveuglette ..

En vous remerciant
_________________
Bon ben je retrousse mes manches et j'y retourne encore et encore..

Malthus le noir
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Malfouette
Voyageur
Inscrit le: 31 Aoû 2004
Messages: 2
Répondre en citant
Posté le : 31/08/2004 18:49:13 Sujet du message : respawn pas les objets speciales

Ton script et très bien Malthus je l'utilise sur mon serveur.Cool

mais j'ai 2 problèmes :Sad

1er problème : Je suis une quiche pour faire du script. (Et je glane pas mal d'info sur ce forum.) Laughing

2éme problème :
Comme je disait, ton script est excellent,Very Happy mais je n'arrive pas à le faire fonctionner avec des objet personnalisées
Il ne fonctionne qu'avec les objets génériques.Crying or Very sad

Es ce que je dois donner un RESREF spécifique à mes objets ?
Si oui de quel type ?
Ou alors faut il modifier ton script ?

si tu à un peux de temps pour expliquer à un humble vermisseau comme moi .....Very Happy
_________________
si il n'y a pas de solution, c'est qu'il n'y a pas de problème
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Malthus
Novice
Inscrit le: 12 Juin 2004
Messages: 8
Répondre en citant
Posté le : 31/08/2004 20:16:24 Sujet du message :

Ben en fait c'est étonant que ca ne fonctionne pas avec les objets personnalisés, sur mon serveur il fonctionnait avec tous les types d'objets.
C'est vrai que j'ai laissé tomber les serveurs (trop de boulot) et que je ne sais pas si le comportement des scripts à évolué.

Maintenant au vu de l'instruction utilisée "GetTag(oItem))", le script devrai remonter automatiquement le tag de tous les objets qu'il trouve, quelle que soit leur provenance, ce que tu me décrit est donc assez étrange.. a moins que tu ai donné le meme tag à plusieurs objets ce qui pourrai provoquer un conflit, ou encore que tes objets qui posent problème n'aient pas de tag .. mais bon il me semblait qu'on etait obligé d'en donner un.

voila, je n'en sais pas plus; en tout cas bon courage pour ton serveur..
_________________
Bon ben je retrousse mes manches et j'y retourne encore et encore..

Malthus le noir
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Malfouette
Voyageur
Inscrit le: 31 Aoû 2004
Messages: 2
Répondre en citant
Posté le : 02/09/2004 19:28:19 Sujet du message :

j'ai trouver en tatonnant.Sad
j'avai des Noms un peu long pour mes tag (on perd vite l'abitude du DOS 8+3)Confused
j'ai reduit et là ça fonctionne. Cool

j'eberge moi même mon serveur, j'ai une connexion 1024/128 et là j'attend de passer en 6Mo/512

Mon serveur est actuellement en ligne
(rubrique Rolplay)
Nom du serveur: [FR] Borderland (alpha)
Nom du Module: Ruinedragon

moi je ne fait que mapper Smile, j'ai un collègue qui fait le plus gros boulot
il fait tout les script et une grosse partie des maps Cool

là on demarre, c'est pour ça qu'il est en (alpha), on à encore pleins de petits problèmes à regler Sad

merci à toi et à tout les autres qui vous cassez la tête à pondres tout ces scrips... Very Happy
_________________
si il n'y a pas de solution, c'est qu'il n'y a pas de problème
 
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 84.827ms