JeuxOnLineForumsPlusConnectés : 643 (sites) | 1575 (forums)Créer un compte
Neverwinter Nights
Maskado
Répondre
Partager Outils Rechercher
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 

Eboueur, ... oui mais un peu trop

j'ai trouvé ce script dans le forum a mettre sur le OnExit d'une zone :

Code PHP:
int GetIsPCInArea (object oArea)

{

 
object oIntru GetFirstObjectInArea(oArea);

 while(
GetIsObjectValid(oIntru))

 {

  if(
GetIsPC(oIntru))

  {

   return 
TRUE;

  }

  
oIntru GetNextObjectInArea(oArea);

 }

 return 
FALSE;

}



void main()

{

 
object oArea OBJECT_SELF;

 if(!
GetIsPCInArea(oArea))

 {

  
object oIntru GetFirstObjectInArea(oArea);

  
//Tant que l'objet est un item valide

  
while(GetIsObjectValid(oIntru))

  {

   if(
GetObjectType(oIntru) == OBJECT_TYPE_ITEM)

   {

    
DestroyObject(oIntru);

   }

   
oIntru GetNextObjectInArea(oArea);

  }

 }


et il marche parfaitement bien, meme un peu trop : lorsque je prends un objet dans un coffre, je le mets dans mon inventaire, puis je pars. j'ouvre mon inventaire mais l'objet que je viens de mettre n'y est plus !! comment cela se fait il ? (en sachant que je n'ai pas changé de zone) !!

merci pour votre aide
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Selon moi ça ne devrait pas arriver, tu l'as bien mis dans le OnExit de la zone ?
Au pire, voici le script corrigé qui ne devrait plus poser de problème dans le cas d'un objet dans l'inventaire d'un PJ (mais je doute sincèrement que ce soit la cause....)

Code PHP:
int GetIsPCInArea (object oArea)
{
 
object oIntru GetFirstObjectInArea(oArea);
 while(
GetIsObjectValid(oIntru))
 {
  if(
GetIsPC(oIntru))
  {
   return 
TRUE;
  }
  
oIntru GetNextObjectInArea(oArea);
 }
 return 
FALSE;
}

void main()
{
  
object oArea OBJECT_SELF;
  if(!
GetIsPCInArea(oArea))
 {
  
object oIntru GetFirstObjectInArea(oArea);
  
//Tant que l'objet est un item valide
  
while(GetIsObjectValid(oIntru) && !GetIsPC(GetItemPossessor(oIntru)))
  {
    if(
GetObjectType(oIntru) == OBJECT_TYPE_ITEM)
   {
    
DestroyObject(oIntru);
   }
   
oIntru GetNextObjectInArea(oArea);
  }
 }


Si jamais tu es intéressé, voici la version que j'utilise, un peu plus spécifique il est vrai:

Code PHP:
int GetIsPCInArea (object oArea)
{
 
object oIntru GetFirstObjectInArea(oArea);
 while(
GetIsObjectValid(oIntru))
 {
  if(
GetIsPC(oIntru))
  {
   return 
TRUE;
  }
  
oIntru GetNextObjectInArea(oArea);
 }
 return 
FALSE;
}

void main()
{
 
object oArea OBJECT_SELF;
 
//Si il n'y a plus de PJ dans la zone
 
if(!GetIsPCInArea(oArea))
 {
  
object oIntru GetFirstObjectInArea(oArea);
  
//Tant que l'objet est valide et n'est pas un PJ
  
while(GetIsObjectValid(oIntru) && !GetIsPC(oIntru))
  {
   
int nType GetObjectType(oIntru);
   switch(
nType)
   {
    case 
OBJECT_TYPE_CREATURE:
     
//Si la creature n'est pas en combat
     
if(!GetIsInCombat(oIntru))
     {
      
//Si elle provient d'une rencontre, elle est detruite
      
if(GetIsEncounterCreature(oIntru))
      {
       
DestroyObject(oIntru);
      }
      
//Sinon elle se repose et se soigne
      
else
      {
       
AssignCommand(oIntruActionRest());
       
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(GetMaxHitPoints(oIntru)), oIntru);
      }
     }
     break;
    case 
OBJECT_TYPE_ITEM:
     
//Si l'objet n'est pas un objet de quete et qu'il n'est pas possede par un PJ
     
if(!GetPlotFlag() && !GetIsPC(GetItemPossessor(oIntru)))
     {
      
//DeleteLocalFloat(oIntru, "Durabilite");
      
DestroyObject(oIntru);
     }
     break;
    
//case OBJECT_TYPE_PLACEABLE:
    // break;
    
default:
     break;
   }
   
oIntru GetNextObjectInArea(oArea);
  }
 }

Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
alors, le probleme pour l'inventaire est réglé mais j'en ai un autre : il ne vire pas les drops des monstres tués ! (j'utilisele 2eme que tu m'a proposé)

edit : idem pour le 1er script corrigé !
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Les drops des monstres tués, c'est un item ou un placeable (genre un sac) ?

Parce que si c'est un placeable, c'est normal, ils ne sont pas supprimés par mon script (j'utilise des corps lootables avec inventaire qui disparaissent au bout de 2 minutes, donc ça ne m'est pas nécessaire).

Le problème si tu supprimes tous les placeables d'une zone, c'est que tu risques de supprimer aussi des éléments du décor

Si les drops du monstres apparaissent sous forme de sa, le mieux est que tu décommentes ces lignes dans le 2e scripte, que tu les écrives comme ceci, en remplaçant "TagSac" par le Tag de ton sac de drops:

Code PHP:
case OBJECT_TYPE_PLACEABLE:
 if(
GetTag(oIntru) == "TagSac")
 {
  
DestroyObject(oIntru);
 }
 break; 
Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
en fait ce sont les sacs par défaut ! ont-ils un tag précis ? tous les sacs de monstres différents ont-ils le meme tag ??
Lien direct vers le message - Vieux
Avatar de Archamedes_Fr
Archamedes_Fr
Alpha & Oméga
 
Avatar de Archamedes_Fr
 
Change le type de l'objet:
Code PHP:
case OBJECT_TYPE_STOREDestroyObject(oIntru);break; 
Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
hem, voila ce que j'ai fait et ca va tjr pas ! j'ai décommenté la ligne indiquée en mettant ce qu'Archamedes m'a dit et ca ne fonctionne tjr pas ! en tout cas ca compile mais je l'ai peut etre mal placé !

Code PHP:
int GetIsPCInArea (object oArea)
{
 
object oIntru GetFirstObjectInArea(oArea);
 while(
GetIsObjectValid(oIntru))
 {
  if(
GetIsPC(oIntru))
  {
   return 
TRUE;
  }
  
oIntru GetNextObjectInArea(oArea);
 }
 return 
FALSE;
}

void main()
{
 
object oArea OBJECT_SELF;
 
//Si il n'y a plus de PJ dans la zone
 
if(!GetIsPCInArea(oArea))
 {
  
object oIntru GetFirstObjectInArea(oArea);
  
//Tant que l'objet est valide et n'est pas un PJ
  
while(GetIsObjectValid(oIntru) && !GetIsPC(oIntru))
  {
   
int nType GetObjectType(oIntru);
   switch(
nType)
   {
    case 
OBJECT_TYPE_CREATURE:
     
//Si la creature n'est pas en combat
     
if(!GetIsInCombat(oIntru))
     {
      
//Si elle provient d'une rencontre, elle est detruite
      
if(GetIsEncounterCreature(oIntru))
      {
       
DestroyObject(oIntru);
      }
      
//Sinon elle se repose et se soigne
      
else
      {
       
AssignCommand(oIntruActionRest());
       
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(GetMaxHitPoints(oIntru)), oIntru);
      }
     }
     break;
    case 
OBJECT_TYPE_ITEM:
     
//Si l'objet n'est pas un objet de quete et qu'il n'est pas possede par un PJ
     
if(!GetPlotFlag() && !GetIsPC(GetItemPossessor(oIntru)))
     {
      
//DeleteLocalFloat(oIntru, "Durabilite");
      
DestroyObject(oIntru);
     }
     break;
    case 
OBJECT_TYPE_STORE:
    
DestroyObject(oIntru);
    break;
    
// break;
    
default:
     break;
   }
   
oIntru GetNextObjectInArea(oArea);
  }
 } 
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Citation:
en fait ce sont les sacs par défaut ! ont-ils un tag précis ? tous les sacs de monstres différents ont-ils le meme tag ??
Oui ils ont un tag par défaut: dans Objets Plaçables Générique/Contenants et leviers/Sacs (LootBag1 à LootBag6)


Voilà le code à insérer:

Code PHP:
case OBJECT_TYPE_PLACEABLE:
 
int nN 1;
 for(
nN 1nN 6nN++)
 { 
  if(
GetTag(oIntru) == "LootBag"+IntToString(nN))
  {
   
DestroyObject(oIntru);
  }
 }
 break; 
Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
bah donc voila le script que ca donne

Code PHP:
int GetIsPCInArea (object oArea)
{
 
object oIntru GetFirstObjectInArea(oArea);
 while(
GetIsObjectValid(oIntru))
 {
  if(
GetIsPC(oIntru))
  {
   return 
TRUE;
  }
  
oIntru GetNextObjectInArea(oArea);
 }
 return 
FALSE;
}

void main()
{
 
object oArea OBJECT_SELF;
 
//Si il n'y a plus de PJ dans la zone
 
if(!GetIsPCInArea(oArea))
 {
  
object oIntru GetFirstObjectInArea(oArea);
  
//Tant que l'objet est valide et n'est pas un PJ
  
while(GetIsObjectValid(oIntru) && !GetIsPC(oIntru))
  {
   
int nType GetObjectType(oIntru);
   switch(
nType)
   {
    case 
OBJECT_TYPE_CREATURE:
     
//Si la creature n'est pas en combat
     
if(!GetIsInCombat(oIntru))
     {
      
//Si elle provient d'une rencontre, elle est detruite
      
if(GetIsEncounterCreature(oIntru))
      {
       
DestroyObject(oIntru);
      }
      
//Sinon elle se repose et se soigne
      
else
      {
       
AssignCommand(oIntruActionRest());
       
ApplyEffectToObject(DURATION_TYPE_INSTANTEffectHeal(GetMaxHitPoints(oIntru)), oIntru);
      }
     }
     break;
    case 
OBJECT_TYPE_ITEM:
     
//Si l'objet n'est pas un objet de quete et qu'il n'est pas possede par un PJ
     
if(!GetPlotFlag() && !GetIsPC(GetItemPossessor(oIntru)))
     {
      
//DeleteLocalFloat(oIntru, "Durabilite");
      
DestroyObject(oIntru);
     }
     break;
    case 
OBJECT_TYPE_PLACEABLE:
 
int nN 1;
 for(
nN 1nN 6nN++)
 {
  if(
GetTag(oIntru) == "LootBag"+IntToString(nN))
  {
   
DestroyObject(oIntru);
  }
 }
 break;
   }
   
oIntru GetNextObjectInArea(oArea);
  }
 }

et ca ne fonctionne tjr pas ! c'est bien a placer dans le OnExit de la zone ??? pas de la zone de transition !!
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Euh ça ne compile pas le script que tu as fait, ça ne peut pas fonctionner c'est clair.

Demande exactement TOUT ce que tu veux que le script fasse (et ne fasse pas); et quand tu veux qu'il agisse. Et je vais te mettre une version "copier/coller" ça sera plus facile.
Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
ah bon ! moi ca compile ^^

bref en fait j'aimerai qu'une fois tous les pjs sortis d'une zone, l'eboueurs vire les drops des monstres et les dechets que des pj auraient laissé. il ne faut pas qu'il detruise les placables ni ce qu'on trouve dans les coffres.

voila

merci d'avance
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Le script fait ça, à condition que les drops de tes monstres ne soient pas des plaçables justement.
Si c'est le cas, il me faut leur TAG, le script ne peut pas effacer ce qu'il ne peut pas identifier
Lien direct vers le message - Vieux
Avatar de xelone
xelone
Roi
 
Avatar de xelone
 
Bah le tag, c'est ce que je t'ai dit avant, ce sont les modele tresor par defaut, les petits sacs !!

donc j'ai placé le code que tu m'a donné !

maintenant c peut etre aussi la mise en place : j'ai créé un module test sans rien ! j'ai mis un seul script dans le onexit des 2 zones que j'ai fait , mis 2-3 coffres et une dizaine de gobelins (pour avoir quelques sacs) et les sacs ne disparaissent pas !

maintenant j'ai été sur un autre forum où il me disait autre chose (ca fonctionne pas non plus mais je te le copie quand meme au cas ou)

Citation:
C'est normale, puisque la définition de GetIsPCInArea montre qu'on ne cherche que les joueurs, pas les monstres!



Code PHP:
int GetIsPCInArea (object oArea

object oIntru GetFirstObjectInArea(oArea); 
while(
GetIsObjectValid(oIntru)) 

//la il vérifie si c est un joueur 
  
if(GetIsPC(oIntru)) 
  { 
  return 
TRUE
  } 
  
oIntru GetNextObjectInArea(oArea); 
//si non il zappe et en cherche un autre 

return 
FALSE


Donc il suffit surement (mais pas sûr) de modifier ce passage.
En le remplaçant par :

Code PHP:
int GetIsPCInArea (object oArea

object oIntru GetFirstObjectInArea(oArea); 
while(
GetIsObjectValid(oIntru)) 

  return 
TRUE;  
  
oIntru GetNextObjectInArea(oArea); 

return 
FALSE

ça devrait tourner.
A confirmer tout de même, j'ai pas regarder en détail...
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Ils sont gentils sur le forum où tu as été, mais ils feraient bien de lire tout le code

La fonction est utilisée en début de script pour vérifier si la zone qu'on quitte contient encore des PJ ou non.
Si ce n'est pas le cas (le ! devant indique: SI la condition est FAUSSE), alors le script s'exécuté; donc dans ce cas-ci:

SI il n'y a PAS de PJ dans la zone, alors....

Cette condition n'a rien à voir avec les "monstres", vu qu'elle ne sert que de condition de déclenchement du script éboueur.



**Concernant les sacs je vais tester un module avec ce genre de drop moi-même, et voir si ça marche ou pas.
Lien direct vers le message - Vieux
Avatar de Nek
Nek
Alpha & Oméga
 
Avatar de Nek
 
Après tests, le sac droppé par les créatures Bioware est un PLACEABLE qui possède le Tag: BodyBag.
Objet qui n'existe pas dans la palette, et dont l'apparition est bien entendu, "Hardcoded".
Je n'ai pas trouvé le moyen de les détruire, même en mettant leur TAG, ou encore en jouant avec "SetIsDestroyable"... le DestroyObject ne marche pas.
C'est possible que j'ai oublié un truc ou que je m'y suis mal pris.

Je ne peux te conseiller que d'utiliser un script rendant les corps "lootables", avec lequel il est plus facile d'utiliser un tel script.

Encore désolé de n'avoir pas pu trouver de solution pour ton module.
Lien direct vers le message - Vieux
Répondre

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 18h06.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite