[Script] Vider l'inventaire d'un joueur

Répondre
Partager Rechercher
Script initialement proposé par Florynth !
Citation :
vider inventaire et equipement...
Comme j'ai chercher longtemps comment faire et je crois avoir trouver une bonne façon de le faire et bien je vous donne mon script (j'ai été chercher une partie a cette page https://forums.jeuxonline.info/newth...read&forumid=28 , mais j'ai optimisé un peu dans une boucle c'est moins chiant)
Code PHP:

//Vide l'inventaire de la cible et la met dans le contenant
//Si pas de contenant specifier, detruit tout simplement 

void viderInventaire(object cibleobject contenant=OBJECT_INVALID)
{
    
int i;
    
object item;
    
object copiItem;
    while((
item GetNextItemInInventory(cible)) != OBJECT_INVALID){
        if(
contenant != OBJECT_INVALID){
            
copiItem CreateItemOnObject(GetTag(item), contenant);
            
SetPlotFlag(copiItemGetPlotFlag(item));
            
SetIdentified(copiItemGetIdentified(item));
        }
        
DestroyObject(item);
    }
    for(
<= NUM_INVENTORY_SLOTS i++){
        
item GetItemInSlot(i,cible);
        if(
contenant != OBJECT_INVALID){
            
copiItem CreateItemOnObject(GetTag(item), contenant);
            
SetPlotFlag(copiItemGetPlotFlag(item));
            
SetIdentified(copiItemGetIdentified(item));
        }
        
DestroyObject(item);
    }

J'ai utiliser ce script dans un module ou on débute dans une prison... j'ai mis cette appel dans le onEnter de la zone (area) faites attention de vérifier quel personnage et quand vous voulez qu'il le fasse
Le même pour OnEnter
Script initialement proposé par Florynth, sur demande de Halaster Le Sombre !
Citation :
Je te donne le script que j'ai mis dans le onEnter de ma zone ou il y a la prison... les deux scripts (pour l'inventaire et les combats d'araignés) sont présents dans cet epel...
Code PHP:

void main()
{
    
object personnage GetEnteringObject();
    
// La premiere fois q'un personnage entre, donc le debut du module
    
if (GetIsPC(personnage))
    if(
GetLocalInt(OBJECT_SELF,"entrer") != 1)
    {
        
SetLocalInt(OBJECT_SELF,"jour entrer",GetCalendarDay());
        
viderInventaire(personnage,GetObjectByTag("CoffreEquipement"));
        
activeRencontreAraigne(FALSE);
        
SetLocalInt(OBJECT_SELF,"entrer",1);
    
// Les autre fois
    
}else{
        
int jourEntrer GetLocalInt(OBJECT_SELF,"jour entrer");
        
int aujourdhui GetCalendarDay();
        if(
GetLocalInt(OBJECT_SELF,"araigneReineVie") == TRUE && (aujourdhui jourEntrer) > 10)
            
activeRencontreAraigne(TRUE);
        else
            
activeRencontreAraigne(FALSE);
    }

Il faut vérifier avec getEnteringObject si c'est un joueur car l'inventaire de tout les créatures sera vider... et tu doit exécuter se script seulement a un moment précis (dans ce cas la première fois qu'il entre dans la zone) car sinon il videra sont inventaire tout le temps... et pour ce qui est de la sauvegarde de la date c'est pour mes combats contre les araignés... j'espère que ça ta aider...

p.s. : je te met le script si du onEnter de la zone si tu veux que tout les personnage joueur soit vider à chaque fois qu'il entre dans la zone
Code PHP:

void main()
{
    
object personnage GetEnteringObject();
    if (
GetIsPC(personnage))
            
viderInventaire(personnage);// ici comme aucun objet contenant est spécifier le contenu de l'inventaire est simplement détruit..,

tss tss vider l'inventaire
alors ca c pas beau.......mais heuuuuuuuuuu comment ca marche ?

__________________
Congnois toy toy mesme. Nulle gloire dans le sang inutile
Explication
Je te met le lien du script d'apparition d'araigné... il est un peu plus expliqué... alor si t'as d'autre question ne te gêne pas et soit un peu plus précis sur ce que tu comprend pas exactement ça va m'aider à te donner une bonne réponse...

[URL=https://forums.jeuxonline.info/showthread.php?t=127621[/URL]
__________________
Florynth ... bientôt un monde sera miens...
J'avais fais un script de ce genre mais je me suis aperçus que ça ne vidait que les objets de l'inventaire (mais pas tous, je comprend pas pourquoi ) et pas ceux des items équipés (sur le joueur quoi).

J'ai donc essayé ton script et ça fait la même chose : l'équipement déjà équipé ne disparait pas !

Quelqu'un aurait une idée pour remédier à ça ?


(juste pour info je met le petit script que j'avais fait)
Code PHP:

object oPC GetLastSpeaker();
object oInventory GetNextItemInInventory(oPC);

void main()
{
DestroyObject (oInventory);
ExecuteScript("del_inventory",OBJECT_SELF);
}

Vide l'inventaire de la cible et la met dans le contenant
Si pas de contenant specifier, detruit tout simplement 
__________________
"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
L'equipement dans l'inventaire n'ets pas equipé, et lycée de versailles... C'est pourquoi Tyn' utilise la deuxieme boucle :
Code:
for(i = 0 ; i <= NUM_INVENTORY_SLOTS ; i++){
        item = GetItemInSlot(i,cible);
        if(contenant != OBJECT_INVALID){
            copiItem = CreateItemOnObject(GetTag(item), contenant);
            SetPlotFlag(copiItem, GetPlotFlag(item));
            SetIdentified(copiItem, GetIdentified(item));
qui lui donne acces a l'equipement equipé..

Quand a la non-exaustivité de ton vidage d'inventaire, ca vient de l'OBJECT_SELF, je pense...

Essaye en mettant oPC a la place ?
vider inventaire...
Heu... j'ai revérifier mon script pour être sur que tout était correct et comme je pensais tout et beau... il vide complétement l'inventaire du personnage... il est nu comme un ver
tu as peut-être oublié cette partie... c'est celle la qui vide l'équipement équipé... les slots inventory...




Code PHP:

    for(<= NUM_INVENTORY_SLOTS i++){
        
item GetItemInSlot(i,cible);
        if(
contenant != OBJECT_INVALID){
            
copiItem CreateItemOnObject(GetTag(item), contenant);
            
SetPlotFlag(copiItemGetPlotFlag(item));
            
SetIdentified(copiItemGetIdentified(item));
        }
        
DestroyObject(item);
    } 
J'espère que ça va t'aider...
Cassin
Si je comprend bien Cassin tu veux vider l'inventaire du PC lors d'une conversation avec un personnage...

et bien si c'est ça voici ce que tu doi mettre

Code PHP:



void main
()
{
    
object oPC GetLastSpeaker();
    if (
GetIsPC(oPC))// mesure de précaution, pour être sur que 
    //c'est un pc est qu'il n'y a pas de bug
    
viderInventaire(oPC);
}

//viderInventaire() n'est pas un script en
//soi mais plutôt une fonction que tu peux mettre dans un 
//fichier et tu fais un #include de ce fichier... 
Est-ce plus clair ?
__________________
Florynth ... bientôt un monde sera miens...


Des fois je me demande ce que je ferais sans ce forum...

Enfin voilà quoi, ça marche !

Merci !
__________________
"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
jolie script et trés utilisé sur de nombreux modules...

Mais j'en aurrai une utilisation bien différente...

Question pot de colle

j'aimerai par exemple que les armes soient simplement retiré de mon inventaire a l'entréé d'une auberge et restitué à la sortie. comment on fait?
Disons quie ça fait longtemps... je suis content de savoir que bien des gens se serve de ce script... avoir plus de temps à moins j,en ferrais des bien intéressant...

Je te fais pas le script car j'ai pas le temps... mais je te dit quoi faire...

tu modifie mon script pour faire un test si c'est une arme avant de l'enlever donc tu l'appel ensuite viderArme (que c'est original)

ensuite dans le onenter tu l'execute sur tout les pc (ou autre, ça marche aussi) et tu met l'équipement dans un coffre barrer ou cahcer dans une pièce que personne n'a accès...

ensuite quand tu quitte la zone tu remet l'inventaire tout simplement..

j'oubliais... tu dois mettre une variable pour se reppeler a qui appartient l'arme... pour pas le donner à n'importe qui...

j'espère que ça peut t'aider...
__________________
Florynth ... bientôt un monde sera miens...
Il y a un petit problème dans ce script
Si le Personnage a 99 flèches il n'y en aura plus qu'un dans le contenant... pareil pour les parchemins et les potions...

[Edit :]

oubli corrigé :
Code PHP:

//Vide l'inventaire de la cible et la met dans le contenant
//Si pas de contenant specifier, detruit tout simplement

void viderInventaire(object cibleobject contenant )
{
    
int i;
    
object item;
    
object copiItem;
    for(
<= NUM_INVENTORY_SLOTS i++){
        
item GetItemInSlot(i,cible);
        if(
contenant != OBJECT_INVALID){
            
copiItem CreateItemOnObject(GetTag(item), contenantGetItemStackSize(item));
            
SetPlotFlag(copiItemGetPlotFlag(item));
            
SetIdentified(copiItemGetIdentified(item));
        }
        
DestroyObject(item);
    }
    while((
item GetNextItemInInventory(cible)) != OBJECT_INVALID){
        if(
contenant != OBJECT_INVALID){
            
copiItem CreateItemOnObject(GetTag(item), contenantGetItemStackSize(item));
            
SetPlotFlag(copiItemGetPlotFlag(item));
            
SetIdentified(copiItemGetIdentified(item));
        }
        
DestroyObject(item);
    }

Il manquais le : GetItemStackSize(item) là :
Citation :
copiItem = CreateItemOnObject(GetTag(item), contenant, GetItemStackSize(item));
[Edit :]

Ah oui et j'ai un problème avec ce script sur un de mes persos... je comprends ! Ca marche nickel pour les autres mais pas celui-là. Je me demandais si cela ne pouvais pas venir du fait qu'il a plein d'objets persos (faits sur mesure avec Aurora) sur lui
Une idée ?
Pb avec les sac magiques
Ce script est intéressant et j'ai l'intention de l'utiliser , mais il pose tout de même un problème. Si le PC possède des sacs magiques, les objets de ces derniers sont séparés du sac à l'exécution du script.

Remarque importante : les pages d'inventaire des coffres sont limités à 25.

Sachant cela, si l'on vide l'inventaire d'un PC dans un coffre via ce script, et que le nombres d'objets (y compris ceux contenus dans les sacs magiques) du PC, dépasse la capacité du coffre destinataire, ceux-ci sont perdus.

Ma question : comment faire pour que le contenu des sacs magiques reste dans les sacs lors du vidage de l'inventaire ?

PS : Je débute dans la création de modules et de scripts
Rebonjour à tous,

Bon j'ai trouvé une solution à mon problème de contenus des sacs magiques.

Voici ma solution basée sur les scripts de TynriL et Florinyh que j'ai modifié :

Code PHP:

//Vide l'inventaire de la cible et la met dans le contenant
//Si pas de contenant specifier, detruit tout simplement
//
//A mettre dans un #include "of_videinventair"
//oInvSource : contenant source (créatures, coffres, ....)
//oInvDest : contenant destination (créatures, coffres, ....) ATTENTION : Destruction de l'objet d'inventaire si oInvDest=OBJECT_INVALID
void ViderInventaire(object oInvSourceobject oInvDest=OBJECT_INVALID );
 
void ViderInventaire(object oInvSourceobject oInvDest=OBJECT_INVALID )
{
    
int i;
    
object item;
    
object copiItem;
 
    
//Déséquipe la source
    
for(<= NUM_INVENTORY_SLOTS i++)
    {
        
item GetItemInSlot(i,oInvSource);
        if(
oInvDest != OBJECT_INVALIDAssignCommand(oInvDest,ActionTakeItem(item,oInvSource));
            else 
DestroyObject(item); //détruit l'objet si la destination=OBJECT_INVALID
    
}
 
    
//Vide l'inventaire de la source (conserve le contenu des sacs magiques)
    
while((item GetNextItemInInventory(oInvSource)) != OBJECT_INVALID)
    {
        if(
oInvDest != OBJECT_INVALIDAssignCommand(oInvDest,ActionTakeItem(item,oInvSource));
            else 
DestroyObject(item); //détruit l'objet si la destination=OBJECT_INVALID
    
}

Vider sélectivement l'inventaire
Voici un script qui permet de vider une partie ou tout l'inventaire d'une créature.

J'en profite également pour corriger un petit bug commun à tous les scripts ci-dessus : il manque GetFirstItemInInventory(...) ce qui a le fâcheux effet la perte d'un objet.

Je me suis aperçu de ce bug en utilisant l'un des scripts ci-dessus pour vider l'inventaire d'un PNJ vers le mien : connaissant l'inventaire du PNJ, j'étais surpris qu'il manquait toujours un objet lorsque que je lui demandait de me donner son inventaire.

Code PHP:

//////////////////////////
//  Vider l'inventaire  //
//////////////////////////
// ENTREE : oSource : Contenant source (créature, plaçable, ...) qui possède un inventaire a vider
//          oDestination (défaut = OBJECT_INALID) : Contenant destination (qui va recevoir les objets de oSource : créature, plaçable, ...)  qui possède un inventaire
//          iDetruire (défaut = FALSE) : Si TRUE et si oDestination=OBJECT_INVALID, les objets de oSource seront détruits
//          iMode (0 - 7, défaut = 1) : Le mode de prise en charge d'inventaire
//
//          (Défaut : Dépose l'inventaire au sol, conserve les objets portés et l'or)
//
//            | Or| Vêtements portés | Sac à dos
//        ----+---+------------------+----------
//          0 | . |        .         |     .    (ne fait rien)
//          1 | . |        .         |     O    Inventaire (défaut)
//          2 | . |        O         |     .    Objets portés
//          3 | . |        O         |     O    Inventaire, Objets portés
// iMode =  4 | O |        .         |     .    Or
//          5 | O |        .         |     O    Or, Inventaire
//          6 | O |        O         |     .    Or, Objets portés
//          7 | O |        O         |     O    Prend tout en charge : Or, Inventaire, Objets portés
//
// . = NON, O = OUI
//
// Remarque : Si oDestination est valide, iDetruire sera FALSE automatiquement (même s'il est mis à TRUE dans les paramêtres)
//            Si oDestination=OBJECT_INVALID et iDetruire=FALSE : les objets seront déposés au sol (sauf si oSource n'est pas une créature, dans ce cas il ne se passera rien)
//
void ViderInventaire(object oSourceobject oDestination=OBJECT_INVALIDint iDetruire=FALSEint iMode=1)
{
  if (
iMode<=0) return; //Pas besoin de continuer, retour au script appelant
  
if (iMode>7iMode=7//Imposer la valeur max en cas de dépassement
  
int iInvVetiDonneOriInvSaciCptiOr;
  
object oItemoObject;
  switch (
iMode//Definir le mode de gestion selon la valeur de iMode
    
{
    case 
: {iDonneOr=FALSEiInvVet=FALSEiInvSac=FALSE; break;} //Ne fait rien
    
case : {iDonneOr=FALSEiInvVet=FALSEiInvSac=TRUE;  break;} //Inventaire
    
case : {iDonneOr=FALSEiInvVet=TRUE;  iInvSac=FALSE; break;} //Objets portés
    
case : {iDonneOr=FALSEiInvVet=TRUE;  iInvSac=TRUE;  break;} //Inventaire, Objets portés
    
case : {iDonneOr=TRUE;  iInvVet=FALSEiInvSac=FALSE; break;} //Or,
    
case : {iDonneOr=TRUE;  iInvVet=FALSEiInvSac=TRUE;  break;} //Or, Inventaire
    
case : {iDonneOr=TRUE;  iInvVet=TRUE;  iInvSac=FALSE; break;} //Or, Objets portés
    
case : {iDonneOr=TRUE;  iInvVet=TRUE;  iInvSac=TRUE;  break;} //Or, Inventaire, Objets portés
    
default: {iDonneOr=FALSEiInvVet=FALSEiInvSac=TRUE;  break;} //Inventaire
    
}
  if (
oDestination!=OBJECT_INVALIDiDetruire=FALSE//Evite une copie d'objet au sol et dans le contenant destination (si ce dernier est valide)
  //Prend l'or de la source
  
if (iDonneOr==TRUE)
    {
     
iOr=GetGold(oSource); //Regarde la quantité d'or possédé par oSource
     
if (iDetruireTakeGoldFromCreature(iOroSource); //Retire tout l'or possédé par oSource
     
if (oDestination!=OBJECT_INVALIDAssignCommand(oDestinationTakeGoldFromCreature(iOr ,oSource)); //Place l'or dans le contenant destination
       
else if ((iOr>0) && (GetObjectType(oSource)==OBJECT_TYPE_CREATURE))
        {
         
oObject=CreateObject(OBJECT_TYPE_ITEM"NW_IT_GOLD001"GetLocation(oSource)); //Création d'un sac d'or au sol
         
SetItemStackSize(oObjectiOr); //Met l'or de oSource dans le sac d'or
        
}
    }
  
//Retire les vêtements portés (armure, casque, cape, ...)
  
if (iInvVet==TRUE)
    {
     for(
iCpt=0iCpt<=NUM_INVENTORY_SLOTSiCpt++)
      {
       
oItem=GetItemInSlot(iCptoSource);
       if (
iDetruireDestroyObject(oItem); //Destruction de l'objet
       
if (oDestination!=OBJECT_INVALIDAssignCommand(oDestinationActionTakeItem(oItemoSource)); //Dépot dans un contenant
         
else if (GetObjectType(oSource)==OBJECT_TYPE_CREATUREAssignCommand(oSourceActionPutDownItem(oItem)); //Dépot au sol
      
}
    }
  
//Vide l'inventaire de la source (conserve le contenu des sacs magiques)
  
if (iInvSac==TRUE)
    {
     
oItem=GetFirstItemInInventory(oSource);
     while (
GetIsObjectValid(oItem)==TRUE)
      {
       if (
iDetruireDestroyObject(oItem); //Destruction de l'objet
       
if (oDestination!=OBJECT_INVALIDAssignCommand(oDestinationActionTakeItem(oItemoSource)); //Dépot dans un contenant
         
else if (GetObjectType(oSource)==OBJECT_TYPE_CREATUREAssignCommand(oSourceActionPutDownItem(oItem)); //Dépot au sol
       
oItem=GetNextItemInInventory(oSource); //Objet suivant
      
}
    }

Répondre

Connectés sur ce fil

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