La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 20/05/2024 21:42:02


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 16/12/2005 10:04:39 Sujet du message : [Résolu] Détecteur d'item dans un inventaire

Bonjour !

Je fais un "détecteur de drogue" et ça rate :

Le PJ lançant l'effet se retrouve surchargé (la boucle ne s'arrête pas en gros)

Voilà le script :

NWScript :
void main()
{
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
object oBoucle = GetFirstItemInInventory(oTarget);
string sTagDrogue = "drogue";


while ( GetIsObjectValid(oBoucle))
    {
        if ( GetTag(oBoucle) == sTagDrogue )
        {
            DestroyObject(GetItemPossessedBy(oTarget, "drogue"));
            CreateItemOnObject("drogue", oPC);
            FloatingTextStringOnCreature("Vous trouvez quelque chose sur cette personne.", oPC, FALSE);
        }
        oBoucle = GetNextItemInInventory(oPC); // On notera effectivement la faute
    }
}
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 en théorie, le PJ1 lance ça sur un autre PJ2 (ou une créature).
Si le PJ2 a l'objet "drogue", ça renvoit un message au PJ1 : "Vous trouvez quelque chose sur cette personne".
Ca détruit l'objet sur le PJ2 et le met dans l'inventaire du PJ1.

Le problème c'est que ça ne semble pas se détruire sur le PJ2 et donc ça fait une boucle : le PJ1 se trouve surchargé et impossible d'arrêter le script.

Des idées ?
Dernière édition par Djezebel le 27/12/2005 22:11:43; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
castorus
Acolyte
Inscrit le: 24 Déc 2005
Messages: 23
Répondre en citant
Posté le : 24/12/2005 05:01:27 Sujet du message :

voici une réponse que je te propose ma chère Djezebel. J'ai déduit de part moi même que tu auras du malheureusement trompée dans la fonction CreateItemOnObject(); car la ou l'argument demander est le template (resref) de l'objet , apparement toi tu as nommé le tag , je pense donc que ceci devrais permettre de resoudre ton petit problème , pense bien a remplacer la valeur de la variable sResRefDrogue par le vrai resref de la drogue.


NWScript :

void main()
{
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
object oBoucle = GetFirstItemInInventory(oTarget);
string sTagDrogue = "drogue";
string sResRefDrogue = "resref_drogue";
int i=0;

if(GetIsPC(oTarget)==FALSE)
{
SendMessageToPC(oPC,"Le detecteur ne peu s'utiliser que sur les PJs.");
return;
}

  while(oBoucle!=OBJECT_INVALID)
  {
      if (GetTag(oBoucle) == sTagDrogue )
      {
      i=i+1;
      DestroyObject(GetItemPossessedBy(oTarget,sTagDrogue));
      CreateItemOnObject(sResRefDrogue, oPC);
      }
  oBoucle = GetNextItemInInventory(oPC);
  }

FloatingTextStringOnCreature("Vous trouvez "+IntToString(i)+" chose(s) sur "+GetName(oTarget)+".", oPC, FALSE);
}
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
 
castorus
Acolyte
Inscrit le: 24 Déc 2005
Messages: 23
Répondre en citant
Posté le : 24/12/2005 05:33:37 Sujet du message :

muerf erreur d'inatention... j'ai oublier un truc !!! en fait ta boucle foirais tout connement parce que dans l'initialisation de ta variable oBoucle tu dis de prendre le premier item de l'inventaire de oTarget or dans la boucle pour la poursuite de l'analyse tu dis de prendre les objets de l'inventaire de oPC , or c'est de oTarget !!! désolé pour cette inatention ^^.



boucle corrigée !

NWScript :



void main()
{
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
object oBoucle = GetFirstItemInInventory(oTarget);
string sTagDrogue = "drogue";
string sResRefDrogue = "resref_drogue";
int i=0;

  if(GetIsPC(oTarget)==FALSE)
  {
  SendMessageToPC(oPC,"Le detecteur ne peu s'utiliser que sur les PJs.");
  return;
  }

      while(oBoucle!=OBJECT_INVALID)
      {
          if (GetTag(oBoucle) == sTagDrogue )
          {
          i=i+1;
          DestroyObject(GetItemPossessedBy(oTarget,sTagDrogue));
          CreateItemOnObject(sResRefDrogue, oPC);
          }
      oBoucle = GetNextItemInInventory(oTarget);
      }

FloatingTextStringOnCreature("Vous trouvez "+IntToString(i)+" chose(s) sur "+GetName(oTarget)+".", oPC, FALSE);
}
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
 
lylver
Héros
Inscrit le: 08 Avr 2005
Messages: 274
Répondre en citant
Posté le : 27/12/2005 18:13:43 Sujet du message :

Une fonction à tout faire pour compter et détruire un objet d'un Tag particulier

NWScript :
int MustHaveNoneOf(object oPC, string sObjectTag){
  int iNbItem=0,i;
  object oItem = GetFirstItemInInventory(oPC);
  while (GetIsObjectValid(oItem)==TRUE ){
      if( GetTag(oItem) == sObjectTag ){
        iNbItem += GetNumStackedItems(oItem) ;
        SetPlotFlag(oItem, FALSE) ;
        DestroyObject(oItem) ;
      }
      oItem = GetNextItemInInventory(oPC);
  }
  for( i=0; i < NUM_INVENTORY_SLOTS; i++){
      oItem = GetItemInSlot(i, oPC) ;
      if( GetTag(oItem) == sObjectTag ){
        iNbItem += GetNumStackedItems(oItem) ;
        ActionUnequipItem(oItem) ;
        SetPlotFlag(oItem, FALSE) ;
        DelayCommand(2.0, DestroyObject(oItem)) ;
      }
  }
  return iNbItem;
}
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
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 27/12/2005 20:54:03 Sujet du message :

Je pense qu'il serait plus judicieux de détruire l'objet ciblé dans la boucle que d'utiliser un GetItemPossessedBy.
_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 27/12/2005 22:08:47 Sujet du message :

En effet, merci pour toutes ces indications Ivellios et Lylver ainsi qu'à toi cher Castorus Smile


Ca marche à merveille :



NWScript :
void main()
{
object oPC = GetItemActivator();
object oTarget = GetItemActivatedTarget();
object oBoucle = GetFirstItemInInventory(oTarget);
string sTagDrogue = "drogue";
string sResRefDrogue = "drogue";
int i=0;

  //if(GetIsPC(oTarget)==FALSE)
  //{
  //SendMessageToPC(oPC,"Le detecteur ne peu s'utiliser que sur les PJs.");
  //return;


      while(oBoucle!=OBJECT_INVALID)
      {
          if (GetTag(oBoucle) == sTagDrogue )
          {
          i=i+1;
          DestroyObject(oBoucle);
          CreateItemOnObject(sResRefDrogue, oPC);
          }
      oBoucle = GetNextItemInInventory(oTarget);
    }

FloatingTextStringOnCreature("Vous trouvez "+IntToString(i)+" chose(s) sur "+GetName(oTarget)+".", oPC, FALSE);
}
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.


Merci à tous !
 
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 34.903ms