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; }