feat: deletion restrictions

Deleting an item now follows the item's DeletionRestrictions row (ItemComponent.delResIndex), as the client's LWOInventoryComponent_Common::CanRemoveFromInventory (0x00ce0d20) and CheckDeletionRestrictionIndex (0x00c94c20) do: an item the player is driving or riding can't be deleted, an operator can delete anything, and otherwise the row decides:
- LOTS_INCLUDED: only while the player has another item of any of the LOTs (the last rocket can't be deleted)
- LOTS_EXCLUDED: only while the player has other items of all of the LOTs
- ANY_RESTRICTION / ALL_RESTRICTIONS: any / all of the listed rows allow it (a row that names itself again allows it)
- ZONE: only in the listed zones
- ALWAYS_RESTRICTED: never
A missing, unrestricted or bad row (no valid ids, unknown check type) allows it. The client checks first and shows the row's failure reason; the server checks again and ignores a client's forceDeletion.

Refs issue 960

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-10-16 21:05:47 -05:00
parent fc6a7fbd52
commit 221dd36d80
11 changed files with 256 additions and 2 deletions

View File

@@ -0,0 +1,17 @@
#ifndef __EDELETIONRESTRICTIONSCHECKTYPE__H__
#define __EDELETIONRESTRICTIONSCHECKTYPE__H__
#include <cstdint>
// DeletionRestrictions.checkType, as the client's eDeletionRestrictionCheckType
enum class eDeletionRestrictionsCheckType : uint32_t {
LOTS_INCLUDED, // can delete while the player has another item of any of these LOTs
LOTS_EXCLUDED, // can delete while the player has other items of all of these LOTs
ANY_RESTRICTION, // can delete if any of these restrictions (rows) allows it
ALL_RESTRICTIONS, // can delete if all of these restrictions (rows) allow it
ZONE, // can delete only in one of these zones
ALWAYS_RESTRICTED, // can never delete
MAX
};
#endif //!__EDELETIONRESTRICTIONSCHECKTYPE__H__