NWNWiki
Advertisement
NWNWiki
3,718
pages

This destroy item with highest value script destroys the most valuable item in a player character's inventory. It can be adapted to look through other inventories as well (creature, placeable, or item).

This script is suitable for use in a conversation.


/* **************************************************************************
 * Destroys the most valuable item in a PC's inventory.
 * For use in a conversation script.
 * ************************************************************************** */

// Returns the most valuable item in an creature's inventory (including slots).
// For stacked items, this considers only one item in the stack.
object GetMostValuable(object oTarget);
// Get the gold piece value of a single item, even if stacked.
int GetGoldPieceValueSingle(object oItem);
// Destroys an item. Only one item, even if it is stacked.
void DestroyItem(object oItem);


void main()
{
    object oPC = GetPCSpeaker();  // This is the line to change to use this in other events.

    DestroyItem(GetMostValuable(oPC));
}

// Returns the most valuable item in an creature's inventory (including slots).
// For stacked items, this considers only one item in the stack.
object GetMostValuable(object oTarget)
{
    object oHighestValue = OBJECT_INVALID;
    int nHighestValue = -1; // So we can find items whose value is zero.
    int nSlot;

    // Loop through main inventory.
    object oItem = GetFirstItemInInventory(oTarget);
    while ( oItem != OBJECT_INVALID ) {
        int nValue = GetGoldPieceValueSingle(oItem);
        // Is this item the most valuable seen so far?
        if ( nValue > nHighestValue ) {
            oHighestValue = oItem;
            nHighestValue = nValue;
        }

        // Update the loop.
        oItem = GetNextItemInInventory(oTarget);
    }

    // Check inventory slots.
    for ( nSlot = 0; nSlot < NUM_INVENTORY_SLOTS; ++nSlot ) {
        oItem = GetItemInSlot(nSlot, oTarget);
        int nValue = GetGoldPieceValueSingle(oItem);
        // Is this item the most valuable seen so far?
        if ( nValue > nHighestValue ) {
            oHighestValue = oItem;
            nHighestValue = nValue;
        }
    }

    return oHighestValue;
}


// Get the gold piece value of a single item, even if stacked.
int GetGoldPieceValueSingle(object oItem)
{
    int nStack = GetItemStackSize(oItem);
    // Avoid division by zero.
    return (nStack == 0) ?
                GetGoldPieceValue(oItem) :
                GetGoldPieceValue(oItem) / nStack;
}


// Destroys an item. Only one item, even if it is stacked.
void DestroyItem(object oItem)
{
    int nStack = GetItemStackSize(oItem);

    if ( nStack > 1 )
        SetItemStackSize(oItem, nStack - 1);
    else
        DestroyObject(oItem);
}
Advertisement