13 — Debugging¶
🇬🇧 English | 🇺🇦 Українська
Everything in this chapter is provided by the InventorySystemDebug module. It
works as soon as the plugin is enabled and is completely disabled in Shipping
builds.
The inspector¶
An overlay panel with the live state of the local player's inventory and equipment.
InvOverlay
Or from code — to bind it to a key:
UISInventoryDebugLibrary::ToggleInventoryDebugOverlay(PlayerController);
What it shows¶
Header — the owning actor, the net mode, and whether this side has authority. The mode is colour-coded: green — the authoritative side, yellow — a client.
This is the most useful thing to see right away: most confusing networked inventory behaviour comes from looking at a client and expecting authoritative results.
Summary — occupied slots and weight with bars that change colour from green to yellow to red as they fill.
Contents — one row per occupied slot:
| Row element | What it means |
|---|---|
| blue number | the real slot index, including gaps |
name and x5 / 20 |
how many in the stack and how many fit |
| grey line | the item's fragments: Stackable, Durability |
| purple UNIQUE badge | the item has its own values — which is why it doesn't stack |
| values next to it | the values themselves: Durability 42 |
Equipment — one row per slot in AvailableSlots, including empty ones.
An empty slot is information too.
Buttons — Sort, Compact, Clear.
What questions it answers¶
| Question | Where the answer is |
|---|---|
| "Why don't these two items merge?" | the UNIQUE badge and the values next to it |
| "Why did the item land in slot 7?" | slot indices are shown literally |
| "Why won't it equip?" | the fragment list (is there an Equippable) and the character's slot list |
| "Does the client see the same thing?" | the net-mode badge in the header |
| "Why won't it fit?" | the slot and weight bars |
Notes¶
- The game doesn't pause — the state changes while you look at it.
- Updates itself — on events plus a slow timer.
- Needs no asset — the widget tree is built in C++.
- Never opens in Shipping, whoever calls it.
The most useful way to use it: open the inspector on the server and on the client at the same time (
Play As Client, 2 players) and compare. A discrepancy between them is almost always the root of the problem.
Console commands¶
Available automatically on any CheatManager. They work on a client too:
commands that change state forward themselves to the server, and commands that
show state run there and send the report back.
Inventory¶
| Command | Effect |
|---|---|
InvOverlay |
open / close the inspector |
InvItems [name part] |
list the item types in the project |
InvGive <name part> [count] |
give yourself an item |
InvRemove <name part> [count] |
take an item away from yourself |
InvClear |
clear the inventory |
InvFill [count] |
fill with random items |
InvList |
show the contents |
InvUse <slot> |
use an item |
InvSort |
sort by name |
InvCompact |
merge partial stacks |
InvWeight |
show weight against the limit |
Equipment¶
| Command | Effect |
|---|---|
EquipList |
show what's worn, including empty slots |
EquipSlot <inventory slot> |
equip the item from that slot |
EquipRemove <slot tag> |
unequip a slot |
EquipClearAll |
unequip everything |
Item search is by name part, case-insensitive: InvGive sword finds
DA_IronSword. An exact asset-name match takes priority, so an unambiguous
query isn't hijacked by a longer name.
Start with InvItems — it shows which items exist in the project at all,
and how to name them in the other commands.
Verbose log¶
Log LogInventorySystem Verbose
Prints every add, remove and move with slot indices and stack sizes. Usually that's enough to see why an item went somewhere else.
Turn it on permanently: Project Settings → Game → Inventory System → Verbose Logging.
What to look for in the log:
| Line | Means |
|---|---|
Add refused ('X'): ... |
the item was refused, and why |
AddItem 'X' x5 -> remainder 2 |
not everything fit |
Added [Slot 3] X x5 |
what actually landed and where |
requires authority |
you called a server method on a client |
Item validation¶
In dev builds the plugin validates every ISItemDefinition at world startup and
writes problems to the log: empty names, duplicate fragments, an Equippable
with no slot, contradictory loot-table bounds.
Turn it off: Project Settings → Game → Inventory System → Validate Items On Startup.
The same checks run in the editor on asset save — problems show right on the asset.
Automated tests¶
Tools → Session Frontend → Automation, filter InventorySystem.
Or from the command line:
UnrealEditor-Cmd Project.uproject \
-ExecCmds="Automation RunTests InventorySystem.; Quit" \
-unattended -nullrhi
Groups: InventorySystem.Inventory, .Equipment, .Loot, .Persistence,
.ItemDefinition, .ItemInstance, .DebugOverlay.
The "why isn't it working" checklist¶
Work top to bottom — the questions are ordered by frequency.
An item won't add.
1. InvList — was the inventory found at all? If "you have no inventory", the
component isn't on the actor.
2. Subscribe to OnAddRejected — it carries a ready reason.
3. InvWeight — is it hitting the weight limit?
4. Check AllowedItemTags / BlockedItemTags on the component.
Items won't stack.
1. Open the inspector: is there a UNIQUE badge? Then the item has its own
values — that's the reason.
2. Is there a Stackable fragment? Without it the stack max is 1.
An item won't equip.
1. Inspector: is Equippable in the fragment list?
2. EquipList: does the character have the slot in AvailableSlots?
3. The slot in the fragment and the slot in the component must be the same
tag.
Works in the editor, not on a client.
1. Are you relying on the Try* return value? On a client it means "sent".
2. Are you accessing the chest directly? Go through the player's inventory —
09 — Multiplayer.
3. Open the inspector on both sides and compare.
The UI doesn't update. 1. Subscribed to events, or polling every frame? 2. Did the subscription happen after the component appeared? On a client it can arrive later than the widget.
Tags aren't found.
1. Check the spelling — tags are case-sensitive.
2. Add your own tags to your project's own Config/Tags/*.ini, not the
plugin's file: a plugin update would overwrite it.
Where to next¶
- Get to grips with the network: 09 — Multiplayer
- Short answers to common questions: 14 — FAQ