Setup
This page explains how the ItemParamHandler
works — it's responsible for listening to and applying changes related to "equipment"-type parameters.
The purpose of this plugin is to manage visual appearance only, not gameplay.
So while it handles how things look (equipment, colors, materials), you must connect it to your own inventory or gameplay logic yourself.
We’ll use the specie DA_ACC_EpicHmn_Adult_Male
as a reference to walk through this system.
In your specie, you must assign the class responsible for managing item appearance.
In this example, BP_ACCItemParamHandler_Default
is a Blueprint that inherits from the C++ class UACCItemParamHandler_Default
.
This Blueprint is used to configure certain runtime behaviors:
-
UseCustomDepth: Determines whether the equipped mesh instances should have Custom Depth enabled by default.
(In the example template, it's used for animated shader outlines.) -
UseAssetsPathsInBP: Advanced use only. This is for resolving async assets in Blueprints — generally ignored, as it's handled in C++ (see dedicated section).
-
MaxColorSlots: Number of color slots available for the equipped items.
⚠️ Increasing this is not automatic — it requires updating your master materials and mask logic from scratch. Only for advanced users. -
SoftBlankHideBodyTexture: This texture is used to reset the body when removing equipment.
For example, black in the texture means "don’t hide this area." It's how the body visibility is managed when unequipping items.
Where is equipment stored?
By default, all equipment definitions are stored within each Gender asset, inside a DataTable
identified by the ID "Equip"
.
How does ItemParamHandler
work?
When the system receives an equipment parameter (via OnReceiveEquip
), it performs a sequence of operations:
- Finds the equipment data from your specie’s database.
- Applies the associated changes (mesh, colors, masks, etc.).
Here’s a simplified example of how an equipment is applied:
// Select the appropriate DataTable to load from (e.g. based on part or category)
FName DatatableId = SelectDatatableId(EquipParam);
UDataTable* EquipDataTable;
if (!CreationComponent->CurrentGender->GetValidCustomDataTable(DatatableId, EquipDataTable))
{
return FACCParamHandlerResult::MakeError(TEXT("Missing equipment DataTable for ID '%s'"), *DatatableId.ToString());
}
// Try to load the item info from the DataTable using the EquipId
if (!UACCCoreLibraryStatics::GetDataTableRowFromInt(EquipDataTable, EquipId, ItemInfo))
{
return FACCParamHandlerResult::MakeError(TEXT("No ItemInfo found in DataTable for EquipId %d"), EquipId);
}
// Register the item info into the EquipManager
ItemObject = CreationComponent->AddItemInfo(ItemInfo, EquipId);
Summary of the flow:
- Retrieve the correct DataTable containing visual equipment entries.
- Load the visual data for the specific
EquipId
. - Instantiate and register the equipment item on the character via
AddItemInfo()
.
After this step, other things like color overrides, hidden body parts, etc., are applied through additional logic.