Adding items to the player inventory is kinda hard, so I decided to tell everyone how to do it since I know a lot of people don't know how.
These are the basics.
The functions are basically taken right from the game scripts, but I have modified them to be more simplified.
First you need to add these structures.
Note that script struct and array variables are aligned to 8 bytes.
struct sGuid
{
alignas(8) int data1;
alignas(8) int data2;
alignas(8) int data3;
alignas(8) int data4;
};
struct sSlotInfo
{
alignas(8) sGuid guid;
alignas(8) int f_1;
alignas(8) int f_2;
alignas(8) int f_3;
alignas(8) int slotId;
};
struct sItemInfo
{
alignas(8) int f_0;
alignas(8) int f_1;
alignas(8) int f_2;
alignas(8) int f_3;
alignas(8) int f_4;
alignas(8) int f_5;
alignas(8) int f_6;
};
Then you will need to add these functions:
// Creates an empty GUID instance
sGuid CreateNewGUID()
{
sGuid guid{};
return guid;
}
// Gets an item's GUID from the inventory
sGuid GetPlayerInventoryItemGUID(u32 item, sGuid guid, u32 slotId)
{
sGuid outGuid{};
INVENTORY::INVENTORY_GET_GUID_FROM_ITEMID(1, (Any*)&guid, item, slotId, (Any*)&outGuid);
return outGuid;
}
// Gets the players inventory GUID
sGuid GetPlayerInventoryGUID()
{
return GetPlayerInventoryItemGUID(MISC::GET_HASH_KEY("CHARACTER"), CreateNewGUID(), MISC::GET_HASH_KEY("SLOTID_NONE"));
}
// Gets an item's group hash (eInvItemGroup)
u32 GetItemGroup(u32 item)
{
sItemInfo info{};
if (!ITEMDATABASE::_ITEMDATABASE_IS_KEY_VALID(item, 0))
{
return 0;
}
if (!ITEMDATABASE::ITEMDATABASE_FILLOUT_ITEM_INFO(item, (Any*)&info))
{
return 0;
}
return info.f_2;
}
// Gets an item's slot info data
sSlotInfo GetItemSlotInfo(u32 item)
{
sSlotInfo slotInfo{};
slotInfo.guid = GetPlayerInventoryGUID();
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_SATCHEL");
u32 group = GetItemGroup(item);
switch (group)
{
case 0xC2286F01: // CLOTHING
if (!INVENTORY::_INVENTORY_FITS_SLOT_ID(item, MISC::GET_HASH_KEY("SLOTID_WARDROBE")))
{
slotInfo.guid = GetPlayerInventoryItemGUID(MISC::GET_HASH_KEY("WARDROBE"), slotInfo.guid, MISC::GET_HASH_KEY("SLOTID_WARDROBE"));
slotInfo.slotId = INVENTORY::_GET_DEFAULT_ITEM_SLOT_INFO(item, MISC::GET_HASH_KEY("WARDROBE"));
}
else
{
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_WARDROBE");
}
break;
case 0x95A6F147: // HORSE
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_ACTIVE_HORSE");
break;
case 0x80FB92CD: // UPGRADE
if (INVENTORY::_INVENTORY_FITS_SLOT_ID(item, MISC::GET_HASH_KEY("SLOTID_UPGRADE")))
{
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_UPGRADE");
}
break;
default:
if (INVENTORY::_INVENTORY_FITS_SLOT_ID(item, MISC::GET_HASH_KEY("SLOTID_SATCHEL")))
{
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_SATCHEL");
}
else if (INVENTORY::_INVENTORY_FITS_SLOT_ID(item, MISC::GET_HASH_KEY("SLOTID_WARDROBE")))
{
slotInfo.slotId = MISC::GET_HASH_KEY("SLOTID_WARDROBE");
}
else
{
slotInfo.slotId = INVENTORY::_GET_DEFAULT_ITEM_SLOT_INFO(item, MISC::GET_HASH_KEY("CHARACTER"));
}
break;
}
return slotInfo;
}
// Adds an item to the player inventory via GUID
bool AddItemWithGUID(u32 item, sGuid &guid, sSlotInfo &slotInfo, u32 quantity, u32 addReason)
{
if (!INVENTORY::_INVENTORY_IS_GUID_VALID((Any*)&slotInfo.guid))
{
return false;
}
if (!INVENTORY::_INVENTORY_ADD_ITEM_WITH_GUID(1, (Any*)&guid, (Any*)&slotInfo.guid, item, slotInfo.slotId, quantity, addReason))
{
return false;
}
return true;
}
// Adds an item to the player inventory via hash
// This is the main function you will be calling to add items to your inventory
bool AddItemToInventory(u32 item, u32 quantity)
{
sSlotInfo slotInfo = GetItemSlotInfo(item);
sGuid guid = GetPlayerInventoryItemGUID(item, slotInfo.guid, slotInfo.slotId);
return AddItemWithGUID(item, guid, slotInfo, quantity, MISC::GET_HASH_KEY("ADD_REASON_DEFAULT"));
}
Now to actually add an item to the player inventory, all you need to call is AddItemToInventory()
Like so:
AddItemToInventory(MISC::GET_HASH_KEY("CONSUMABLE_CORNEDBEEF_CAN"), 1);
AddItemToInventory(MISC::GET_HASH_KEY("PROVISION_TALISMAN_BUFFALO_HORN"), 1);
// etc
To remove an item from the player inventory is way easier and can be done with a single native call:
INVENTORY::_INVENTORY_REMOVE_INVENTORY_ITEM_WITH_ITEMID(1, MISC::GET_HASH_KEY("CONSUMABLE_CORNEDBEEF_CAN"), 1, MISC::GET_HASH_KEY("REMOVE_REASON_DEFAULT"));
And that's how you add/remove items from the player inventory.
Any questions, ask me and I'll try to answer them.