JeuxOnLineForumsPlusConnectés : 258 (sites) | 465 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [Script] Vider l'inventaire d'un joueur RSS
   
Répondre
Partager Outils Rechercher
Avatar de ¤ TynriL ¤
¤ TynriL ¤
Bagnard
 
Avatar de ¤ TynriL ¤
 

[Script] Vider l'inventaire d'un joueur

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 http://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
Lien direct vers le message - Vieux
Avatar de ¤ TynriL ¤
¤ TynriL ¤
Bagnard
 
Avatar de ¤ TynriL ¤
 
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..,

Lien direct vers le message - Vieux
Avatar de Blam
Blam
Roi
 
Avatar de Blam
 
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
Lien direct vers le message - Vieux
Florynth
Roi
 
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...

http://forums.jeuxonline.info/showth...hreadid=127621
__________________
Florynth ... bientôt un monde sera miens...
Lien direct vers le message - Vieux
Avatar de Cassin
Cassin
Roi
 
Avatar de Cassin
 
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
Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
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 ?
Lien direct vers le message - Vieux
Florynth
Roi
 
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...
Lien direct vers le message - Vieux
Florynth
Roi
 
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...
Lien direct vers le message - Vieux
Avatar de Cassin
Cassin
Roi
 
Avatar de Cassin
 


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
Lien direct vers le message - Vieux
Avatar de sojkowski
sojkowski
Dauphin
 
Avatar de sojkowski
 
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?
Lien direct vers le message - Vieux
Florynth
Roi
 
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...
Lien direct vers le message - Vieux
Avatar de Frolo Xeres
Frolo Xeres
Alpha & Oméga
 
Avatar de Frolo Xeres
 
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 ?
Lien direct vers le message - Vieux
Avatar de Holgadard
Holgadard
Grand duc
 
Avatar de Holgadard
 
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
Lien direct vers le message - Vieux
Avatar de Holgadard
Holgadard
Grand duc
 
Avatar de Holgadard
 
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
    
}

Lien direct vers le message - Vieux
Avatar de Holgadard
Holgadard
Grand duc
 
Avatar de Holgadard
 
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
      
}
    }

Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > [Script] Vider l'inventaire d'un joueur
   

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 04h15.
   

© 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