La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 27/11/2024 18:16:53
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Malthus Novice Messages: 8 |
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 | |
Malthus Novice Messages: 8 |
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 | |
Mars Seigneur Messages: 199 |
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 :
//:///////////////////////// ///////////////////// //:: OnOpenCoffre //:: Copyright (c) 2001 Bioware Corp. //:///////////////////////// //////////////////// /* 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. */ //:///////////////////////// //////////////////// //:: Created By: Tahlion, beta et modifs par Mercius //:: Created On: 12/05/2003 18:36 //:///////////////////////// //////////////////// 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; } } Voila j'espere que ça t'aidera a+ et merci a Tahlion et Mercius pour se script |
Revenir en haut | |
Malthus Novice Messages: 8 |
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)); } } 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 | |
Malfouette Voyageur Messages: 2 |
Ton script et très bien Malthus je l'utilise sur mon serveur.
mais j'ai 2 problèmes : 1er problème : Je suis une quiche pour faire du script. (Et je glane pas mal d'info sur ce forum.) 2éme problème : Comme je disait, ton script est excellent, mais je n'arrive pas à le faire fonctionner avec des objet personnalisées Il ne fonctionne qu'avec les objets génériques. 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 ..... _________________ si il n'y a pas de solution, c'est qu'il n'y a pas de problème |
Revenir en haut | |
Malthus Novice Messages: 8 |
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 | |
Malfouette Voyageur Messages: 2 |
j'ai trouver en tatonnant.
j'avai des Noms un peu long pour mes tag (on perd vite l'abitude du DOS 8+3) j'ai reduit et là ça fonctionne. 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 , j'ai un collègue qui fait le plus gros boulot il fait tout les script et une grosse partie des maps là on demarre, c'est pour ça qu'il est en (alpha), on à encore pleins de petits problèmes à regler merci à toi et à tout les autres qui vous cassez la tête à pondres tout ces scrips... _________________ si il n'y a pas de solution, c'est qu'il n'y a pas de problème |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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