diff --git a/utils/sql/git/optional/2021_11_28_pot_pick_locks_book.sql b/utils/sql/git/optional/2021_11_28_pot_pick_locks_book.sql new file mode 100644 index 000000000..f7c2c55e3 --- /dev/null +++ b/utils/sql/git/optional/2021_11_28_pot_pick_locks_book.sql @@ -0,0 +1 @@ +UPDATE doors SET lockpick=1 WHERE doorid=46 AND zone="potranquility"; diff --git a/zone/client.cpp b/zone/client.cpp index 3e56614f0..5e293dd0e 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -154,6 +154,7 @@ Client::Client(EQStreamInterface* ieqs) TaskPeriodic_Timer(RuleI(TaskSystem, PeriodicCheckTimer) * 1000), charm_update_timer(6000), rest_timer(1), + pick_lock_timer(1000), charm_class_attacks_timer(3000), charm_cast_timer(3500), qglobal_purge_timer(30000), diff --git a/zone/client.h b/zone/client.h index cd58da895..a39ae4341 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1528,6 +1528,7 @@ public: void UpdateMercLevel(); void CheckMercSuspendTimer(); Timer* GetMercTimer() { return &merc_timer; }; + Timer* GetPickLockTimer() { return &pick_lock_timer; }; const char* GetRacePlural(Client* client); const char* GetClassPlural(Client* client); @@ -1869,6 +1870,7 @@ private: Timer consent_throttle_timer; Timer dynamiczone_removal_timer; Timer task_request_timer; + Timer pick_lock_timer; Timer heroforge_wearchange_timer; diff --git a/zone/doors.cpp b/zone/doors.cpp index 35eb92d5c..ef785b8d7 100644 --- a/zone/doors.cpp +++ b/zone/doors.cpp @@ -288,8 +288,11 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { /** * Key required + * If using a lock_pick_item leave messaging to that code below */ - sender->Message(Chat::LightBlue, "This is locked..."); + if (lock_pick_item == nullptr && !IsDoorOpen()) { + sender->Message(Chat::LightBlue, "This is locked..."); + } /** * GM can always open locks @@ -335,19 +338,30 @@ void Doors::HandleClick(Client* sender, uint8 trigger) { */ else if (lock_pick_item != nullptr) { if (sender->GetSkill(EQ::skills::SkillPickLock)) { + Timer* pick_lock_timer = sender->GetPickLockTimer(); if (lock_pick_item->GetItem()->ItemType == EQ::item::ItemTypeLockPick) { + if (!pick_lock_timer->Check()) { + // Stop full scale mad spamming + safe_delete(outapp); + return; + } + float player_pick_lock_skill = sender->GetSkill(EQ::skills::SkillPickLock); - sender->CheckIncreaseSkill(EQ::skills::SkillPickLock, nullptr, 1); LogSkills("Client has lockpicks: skill=[{}]", player_pick_lock_skill); if (GetLockpick() <= player_pick_lock_skill) { + + // Stop full scale spamming + pick_lock_timer->Start(1000, true); + if (!IsDoorOpen()) { + sender->CheckIncreaseSkill(EQ::skills::SkillPickLock, nullptr, 1); move_door_packet->action = static_cast(invert_state == 0 ? OPEN_DOOR : OPEN_INVDOOR); + sender->MessageString(Chat::LightBlue, DOORS_SUCCESSFUL_PICK); } else { move_door_packet->action = static_cast(invert_state == 0 ? CLOSE_DOOR : CLOSE_INVDOOR); } - sender->MessageString(Chat::LightBlue, DOORS_SUCCESSFUL_PICK); } else { sender->MessageString(Chat::LightBlue, DOORS_INSUFFICIENT_SKILL); safe_delete(outapp);