diff --git a/manifest.json b/manifest.json index c68da73..ab0097b 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "name": "${modName}", "entry": "${modFile}", "type": "native", - "version": "0.13.2", + "version": "0.13.3", "author": "GroupMountain", "description": "Clean Entities", "dependencies": [ diff --git a/src/Config.h b/src/Config.h index a76e511..5507bd8 100644 --- a/src/Config.h +++ b/src/Config.h @@ -1,7 +1,8 @@ #pragma once -#include +#include #include +namespace Cleaner { struct Config { int version = 2; @@ -91,3 +92,4 @@ struct Config { int Percentage = 50; } VoteClean; }; +} // namespace Cleaner \ No newline at end of file diff --git a/src/Features/CleanTask.cpp b/src/Features/CleanTask.cpp index 1935a43..9972055 100644 --- a/src/Features/CleanTask.cpp +++ b/src/Features/CleanTask.cpp @@ -1,10 +1,11 @@ #include "Cleaner.h" +#include namespace Cleaner { -static std::shared_ptr> mAutoCleanTask = nullptr; -static std::shared_ptr> mCleanTaskCount = nullptr; -static std::shared_ptr> mCleanTaskTPS = nullptr; +static std::shared_ptr mAutoCleanTask = std::make_shared(false); +static std::shared_ptr mCleanTaskCount = std::make_shared(false); +static std::shared_ptr mCleanTaskTPS = std::make_shared(false); bool auto_clean_triggerred = false; @@ -15,7 +16,9 @@ void CleanTask() { auto time_1 = std::chrono::seconds::duration(time); auto time_2 = std::chrono::seconds::duration(time - announce_time); if (config.Basic.ConsoleLog) { - logger.info(tr("cleaner.output.count1", {S(time_1.count())})); + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info( + tr("cleaner.output.count1", {S(time_1.count())}) + ); } if (config.Basic.SendBroadcast) { Helper::broadcastMessage(tr("cleaner.output.count1", {S(time_1.count())})); @@ -23,9 +26,12 @@ void CleanTask() { if (config.Basic.SendToast) { Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)})); } - Cleaner::Entry::getInstance().getScheduler().add(time_2, [announce_time, &config] { + ll::coro::keepThis([announce_time, &config, time_2]() -> ll::coro::CoroTask<> { + co_await time_2; if (config.Basic.ConsoleLog) { - logger.info(tr("cleaner.output.count2", {S(announce_time)})); + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info( + tr("cleaner.output.count2", {S(announce_time)}) + ); } if (config.Basic.SendBroadcast) { Helper::broadcastMessage(tr("cleaner.output.count2", {S(announce_time)})); @@ -33,11 +39,13 @@ void CleanTask() { if (config.Basic.SendToast) { Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)})); } - }); - Cleaner::Entry::getInstance().getScheduler().add(time_1, [&config] { + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); + ll::coro::keepThis([announce_time, &config, time_1]() -> ll::coro::CoroTask<> { + co_await time_1; auto count = ExecuteClean(); if (config.Basic.ConsoleLog) { - logger.info(tr("cleaner.output.finish", {S(count)})); + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info(tr("cleaner.output.finish", {S(count)})); } if (config.Basic.SendBroadcast) { Helper::broadcastMessage(tr("cleaner.output.finish", {S(count)})); @@ -46,70 +54,90 @@ void CleanTask() { Helper::broadcastToast(tr("cleaner.output.finish", {S(count)})); } auto_clean_triggerred = false; - }); + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); } void AutoCleanTask(int seconds) { - auto time = std::chrono::seconds::duration(seconds); - mAutoCleanTask = Cleaner::Entry::getInstance().getScheduler().add(time, [] { CleanTask(); }); + auto time = std::chrono::seconds::duration(seconds); + *mAutoCleanTask = true; + ll::coro::keepThis([time]() -> ll::coro::CoroTask<> { + while (true) { + co_await time; + if (*mAutoCleanTask == false) co_return; + CleanTask(); + } + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); } void CleanTaskCount(int max_entities) { - auto& config = Cleaner::Entry::getInstance().getConfig(); - mCleanTaskCount = Cleaner::Entry::getInstance().getScheduler().add(10s, [max_entities, &config] { - auto count = CountEntities(); - if (auto_clean_triggerred == false) { - if (count >= max_entities) { - auto_clean_triggerred = true; - if (config.Basic.ConsoleLog) { - logger.warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + auto& config = Cleaner::Entry::getInstance().getConfig(); + *mCleanTaskCount = true; + ll::coro::keepThis([max_entities, &config]() -> ll::coro::CoroTask<> { + while (true) { + co_await 10s; + if (*mCleanTaskCount == false) co_return; + auto count = CountEntities(); + if (auto_clean_triggerred == false) { + if (count >= max_entities) { + auto_clean_triggerred = true; + if (config.Basic.ConsoleLog) { + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + if (config.Basic.SendBroadcast) { + Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + if (config.Basic.SendToast) { + Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + CleanTask(); } - if (config.Basic.SendBroadcast) { - Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); - } - if (config.Basic.SendToast) { - Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); - } - CleanTask(); } } - }); + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); } void CleanTaskTPS(float min_tps) { - auto& config = Cleaner::Entry::getInstance().getConfig(); - mCleanTaskTPS = Cleaner::Entry::getInstance().getScheduler().add(10s, [min_tps, &config] { - if (auto_clean_triggerred == false) { - if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { - auto_clean_triggerred = true; - auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps()); - if (config.Basic.ConsoleLog) { - logger.warn(tr("cleaner.output.triggerAutoCleanTps", {mspt})); + auto& config = Cleaner::Entry::getInstance().getConfig(); + *mCleanTaskTPS = true; + ll::coro::keepThis([min_tps, &config]() -> ll::coro::CoroTask<> { + while (true) { + co_await 10s; + if (*mCleanTaskTPS == false) co_return; + if (auto_clean_triggerred == false) { + if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { + auto_clean_triggerred = true; + auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps()); + if (config.Basic.ConsoleLog) { + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn( + tr("cleaner.output.triggerAutoCleanTps", {mspt}) + ); + } + if (config.Basic.SendBroadcast) { + Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanTps", {mspt})); + } + if (config.Basic.SendToast) { + Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanTps", {mspt})); + } + CleanTask(); } - if (config.Basic.SendBroadcast) { - Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanTps", {mspt})); - } - if (config.Basic.SendToast) { - Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanTps", {mspt})); - } - CleanTask(); } } - }); + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); } void stopAllTasks() { if (!mCleanTaskCount) { - mCleanTaskTPS->cancel(); - Cleaner::Entry::getInstance().getScheduler().remove(mCleanTaskTPS); + *mCleanTaskTPS = false; } if (mCleanTaskCount) { - mCleanTaskCount->cancel(); - Cleaner::Entry::getInstance().getScheduler().remove(mCleanTaskCount); + *mCleanTaskCount = false; } if (mAutoCleanTask) { - mAutoCleanTask->cancel(); - Cleaner::Entry::getInstance().getScheduler().remove(mAutoCleanTask); + *mAutoCleanTask = false; } } } // namespace Cleaner diff --git a/src/Features/Cleaner.h b/src/Features/Cleaner.h index ddc9c8e..ea13f4d 100644 --- a/src/Features/Cleaner.h +++ b/src/Features/Cleaner.h @@ -1,7 +1,6 @@ #pragma once #include "Global.h" -using namespace ll::schedule; using namespace ll::chrono_literals; namespace Cleaner { diff --git a/src/Features/VoteClean.cpp b/src/Features/VoteClean.cpp index 1745f4d..3447a16 100644 --- a/src/Features/VoteClean.cpp +++ b/src/Features/VoteClean.cpp @@ -9,8 +9,6 @@ int playerCount = 0; std::unordered_map voteList; -static std::shared_ptr> mAutoCleanTask; - int getPlayerCount() { int result = 0; ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool { @@ -95,10 +93,16 @@ void voteClean(Player* pl) { Helper::broadcastToast(tr("cleaner.vote.voteMessage", {pl->getRealName()})); } sendVoteForm(pl); - auto cooldown = std::chrono::seconds::duration(config.VoteClean.Cooldown); - auto waitTime = std::chrono::seconds::duration(config.VoteClean.CheckDelay); - Cleaner::Entry::getInstance().getScheduler().add(cooldown, [] { canVote = false; }); - Cleaner::Entry::getInstance().getScheduler().add(waitTime, [] { checkVote(); }); + ll::coro::keepThis([&config]() -> ll::coro::CoroTask<> { + co_await std::chrono::seconds::duration(config.VoteClean.Cooldown); + canVote = true; + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); + ll::coro::keepThis([&config]() -> ll::coro::CoroTask<> { + co_await std::chrono::seconds::duration(config.VoteClean.CheckDelay); + checkVote(); + co_return; + }).launch(ll::thread::ServerThreadExecutor::getDefault()); } void confirmForm(Player* pl) { diff --git a/src/Global.h b/src/Global.h index 158fe7e..6a89157 100644 --- a/src/Global.h +++ b/src/Global.h @@ -5,8 +5,6 @@ #define S(x) std::to_string(x) -extern ll::Logger logger; - extern void RegisterCommands(); namespace Helper { diff --git a/src/Mod.cpp b/src/Mod.cpp index f6bf58d..f6e0e15 100644 --- a/src/Mod.cpp +++ b/src/Mod.cpp @@ -1,20 +1,19 @@ +#include "Mod.h" #include "Features/Cleaner.h" #include "Global.h" #include "Language.h" -ll::Logger logger("Cleaner"); - namespace Cleaner { -static std::unique_ptr instance; - -Entry& Entry::getInstance() { return *instance; } +Entry& Entry::getInstance() { + static Entry instance; + return instance; +} bool Entry::load() { return true; } bool Entry::enable() { mConfig.emplace(); - mScheduler.emplace(); ll::config::loadConfig(*mConfig, getSelf().getConfigDir() / "config.json"); saveConfig(); I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "en_US", en_US); @@ -23,16 +22,15 @@ bool Entry::enable() { Cleaner::ListenEvents(); RegisterCommands(); Cleaner::loadCleaner(); - logger.info("Cleaner Loaded!"); - logger.info("Author: GroupMountain"); - logger.info("Repository: https://github.com/GroupMountain/Cleaner"); + getSelf().getLogger().info("Cleaner Loaded!"); + getSelf().getLogger().info("Author: GroupMountain"); + getSelf().getLogger().info("Repository: https://github.com/GroupMountain/Cleaner"); return true; } bool Entry::disable() { mConfig.reset(); Cleaner::unloadCleaner(); - mScheduler.reset(); return true; } @@ -40,11 +38,9 @@ Config& Entry::getConfig() { return mConfig.value(); } void Entry::saveConfig() { ll::config::saveConfig(*mConfig, getSelf().getConfigDir() / "config.json"); } -ServerTimeScheduler& Entry::getScheduler() { return mScheduler.value(); } - } // namespace Cleaner -LL_REGISTER_MOD(Cleaner::Entry, Cleaner::instance); +LL_REGISTER_MOD(Cleaner::Entry, Cleaner::Entry::getInstance()); std::string tr(std::string const& key, std::vector const& params) { return I18nAPI::get(key, params, Cleaner::Entry::getInstance().getConfig().language); diff --git a/src/Mod.h b/src/Mod.h index 0b16579..d1d0941 100644 --- a/src/Mod.h +++ b/src/Mod.h @@ -2,18 +2,15 @@ #include "Config.h" #include -#include namespace Cleaner { -using namespace ll::schedule; - class Entry { public: static Entry& getInstance(); - Entry(ll::mod::NativeMod& self) : mSelf(self) {} + Entry() : mSelf(*ll::mod::NativeMod::current()) {} [[nodiscard]] ll::mod::NativeMod& getSelf() const { return mSelf; } @@ -34,12 +31,9 @@ public: void saveConfig(); - ServerTimeScheduler& getScheduler(); - private: - ll::mod::NativeMod& mSelf; - std::optional mConfig; - std::optional mScheduler; + ll::mod::NativeMod& mSelf; + std::optional mConfig; }; } // namespace Cleaner diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index 1fa6d4e..ebd7eb1 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -1,5 +1,4 @@ #include "Features/Cleaner.h" -#include "Mod.h" struct CleanerParam { enum class Despawn { despawn } despawn; @@ -19,7 +18,7 @@ void RegCleanerCommand() { cmd.overload() .required("despawn") .required("entity") - .execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { + .execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { auto ens = param.entity.results(origin); if (ens.empty()) { return output.error(tr("cleaner.command.error.noTarget")); @@ -28,15 +27,15 @@ void RegCleanerCommand() { en->despawn(); } return output.success(tr("cleaner.command.despawnSuccess", {S(ens.size())})); - }>(); + }); cmd.overload() .required("action") - .execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { + .execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { switch (param.action) { case CleanerParam::Action::clean: { Cleaner::CleanTask(); if (Cleaner::Entry::getInstance().getConfig().Basic.ConsoleLog) { - logger.info(tr("cleaner.output.opClean")); + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info(tr("cleaner.output.opClean")); } if (Cleaner::Entry::getInstance().getConfig().Basic.SendBroadcast) { Helper::broadcastMessage(tr("cleaner.output.opClean")); @@ -63,15 +62,15 @@ void RegCleanerCommand() { return output.success(tr("cleaner.output.reload")); } } - }>(); + }); cmd.overload() .required("despawntime") .required("ticks") - .execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { + .execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { Cleaner::Entry::getInstance().getConfig().ItemDespawn.DespawnTime = param.ticks; Cleaner::Entry::getInstance().saveConfig(); return output.success(tr("cleaner.command.despawntime", {S(param.ticks)})); - }>(); + }); }; void RegVoteCommand() { @@ -80,13 +79,13 @@ void RegVoteCommand() { tr("cleaner.command.voteclean"), CommandPermissionLevel::Any ); - cmd.overload().execute<[&](CommandOrigin const& origin, CommandOutput& output) { + cmd.overload().execute([&](CommandOrigin const& origin, CommandOutput& output) { if (origin.getOriginType() == CommandOriginType::Player) { auto pl = (Player*)origin.getEntity(); return VoteClean::voteCommandExecute(pl); } return output.error(tr("cleaner.command.error.playerOnly")); - }>(); + }); } void RegisterCommands() { diff --git a/tooth.json b/tooth.json index ee23511..9914695 100644 --- a/tooth.json +++ b/tooth.json @@ -1,7 +1,7 @@ { "format_version": 2, "tooth": "github.com/GroupMountain/Cleaner", - "version": "0.13.2", + "version": "0.13.3", "info": { "name": "Cleaner", "description": "A Powerful Entities Cleaning up Mod for BDS", @@ -13,9 +13,9 @@ "gmlib" ] }, - "asset_url": "https://github.com/GroupMountain/Cleaner/releases/download/v0.13.2/Cleaner-windows-x64.zip", + "asset_url": "https://github.com/GroupMountain/Cleaner/releases/download/v0.13.3/Cleaner-windows-x64.zip", "dependencies": { - "github.com/GroupMountain/GMLIB": ">=0.13.7" + "github.com/GroupMountain/GMLIB": ">=1.0.0-rc.3" }, "files": { "place": [ diff --git a/xmake.lua b/xmake.lua index 7b51aa0..3c28635 100644 --- a/xmake.lua +++ b/xmake.lua @@ -9,7 +9,8 @@ end -- Option 1: Use the latest version of LeviLamina released on GitHub. add_requires("levilamina") -add_requires("gmlib 0.13.7") +add_requires("levibuildscript") +add_requires("gmlib") target("Cleaner") -- Change this to your mod name. add_cxflags( @@ -26,9 +27,14 @@ target("Cleaner") -- Change this to your mod name. "levilamina", "gmlib" ) - add_shflags( - "/DELAYLOAD:bedrock_server.dll" + add_defines( + "NOMINMAX", + "UNICODE", + "_HAS_CXX17", + "_HAS_CXX20", + "_HAS_CXX23" ) + add_rules("@levibuildscript/linkrule") set_exceptions("none") set_kind("shared") set_languages("cxx23")