diff --git a/src/MeoAssistant/AbstractTask.cpp b/src/MeoAssistant/AbstractTask.cpp index c45bdbc874..ffc776c941 100644 --- a/src/MeoAssistant/AbstractTask.cpp +++ b/src/MeoAssistant/AbstractTask.cpp @@ -25,7 +25,7 @@ AbstractTask::AbstractTask(AsstCallback callback, void* callback_arg, std::strin bool asst::AbstractTask::run() { callback(AsstMsg::SubTaskStart, basic_info()); - for (m_cur_retry = 0; m_cur_retry < m_retry_times; ++m_cur_retry) { + for (m_cur_retry = 0; m_cur_retry <= m_retry_times; ++m_cur_retry) { if (_run()) { callback(AsstMsg::SubTaskCompleted, basic_info()); return true; @@ -116,13 +116,14 @@ bool asst::AbstractTask::need_exit() const void asst::AbstractTask::callback(AsstMsg msg, const json::value& detail) { for (TaskPluginPtr plugin : m_plugins) { - plugin->set_plugin_exit_flag(m_exit_flag); + plugin->set_exit_flag(m_exit_flag); + plugin->set_task_ptr(this); if (!plugin->verify(msg, detail)) { continue; } - plugin->run(this); + plugin->run(); if (plugin->block()) { break; diff --git a/src/MeoAssistant/AbstractTask.h b/src/MeoAssistant/AbstractTask.h index b0b0c0091b..f218d3b01c 100644 --- a/src/MeoAssistant/AbstractTask.h +++ b/src/MeoAssistant/AbstractTask.h @@ -34,12 +34,14 @@ namespace asst AbstractTask& set_retry_times(int times) noexcept; template - AbstractTask& regiseter_plugin() + std::shared_ptr regiseter_plugin() { static_assert(std::is_base_of::value, - "Plugin must inherit AbstractTaskPlugin as public"); - m_plugins.emplace(std::make_shared(m_callback, m_callback_arg, m_task_chain)); - return *this; + "Plugin must inherit AbstractTaskPlugin"); + + auto plugin = std::make_shared(m_callback, m_callback_arg, m_task_chain); + m_plugins.emplace(plugin); + return plugin; } void clear_plugin() noexcept; diff --git a/src/MeoAssistant/AbstractTaskPlugin.cpp b/src/MeoAssistant/AbstractTaskPlugin.cpp index e63f5f679d..6677579f34 100644 --- a/src/MeoAssistant/AbstractTaskPlugin.cpp +++ b/src/MeoAssistant/AbstractTaskPlugin.cpp @@ -20,7 +20,12 @@ void asst::AbstractTaskPlugin::set_block(bool block) m_block = block; } -void asst::AbstractTaskPlugin::set_plugin_exit_flag(bool* exit_flag) noexcept +void asst::AbstractTaskPlugin::set_task_ptr(asst::AbstractTask* ptr) { - AbstractTask::set_exit_flag(exit_flag); + m_task_ptr = ptr; +} + +bool asst::AbstractTaskPlugin::operator<(const asst::AbstractTaskPlugin& rhs) const +{ + return priority() < rhs.priority(); } diff --git a/src/MeoAssistant/AbstractTaskPlugin.h b/src/MeoAssistant/AbstractTaskPlugin.h index d079fce197..2cb2c62e88 100644 --- a/src/MeoAssistant/AbstractTaskPlugin.h +++ b/src/MeoAssistant/AbstractTaskPlugin.h @@ -7,7 +7,7 @@ namespace asst { - class AbstractTaskPlugin : protected AbstractTask + class AbstractTaskPlugin : public AbstractTask { public: using AbstractTask::AbstractTask; @@ -18,19 +18,15 @@ namespace asst void set_priority(int priority); void set_block(bool block); + virtual void set_task_ptr(AbstractTask* ptr); virtual bool verify(AsstMsg msg, const json::value& details) const = 0; - virtual bool run(AbstractTask* ptr) = 0; - bool operator<(const AbstractTaskPlugin& rhs) const - { - return priority() < rhs.priority(); - } - void set_plugin_exit_flag(bool* exit_flag) noexcept; + bool operator<(const AbstractTaskPlugin& rhs) const; protected: - virtual bool _run() override { return false; } + AbstractTask* m_task_ptr = nullptr; int m_priority = 0; bool m_block = false; }; diff --git a/src/MeoAssistant/Assistant.cpp b/src/MeoAssistant/Assistant.cpp index 65dfa9c0a8..5293121d6e 100644 --- a/src/MeoAssistant/Assistant.cpp +++ b/src/MeoAssistant/Assistant.cpp @@ -211,8 +211,8 @@ bool asst::Assistant::append_fight(const std::string& stage, int mecidine, int s .set_times_limit("MedicineConfirm", mecidine) .set_times_limit("StoneConfirm", stone) .set_times_limit("StartButton1", times) - .set_times_limit("StartButton2", times) - .regiseter_plugin(); + .set_times_limit("StartButton2", times); + fight_task_ptr->regiseter_plugin(); std::unique_lock lock(m_mutex); diff --git a/src/MeoAssistant/StageDropsTaskPlugin.cpp b/src/MeoAssistant/StageDropsTaskPlugin.cpp index f03b69b8b7..b39608a5e1 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.cpp +++ b/src/MeoAssistant/StageDropsTaskPlugin.cpp @@ -27,11 +27,15 @@ bool asst::StageDropsTaskPlugin::verify(AsstMsg msg, const json::value& details) } } -bool asst::StageDropsTaskPlugin::run(AbstractTask* ptr) +void asst::StageDropsTaskPlugin::set_task_ptr(AbstractTask* ptr) { - ProcessTask* cast_ptr = dynamic_cast(ptr); + AbstractTaskPlugin::set_task_ptr(ptr); + m_cast_ptr = dynamic_cast(ptr); +} - set_startbutton_delay(cast_ptr); +bool asst::StageDropsTaskPlugin::_run() +{ + set_startbutton_delay(); recognize_drops(); if (need_exit()) { @@ -92,7 +96,7 @@ void asst::StageDropsTaskPlugin::drop_info_callback() callback(AsstMsg::SubTaskExtraInfo, info); } -void asst::StageDropsTaskPlugin::set_startbutton_delay(ProcessTask* ptr) +void asst::StageDropsTaskPlugin::set_startbutton_delay() { if (!m_startbutton_delay_setted) { int64_t start_times = Status.get("LastStartButton2"); @@ -101,7 +105,7 @@ void asst::StageDropsTaskPlugin::set_startbutton_delay(ProcessTask* ptr) int64_t duration = time(nullptr) - start_times; int elapsed = Task.get("EndOfAction")->pre_delay + Task.get("PRTS")->rear_delay; int64_t delay = duration * 1000 - elapsed; - ptr->set_rear_delay("StartButton2", static_cast(delay)); + m_cast_ptr->set_rear_delay("StartButton2", static_cast(delay)); } } } diff --git a/src/MeoAssistant/StageDropsTaskPlugin.h b/src/MeoAssistant/StageDropsTaskPlugin.h index ecd4e1ec11..b4d56a2b4f 100644 --- a/src/MeoAssistant/StageDropsTaskPlugin.h +++ b/src/MeoAssistant/StageDropsTaskPlugin.h @@ -17,17 +17,20 @@ namespace asst virtual ~StageDropsTaskPlugin() = default; virtual bool verify(AsstMsg msg, const json::value& details) const override; - virtual bool run(AbstractTask* ptr) override; + virtual void set_task_ptr(AbstractTask* ptr) override; private: + virtual bool _run() override; + void recognize_drops(); void drop_info_callback(); - void set_startbutton_delay(ProcessTask* ptr); + void set_startbutton_delay(); void upload_to_penguin(); std::unordered_map m_drop_stats; json::value m_cur_drops; bool m_startbutton_delay_setted = false; std::vector> m_upload_pending; + ProcessTask* m_cast_ptr = nullptr; }; }