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.
//////////////////////////
// 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 oSource, object oDestination=OBJECT_INVALID, int iDetruire=FALSE, int iMode=1)
{
if (iMode<=0) return; //Pas besoin de continuer, retour au script appelant
if (iMode>7) iMode=7; //Imposer la valeur max en cas de dépassement
int iInvVet, iDonneOr, iInvSac, iCpt, iOr;
object oItem, oObject;
switch (iMode) //Definir le mode de gestion selon la valeur de iMode
{
case 0 : {iDonneOr=FALSE; iInvVet=FALSE; iInvSac=FALSE; break;} //Ne fait rien
case 1 : {iDonneOr=FALSE; iInvVet=FALSE; iInvSac=TRUE; break;} //Inventaire
case 2 : {iDonneOr=FALSE; iInvVet=TRUE; iInvSac=FALSE; break;} //Objets portés
case 3 : {iDonneOr=FALSE; iInvVet=TRUE; iInvSac=TRUE; break;} //Inventaire, Objets portés
case 4 : {iDonneOr=TRUE; iInvVet=FALSE; iInvSac=FALSE; break;} //Or,
case 5 : {iDonneOr=TRUE; iInvVet=FALSE; iInvSac=TRUE; break;} //Or, Inventaire
case 6 : {iDonneOr=TRUE; iInvVet=TRUE; iInvSac=FALSE; break;} //Or, Objets portés
case 7 : {iDonneOr=TRUE; iInvVet=TRUE; iInvSac=TRUE; break;} //Or, Inventaire, Objets portés
default: {iDonneOr=FALSE; iInvVet=FALSE; iInvSac=TRUE; break;} //Inventaire
}
if (oDestination!=OBJECT_INVALID) iDetruire=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 (iDetruire) TakeGoldFromCreature(iOr, oSource); //Retire tout l'or possédé par oSource
if (oDestination!=OBJECT_INVALID) AssignCommand(oDestination, TakeGoldFromCreature(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(oObject, iOr); //Met l'or de oSource dans le sac d'or
}
}
//Retire les vêtements portés (armure, casque, cape, ...)
if (iInvVet==TRUE)
{
for(iCpt=0; iCpt<=NUM_INVENTORY_SLOTS; iCpt++)
{
oItem=GetItemInSlot(iCpt, oSource);
if (iDetruire) DestroyObject(oItem); //Destruction de l'objet
if (oDestination!=OBJECT_INVALID) AssignCommand(oDestination, ActionTakeItem(oItem, oSource)); //Dépot dans un contenant
else if (GetObjectType(oSource)==OBJECT_TYPE_CREATURE) AssignCommand(oSource, ActionPutDownItem(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 (iDetruire) DestroyObject(oItem); //Destruction de l'objet
if (oDestination!=OBJECT_INVALID) AssignCommand(oDestination, ActionTakeItem(oItem, oSource)); //Dépot dans un contenant
else if (GetObjectType(oSource)==OBJECT_TYPE_CREATURE) AssignCommand(oSource, ActionPutDownItem(oItem)); //Dépot au sol
oItem=GetNextItemInInventory(oSource); //Objet suivant
}
}
}