From fbc5d045de4759041f72749c7835bf46437bc925 Mon Sep 17 00:00:00 2001 From: Paul Coene Date: Wed, 15 Dec 2021 13:26:31 -0500 Subject: [PATCH] [Doors] Add new rule enabling classic "key on cursor" for pre keyring keys (#1869) --- common/ruletypes.h | 4 ++++ zone/doors.cpp | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/common/ruletypes.h b/common/ruletypes.h index 8b60ddb71..de97a3183 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -808,6 +808,10 @@ RULE_CATEGORY(Command) RULE_BOOL(Command, DyeCommandRequiresDyes, false, "Enable this to require a Prismatic Dye (32557) each time someone uses #dye.") RULE_CATEGORY_END() +RULE_CATEGORY(Doors) +RULE_BOOL(Doors, RequireKeyOnCursor, false, "Enable this to require pre-keyring keys to be on player cursor to open doors.") +RULE_CATEGORY_END() + #undef RULE_CATEGORY #undef RULE_INT #undef RULE_REAL diff --git a/zone/doors.cpp b/zone/doors.cpp index 6b505c677..35eb92d5c 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -211,13 +211,23 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { uint32 required_key_item = GetKeyItem(); uint8 disable_add_to_key_ring = GetNoKeyring(); - uint32 player_has_key = 0; + bool player_has_key = false; uint32 player_key = 0; const EQ::ItemInstance *lock_pick_item = sender->GetInv().GetItem(EQ::invslot::slotCursor); - player_has_key = static_cast(sender->GetInv().HasItem(required_key_item, 1)); - if (player_has_key != INVALID_INDEX) { + // If classic key on cursor rule, check for it, otherwise owning it ok. + if (RuleB(Doors, RequireKeyOnCursor)) { + if (lock_pick_item != nullptr && + lock_pick_item->GetItem()->ID == required_key_item) { + player_has_key = true; + } + } + else if (sender->GetInv().HasItem(required_key_item, 1) != INVALID_INDEX) { + player_has_key = true; + } + + if (player_has_key) { player_key = required_key_item; }