Supprimer plusieurs objets identiques de l'inventaire

Répondre
Partager Rechercher
Salut !

Dans mon module il y a un forgeron qui fabrique des armes avec du métal enrichi aux oeufs de Poulet Canibale (non, cherchez pas, c'est une longue histoire... ), et doit donc donner l'arme lorsque le joueur a les ingrédients qu'il faut.

Par exemple pour une épée courte il faut 15 oeufs et 15 000 po ; dans mon script l'épée est donnée, l'or est retiré, mais pas les oeufs.
Voilà le script en question :

Code PHP:

object oPC GetPCSpeaker();

void main()
{
CreateItemOnObject ("epedoeufdepoulet"oPC1);

ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);
ActionTakeItem (GetObjectByTag("OeufdePouletCannibale"), oPC);

TakeGoldFromCreature (15000oPCFALSE);

Bon, la méthode des 15 actions pour supprimer les oeufs n'est pas très élégante, mais je n'ai pas trouvé mieux (enfin, pas trop eu le temps de chercher non plus...).
Mais donc, les oeufs ne sont pas supprimés de l'inventaire...

Comment se fait-ce-t-il donc ? Et comme faire pour supprimer tous les oeufs en une seule ligne de commande ? (parce que pour une épée à 2 mains il faut 50 oeufs, ça va faire beaucoup )
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Le DestroyObject marche aussi dans l'inventaire ?

Parce que je me demande un truc, imaginons que le joueur pose quelques-uns des oeufs par terre avant de donner les autres au forgerons, ça ne va pas détruire ceux au sol plutôt que ceux dans l'inventaire ?
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
mm, je sais pas comment ca fait un ActionTakeItem, mais pour le DestroyObject ca risque de poser un pb, car il me semble que les objets ne seront détruits qu'a la fin du script, donc je ne sais pas si il va choisir un objet différent a chaque fois, ou bien le premier dans l'inventaire qui a ce tag, alots tu te retrouve avec un objet sur 50 qui est détruit 50 fois :/

essai plutot un boucle sur GetFirstItemInInventory, style

Code PHP:

void main()
{
object oPC GetPCSpeaker();
CreateItemOnObject ("epedoeufdepoulet"oPC1);
object oOeuf GetFirstItemInInventory(oPC);
int i 1;
while((
GetIsObjectValid(oOeuf)) && (50))
{
if(
oOeuf == GetObjectByTag("OeufdePouletCannibale"))
{
DestroyObject(oOeuf);
i++;
}
oOeuf GetNextItemInInventory(oPC);
}
TakeGoldFromCreature (15000oPCFALSE);

ouala
en modifiant les conditions dans le while et tu change le nb d'oeuf virer ^_^
bon, par contrepour avoir le nb exact que tu veu, fais des tests, chuis jamais sure, à un ou deux oeuf près ...
mais je pense que ca marche
( tt cas ca compil )

ps : la, il va creer même si y a pas assez d'oeuf, ou de tunes, faut tester tt ca d'abord ^_^
Citation :
Provient du message de Cassin
Le DestroyObject marche aussi dans l'inventaire ?

Parce que je me demande un truc, imaginons que le joueur pose quelques-uns des oeufs par terre avant de donner les autres au forgerons, ça ne va pas détruire ceux au sol plutôt que ceux dans l'inventaire ?
pas si tu les cherchent dans l'inventaire
fin je pense pas :-/
( pk g un doute là ? )
Il y a une fonction genre GetItemPossessedBy() qui renvoi l'objet dont le resref est passé en paramètre et présent dans l'inventaire du PJ, ou OBJECT_INVALID si le PJ ne l'a pas.

C'est celle ci qu'il faut utiliser a mon avis pour ne taper que dans l'inventaire du PJ.
mm, GetItemPossedBy demande le tag
et avec un destroyObject je pense que ca n'iras pas, a cause que l'objet seras pas détruit avant la fin du script, y avait un topic la dessus chais plus où ... bref

et avec GetFirstItemInInventory tu pense que ca va pas marcher (j'en ai déjà fait, et d'ailleur le nettoyeur d'inventaire c comme ca qu'il marche ^_^ )
exemple de code tout à fait faisable

Code PHP:

object oItem=GetFirstItemInventory(oPC);

while(
GetIsObjectValid(oItem))
{

DestroyObject(oItem);
oItem=GetNextItemInventory(oPC);

voila, ce genre de code marche très bien, pour vous dire , je l'utilise tout le temps
OK, merci, j'essaierais ça cet après-midi si je peux

J'avoue que j'ai du mal avec les sélections multiples, que ce soit des objets, des créatures ou des joueurs
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Bouhouhouuuuu, j'arrive à rien...


J'ai utilisé le script de Reyan, mais que je mette le tag ou le resref de l'oeuf, rien y change, l'épée est bien ajoutée à l'inventaire, l'or est bien enlevé... mais pas les oeufs !


Y'a-t-il quelque chose que je n'aurais pas compris ???
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Par rapport au script de Reyan, je pense que :

- Au lieu de (oOeuf==GetObjectByTag(....)) pese plus lourd que
GetTag(oOeuf)==..., mais je peux me tromper.
(mais je pense qu'un string est moins lourd a recuperer qu'un objet... bon, ca change rien au probleme, mais a mon avis, ca optimiserait ^^

- l'entier i designe un nombre d'oeufs a detruire, c'est ca ?
Deja, verifie le stack des oeufs: s'ils sont tous stacké, ca peut gener.

Ensuite, je ferai personnelement un DelayCommand(0.5,DestroyObject())... juste au cas ou ... (normalement, y'en a pas besoin, mais bon, vu que lors d'une boucle de recuperation d'objet, il cree une liste qu'il met a jour dynamiquement, ca peut eventuellement servir...

Enfin, si ca ne marche pas, ajoute une ligne de DEBUG, genre :

au lieu de
{
DestroyObject(oOeuf);
i++;
}


tu met
Code PHP:

{
DestroyObject(oOeuf);
SendMessageToPC(oPC,IntToString(i));
i++;

Juste histoire de savoir ce qu'il se passe reeelement...
(je pense que tu va obtenir 50ligne de 1 à 50, mais je peut me tromper... ^^)
euh, mea very maxima culpa je pense, ca doit être a cause des objets, essai en faisant ca :
Code PHP:

void main()
{
object oPC GetPCSpeaker();
CreateItemOnObject ("epedoeufdepoulet"oPC1);
object oOeuf GetFirstItemInInventory(oPC);
int i 1;
while((
GetIsObjectValid(oOeuf)) && (50))
{
if(
GetTag(oOeuf) == "OeufdePouletCannibale")
{
DestroyObject(oOeuf);
i++;
}
oOeuf GetNextItemInInventory(oPC);
}
TakeGoldFromCreature (15000oPCFALSE);

et c'est le TAG qu'il faut
edit : ouned comme on dit ^_^
OK, ça marche, merci !

Je crois que j'ai presque tout compris au sujet des boucles , on verra ça ultérieurement...


__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Je pense que tu ne détruis que 49 oeufs Reyan :
Code PHP:

....
int i 0//on a pas encore détruit d'oeuf

while((GetIsObjectValid(oOeuf)) && (50))

{

    if(
GetTag(oOeuf) == "OeufdePouletCannibale")

    {

        
DestroyObject(oOeuf);

        
i++;// quand i vaut 1 après ça, on a détruit 1 oeuf, 50, 50  oeufs, et on s'arrête.

    
}
.... 
Citation :
bon, par contrepour avoir le nb exact que tu veu, fais des tests, chuis jamais sure, à un ou deux oeuf près ...
j'avais prevenu je me plante tt le tps a un ou deux objets près
donc je fais des tests ^_^ (non mais !)
A ce propos, puisqu'on parle de DestroyObject, je ne saurai trop encourager tout le monde a faire ceci :

Code PHP:

void VDestroyObject(object oObject)
{
if (
GetIsObjectValid(oObject))
    {
    
DestroyObject(oObject);
    }
//else WriteTimestampedLogEntry("DEBUG : This Object was Destroyed before the DestroyObject Command :"+GeName(oObject));

Parcequ'avec les DelayCommand, ca peut créer parfois des bugs, et surtout des downs sur un serveur.
(c'est rare, mais bon, dans le doute, j'utilise ca pour etre tranquille ^^)
Bon pour en revenir à la différence entre :
GetTag(oItem) == "bidule"
et
oItem == GetObjectByTag( "bidule" )
Elle est en réalité fondamentale ! Et si le second ne marchait pas, c'est qu'il y a d'excellentes raisons pour ça :
Je ne sais pas si vous avez remarqué, mais GetObjectByTag() possède deux paramètres, et ils ne sont pas là pour faire joli : si l'on ne change pas le numéro du 2ème paramètre, on obtient toujours le même objet, c'est ainsi que le script initial de Cassin rapportait 10 fois le même objet, qui pouvait d'ailleurs se trouver n'importe où dans le module .

Maintenant, regardons notre égalité entre objets :
oItem == GetObjectByTag( "bidule" )
On remarque que l'objet auquel on va comparer oItem sera toujours le même, et c'est là que se pose le problème : quand on compare deux objets, même s'ils sont strictement identiques, on obtiendra FALSE, pourquoi ? Parce qu'il ne s'agit pas du même objet pour le jeu ! Ils se trouvent à des endroits différents ! (du point de vue technique, ce sont les pointeurs vers les objets qui sont comparés et comme chaque adresse mémoire est unique...).
Autrement dit, dans une boucle telle que celle là, si on a de la chance, un seul oItem correspondra à la comparaison et si on en a pas (si GetObjectByTag() a ramené l'item qui se trouve de l'autre côté du module....), aucun oItem ne correspondra...

Il faut donc toujours utiliser la première forme dans de telles boucles et en général, la comparaison d'objet étant réservé à de très rare cas.
OK, merci, je note
__________________
"Pour l'Honneur de Dame Pounard et la sauvegarde la Couveuse Impériale, je me battrais jusqu'à mon dernier Couac !"

Mon site de modules pour NwN, de portraits pour BG et de fanfictions
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés