From bef8d29170d751f75e3307e4005748de13d0c69c Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Thu, 15 Feb 2024 21:13:44 +0800 Subject: [PATCH 1/6] feat: add some config --- src/Cleaner.cpp | 23 ++++++++++++++++++++--- src/Config.h | 3 +-- src/Language.h | 2 ++ src/RegisterCommand.cpp | 8 +++++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/Cleaner.cpp b/src/Cleaner.cpp index 89bab3f..32c6af9 100644 --- a/src/Cleaner.cpp +++ b/src/Cleaner.cpp @@ -133,11 +133,28 @@ void CleanTask() { auto announce_time = Config->getValue({"Basic", "Notice2"}, 15); auto time_1 = std::chrono::seconds::duration(time); auto time_2 = std::chrono::seconds::duration(time - announce_time); - logger.info(tr("cleaner.output.count1", {S(time_1.count())})); - scheduler.add(time_2, [announce_time] { logger.info(tr("cleaner.output.count2", {S(announce_time)})); }); + if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + logger.info(tr("cleaner.output.count1", {S(time_1.count())})); + } + if (Config->getValue({"Basic", "SendBroadcast"}, true)) { + TextPacket::createRawMessage(tr("cleaner.output.count1", {S(time_1.count())})).sendToClients(); + } + scheduler.add(time_2, [announce_time] { + if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + logger.info(tr("cleaner.output.count2", {S(announce_time)})); + } + if (Config->getValue({"Basic", "SendBroadcast"}, true)) { + TextPacket::createRawMessage(tr("cleaner.output.count2", {S(announce_time)})).sendToClients(); + } + }); scheduler.add(time_1, [] { auto count = ExecuteClean(); - logger.info(tr("cleaner.output.finish", {S(count)})); + if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + logger.info(tr("cleaner.output.finish", {S(count)})); + } + if (Config->getValue({"Basic", "SendBroadcast"}, true)) { + TextPacket::createRawMessage(tr("cleaner.output.finish", {S(count)})).sendToClients(); + } auto_clean_triggerred = false; }); } diff --git a/src/Config.h b/src/Config.h index 9caae3e..5946480 100644 --- a/src/Config.h +++ b/src/Config.h @@ -8,8 +8,7 @@ inline std::string defaultConfig = R"({ "Command": "cleaner", "Notice1": 20, "Notice2": 5, - "SendBroadcast": true, - "SendToast": false + "SendBroadcast": true }, "AutoCleanCount": { "Enabled": true, diff --git a/src/Language.h b/src/Language.h index e55c331..c21188d 100644 --- a/src/Language.h +++ b/src/Language.h @@ -2,12 +2,14 @@ #include "Global.h" std::string defaultLanguage_zh_CN = R"({ + "cleaner.toast.title": "§e§lCleaner", "cleaner.command.cleaner": "Cleaner管理员命令。", "cleaner.command.despawnSuccess": "已成功清除了 %1$s 个实体", "cleaner.command.error.noTarget": "没有与选择器匹配的目标", "cleaner.command.error.playerOnly": "该命令只能由玩家执行!", "cleaner.command.tps.output": "当前服务器实时TPS %1$s §r,平均TPS %2$s", "cleaner.command.mspt.output": "当前服务器实MSPT %1$s", + "cleaner.command.clean.output": "已成功启动清理任务!", "cleaner.command.voteclean": "发起实体清理投票。", "cleaner.command.despawntime" : "已成功将物品消失时间设置为 %1$s 游戏刻", "cleaner.output.count1": "系统将在 %1$s 秒后自动清理服务器实体!", diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index 95b548d..5537d0c 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -33,7 +33,13 @@ void RegCleanerCommand() { switch (param.action) { case CleanerParam::Action::clean: { Cleaner::CleanTask(); - return output.success(tr("cleaner.output.opClean")); + if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + logger.info(tr("cleaner.output.opClean")); + } + if (Config->getValue({"Basic", "SendBroadcast"}, true)) { + TextPacket::createRawMessage(tr("cleaner.output.opClean")).sendToClients(); + } + return output.success(tr("cleaner.command.clean.output")); } case CleanerParam::Action::tps: { return output.success( From af2cbd45aa77b35780d6d2b1efbaa131e2fcb71a Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Thu, 15 Feb 2024 21:24:55 +0800 Subject: [PATCH 2/6] feat: add en_US language --- src/Initialization.cpp | 2 +- src/Language.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/Initialization.cpp b/src/Initialization.cpp index c2736ca..1334c8c 100644 --- a/src/Initialization.cpp +++ b/src/Initialization.cpp @@ -12,7 +12,7 @@ void initPlugin() { std::string langPath = "./plugins/Cleaner/language/"; std::string languageCode = Config->getValue({"Basic", "Language"}, "en_US"); Language = new GMLIB::Files::I18n::JsonI18n(langPath, languageCode); - // Language->updateOrCreateLanguage("en_US", defaultLanguage_en_US); + Language->updateOrCreateLanguage("en_US", defaultLanguage_en_US); Language->updateOrCreateLanguage("zh_CN", defaultLanguage_zh_CN); Language->loadAllLanguages(); logger.warn("language {}", languageCode); diff --git a/src/Language.h b/src/Language.h index c21188d..cb7bcb6 100644 --- a/src/Language.h +++ b/src/Language.h @@ -1,6 +1,40 @@ #pragma once #include "Global.h" +std::string defaultLanguage_en_US = R"({ + "cleaner.toast.title": "§e§lCleaner", + "cleaner.command.cleaner": "Cleaner admin command.", + "cleaner.command.despawnSuccess": "Successfully despawned %1$s entities.", + "cleaner.command.error.noTarget": "No targets matched the selector.", + "cleaner.command.error.playerOnly": "This command can only be executed by players!", + "cleaner.command.tps.output": "Current server real-time TPS %1$s §r, average TPS %2$s.", + "cleaner.command.mspt.output": "Current server MSPT %1$s.", + "cleaner.command.clean.output": "Clean task successfully initiated!", + "cleaner.command.voteclean": "Initiate entity clean vote.", + "cleaner.command.despawntime": "Despawn time for items set to %1$s game ticks.", + "cleaner.output.count1": "The system will automatically clean server entities in %1$s seconds!", + "cleaner.output.count2": "Attention! The system will automatically clean server entities in %1$s seconds!", + "cleaner.output.finish": "Cleaning complete! A total of %1$s entities have been cleaned this time.", + "cleaner.output.opClean": "Admin has enabled server entity cleaning.", + "cleaner.output.reload": "Cleaner plugin reloaded. Some configurations may require a server restart to take effect.", + "cleaner.output.triggerAutoCleanCount": "Too many server entities detected! There are %1$s cleanable entities currently on the server. Auto-clean program has been activated.", + "cleaner.output.triggerAutoCleanTps": "Low TPS detected! Server average TPS %1$s\nClean program has been initiated.", + "cleaner.vote.cooldown": "Vote cleaning cooldown...", + "cleaner.vote.cancel": "Vote canceled!", + "cleaner.vote.confirmNo": "Think again", + "cleaner.vote.confirmOk": "Initiate vote", + "cleaner.vote.confirmTubtitle": "Do you want to initiate a clean vote?", + "cleaner.vote.accept": "You have agreed to entity cleaning.", + "cleaner.vote.deny": "You have declined entity cleaning.", + "cleaner.vote.no": "Deny", + "cleaner.vote.ok": "Agree", + "cleaner.vote.Subtitle": "Do you agree to clean server entities now?", + "cleaner.vote.Timeout": "Vote has expired!", + "cleaner.vote.succeed": "Vote cleaning successful!", + "cleaner.vote.title": "Vote Cleaning", + "cleaner.vote.toastNotice": "Notification" +})"; + std::string defaultLanguage_zh_CN = R"({ "cleaner.toast.title": "§e§lCleaner", "cleaner.command.cleaner": "Cleaner管理员命令。", From 6d7b07a355ce881c9503983ba95ff2368734e6ed Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Thu, 15 Feb 2024 21:37:27 +0800 Subject: [PATCH 3/6] refactor: refactor config --- src/Cleaner.cpp | 32 ++++++++++++++++++++------------ src/Language.h | 2 +- src/RegisterCommand.cpp | 2 +- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/Cleaner.cpp b/src/Cleaner.cpp index 32c6af9..04724ec 100644 --- a/src/Cleaner.cpp +++ b/src/Cleaner.cpp @@ -10,8 +10,11 @@ using namespace ll::chrono_literals; int item_despawn_time = 3000; -ServerTimeAsyncScheduler scheduler; -bool auto_clean_triggerred = false; +ServerTimeScheduler scheduler; +bool auto_clean_triggerred = false; + +bool ConsoleLog = true; +bool Announce = true; namespace Cleaner { @@ -130,30 +133,33 @@ int CountEntities() { void CleanTask() { auto time = Config->getValue({"Basic", "Notice1"}, 20); - auto announce_time = Config->getValue({"Basic", "Notice2"}, 15); + auto announce_time = Config->getValue({"Basic", "Notice2"}, 5); auto time_1 = std::chrono::seconds::duration(time); auto time_2 = std::chrono::seconds::duration(time - announce_time); - if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + if (ConsoleLog) { logger.info(tr("cleaner.output.count1", {S(time_1.count())})); } - if (Config->getValue({"Basic", "SendBroadcast"}, true)) { - TextPacket::createRawMessage(tr("cleaner.output.count1", {S(time_1.count())})).sendToClients(); + if (Announce) { + TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.count1", {S(time_1.count())})) + .sendToClients(); } scheduler.add(time_2, [announce_time] { - if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + if (ConsoleLog) { logger.info(tr("cleaner.output.count2", {S(announce_time)})); } - if (Config->getValue({"Basic", "SendBroadcast"}, true)) { - TextPacket::createRawMessage(tr("cleaner.output.count2", {S(announce_time)})).sendToClients(); + if (Announce) { + TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.count2", {S(announce_time)})) + .sendToClients(); } }); scheduler.add(time_1, [] { auto count = ExecuteClean(); - if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + if (ConsoleLog) { logger.info(tr("cleaner.output.finish", {S(count)})); } - if (Config->getValue({"Basic", "SendBroadcast"}, true)) { - TextPacket::createRawMessage(tr("cleaner.output.finish", {S(count)})).sendToClients(); + if (Announce) { + TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.finish", {S(count)})) + .sendToClients(); } auto_clean_triggerred = false; }); @@ -235,6 +241,8 @@ void loadCleaner() { ); } item_despawn_time = Config->getValue({"ItemDespawn", "DespawnTime"}, 6000); + Announce = Config->getValue({"Basic", "SendBroadcast"}, true); + ConsoleLog = Config->getValue({"Basic", "ConsoleLog"}, true); } void unloadCleaner() { diff --git a/src/Language.h b/src/Language.h index cb7bcb6..df33c9e 100644 --- a/src/Language.h +++ b/src/Language.h @@ -2,7 +2,7 @@ #include "Global.h" std::string defaultLanguage_en_US = R"({ - "cleaner.toast.title": "§e§lCleaner", + "cleaner.info.prefix": "§e§l[Cleaner] §r", "cleaner.command.cleaner": "Cleaner admin command.", "cleaner.command.despawnSuccess": "Successfully despawned %1$s entities.", "cleaner.command.error.noTarget": "No targets matched the selector.", diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index 5537d0c..07c586f 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -37,7 +37,7 @@ void RegCleanerCommand() { logger.info(tr("cleaner.output.opClean")); } if (Config->getValue({"Basic", "SendBroadcast"}, true)) { - TextPacket::createRawMessage(tr("cleaner.output.opClean")).sendToClients(); + TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.opClean")).sendToClients(); } return output.success(tr("cleaner.command.clean.output")); } From 971cdee837703064576f0871ae2eeb3e36fa9c9f Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Thu, 15 Feb 2024 21:38:51 +0800 Subject: [PATCH 4/6] refactor: remove legacy include_all --- src/include_all.h | 7238 --------------------------------------------- 1 file changed, 7238 deletions(-) delete mode 100644 src/include_all.h diff --git a/src/include_all.h b/src/include_all.h deleted file mode 100644 index fbf34ec..0000000 --- a/src/include_all.h +++ /dev/null @@ -1,7238 +0,0 @@ -// This file included all levilamina api and mcapi. -// This file is automatically generated by GroupMountain Tool Chain. -// Do not edit by hand. - -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include From a458ec8aeadecd9714fe01000eee52b33dc7fc64 Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Fri, 16 Feb 2024 11:58:41 +0800 Subject: [PATCH 5/6] refactor: refactoring skeleton --- src/Cleaner.cpp | 254 ------------------------------------- src/Config.h | 43 ++++--- src/Features/Clean.cpp | 124 ++++++++++++++++++ src/Features/CleanTask.cpp | 108 ++++++++++++++++ src/Features/Cleaner.cpp | 36 ++++++ src/Features/Cleaner.h | 14 ++ src/Features/Events.cpp | 44 +++++++ src/Features/Helper.cpp | 14 ++ src/Features/VoteClean.cpp | 0 src/Global.h | 28 ++-- src/Initialization.cpp | 1 - src/RegisterCommand.cpp | 19 +-- 12 files changed, 391 insertions(+), 294 deletions(-) delete mode 100644 src/Cleaner.cpp create mode 100644 src/Features/Clean.cpp create mode 100644 src/Features/CleanTask.cpp create mode 100644 src/Features/Cleaner.cpp create mode 100644 src/Features/Cleaner.h create mode 100644 src/Features/Events.cpp create mode 100644 src/Features/Helper.cpp create mode 100644 src/Features/VoteClean.cpp diff --git a/src/Cleaner.cpp b/src/Cleaner.cpp deleted file mode 100644 index 04724ec..0000000 --- a/src/Cleaner.cpp +++ /dev/null @@ -1,254 +0,0 @@ -#include "Config.h" -#include "Global.h" -#include -#include -#include -#include - -using namespace ll::schedule; -using namespace ll::chrono_literals; - -int item_despawn_time = 3000; - -ServerTimeScheduler scheduler; -bool auto_clean_triggerred = false; - -bool ConsoleLog = true; -bool Announce = true; - -namespace Cleaner { - -bool isMatch(std::string& A, std::string& B) { - // 如果B是正则表达式 - if (B.find_first_of(".*+?()[]{}|^$") != std::string::npos) { - try { - std::regex regex(B); - return std::regex_match(A, regex); - } catch (...) { - return false; - } - } - return (A == B); -} - -bool shouldIgnore(GMLIB_Actor* ac) { - if (ac->isMob() || ac->isItemActor()) { - if (ac->isTame() || ac->isTrusting() || ac->getNameTag() != "") { - return true; - } - auto nbt = ac->getNbt(); - if (nbt->getByte("ShowBottom") == 1) { // End Crystal Used Only, if has this tag 1b, it is modified by cleaner. - return true; - } - } - return false; -} - -bool ShouldClean(Actor* actor) { - // Players - auto en = (GMLIB_Actor*)actor; - if (en->isPlayer() || shouldIgnore(en)) { - return false; - } - auto type = en->getTypeName(); - // Items - if (en->isItemActor()) { - if (Config->getValue({"CleanItem", "Enabled"}, false)) { - auto itac = (ItemActor*)en; - if (itac->age() <= Config->getValue({"CleanItem", "ExistTicks"}, 0)) { - return false; - } - auto itemType = itac->item().getTypeName(); - auto whitelist = Config->getValue>({"CleanItem", "Whitelist"}, {}); - for (auto& key : whitelist) { - if (isMatch(itemType, key)) { - return false; - } - } - return true; - } - return false; - } - // Mobs - else if (en->isMob()) { - if (Config->getValue({"CleanMobs", "Enabled"}, false)) { - auto blacklist = Config->getValue>({"CleanMobs", "Blacklist"}, {}); - for (auto& key : blacklist) { - if (isMatch(type, key)) { - return true; - } - } - auto whitelist = Config->getValue>({"CleanMobs", "Whitelist"}, {}); - for (auto& key : whitelist) { - if (isMatch(type, key)) { - return false; - } - } - if (Config->getValue({"CleanMobs", "CleanMonstors"}, false) - && en->hasCategory(ActorCategory::Monster)) { - return true; - } - if (Config->getValue({"CleanMobs", "CleanPeacefulMobs"}, false)) { - return true; - } - } - return false; - } - // Others - else { - if (Config->getValue({"CleanInanimate", "Enabled"}, false)) { - auto blacklist = Config->getValue>({"CleanInanimate", "Blacklist"}, {}); - for (auto& key : blacklist) { - if (isMatch(type, key)) { - return true; - } - } - } - return false; - } -} - -int ExecuteClean() { - int clean_count = 0; - auto all_entities = GMLIB_Level::getLevel()->getAllEntities(); - for (auto entity : all_entities) { - if (ShouldClean(entity)) { - entity->despawn(); - clean_count++; - } - } - return clean_count; -} - -int CountEntities() { - int clean_count = 0; - auto all_entities = GMLIB_Level::getLevel()->getAllEntities(); - for (auto entity : all_entities) { - if (ShouldClean(entity)) { - clean_count++; - } - } - return clean_count; -} - -void CleanTask() { - auto time = Config->getValue({"Basic", "Notice1"}, 20); - auto announce_time = Config->getValue({"Basic", "Notice2"}, 5); - auto time_1 = std::chrono::seconds::duration(time); - auto time_2 = std::chrono::seconds::duration(time - announce_time); - if (ConsoleLog) { - logger.info(tr("cleaner.output.count1", {S(time_1.count())})); - } - if (Announce) { - TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.count1", {S(time_1.count())})) - .sendToClients(); - } - scheduler.add(time_2, [announce_time] { - if (ConsoleLog) { - logger.info(tr("cleaner.output.count2", {S(announce_time)})); - } - if (Announce) { - TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.count2", {S(announce_time)})) - .sendToClients(); - } - }); - scheduler.add(time_1, [] { - auto count = ExecuteClean(); - if (ConsoleLog) { - logger.info(tr("cleaner.output.finish", {S(count)})); - } - if (Announce) { - TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.finish", {S(count)})) - .sendToClients(); - } - auto_clean_triggerred = false; - }); -} - -void AutoCleanTask(int seconds) { - auto time = std::chrono::seconds::duration(seconds); - mAutoCleanTask = scheduler.add(time, [] { CleanTask(); }); -} - -void CheckCleanTask(int max_entities, float min_tps) { - mCheckCleanTask = scheduler.add(10s, [max_entities, min_tps] { - auto count = CountEntities(); - if (auto_clean_triggerred == false) { - if (count >= max_entities) { - auto_clean_triggerred = true; - logger.warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); - CleanTask(); - } else if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { - auto_clean_triggerred = true; - logger.warn( - tr("cleaner.output.triggerAutoCleanCount", {S(GMLIB_Level::getLevel()->getServerAverageTps())}) - ); - CleanTask(); - } - } - }); -} - -void setShouldIgnore(GMLIB_Actor* ac) { - auto nbt = ac->getNbt(); - nbt->put("ShowBottom", ByteTag(1)); - ac->setNbt(*nbt); -} - -void ListenEvents() { - auto eventBus = &ll::event::EventBus::getInstance(); - // ItemSpawnEvent - eventBus->emplaceListener( - [](GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent& event) { - auto& item = event.getItemActor(); - auto pl = (GMLIB_Player*)event.getSpawner(); - if (pl) { - if (pl->isPlayer() && !pl->isAlive()) { // Death Drop - auto ac = (GMLIB_Actor*)&item; - setShouldIgnore(ac); - return; - } - } - item.lifeTime() = item_despawn_time; - } - ); - // MobTakeItemEvent - eventBus->emplaceListener( - [](GMLIB::Event::EntityEvent::MobPickupItemAfterEvent& event) { - // auto item = event.getItemActor().item().getTypeName(); - auto mob = (GMLIB_Actor*)&event.self(); - setShouldIgnore(mob); - } - ); -} - -void reloadCleaner() { - unloadCleaner(); - loadCleaner(); -} - -void loadCleaner() { - ListenEvents(); - RegisterCommands(); - if (Config->getValue({"ScheduleClean", "Enabled"}, false)) { - Cleaner::AutoCleanTask(Config->getValue({"ScheduleClean", "CleanInterval"}, 3000)); - } - if (Config->getValue({"AutoCleanCount", "Enabled"}, false) - || Config->getValue({"AutoCleanTPS", "Enabled"}, false)) { - Cleaner::CheckCleanTask( - Config->getValue({"AutoCleanCount", "TriggerCount"}, 900), - Config->getValue({"AutoCleanTPS", "TriggerTPS"}, 15) - ); - } - item_despawn_time = Config->getValue({"ItemDespawn", "DespawnTime"}, 6000); - Announce = Config->getValue({"Basic", "SendBroadcast"}, true); - ConsoleLog = Config->getValue({"Basic", "ConsoleLog"}, true); -} - -void unloadCleaner() { - mAutoCleanTask->cancel(); - mCheckCleanTask->cancel(); - delete Config; -} - -} // namespace Cleaner \ No newline at end of file diff --git a/src/Config.h b/src/Config.h index 5946480..e179efd 100644 --- a/src/Config.h +++ b/src/Config.h @@ -1,15 +1,20 @@ #pragma once #include "Global.h" -inline std::string defaultConfig = R"({ +std::string defaultConfig = R"({ "Basic": { "Language": "en_US", - "ConsoleLog": true, "Command": "cleaner", "Notice1": 20, "Notice2": 5, - "SendBroadcast": true + "ConsoleLog": true, + "SendBroadcast": true, + "SendToast": true }, + "IgnoreTags": [ + "ignore", + "不清理" + ], "AutoCleanCount": { "Enabled": true, "TriggerCount": 900 @@ -26,6 +31,7 @@ inline std::string defaultConfig = R"({ ] }, "CleanInanimate": { + "Enabled": true, "Blacklist": [ "minecraft:xp_orb", "minecraft:arrow", @@ -34,8 +40,7 @@ inline std::string defaultConfig = R"({ "minecraft:wither_skull", "minecraft:wither_skull_dangerous", "minecraft:dragon_fireball" - ], - "Enabled": true + ] }, "CleanItem": { "Enabled": true, @@ -65,17 +70,13 @@ inline std::string defaultConfig = R"({ ] }, "CleanMobs": { - "BlackList": [ - "minecraft:guardian", - "minecraft:zombie_pigman" - ], + "Enabled": true, "CleanMonstors": true, "CleanPeacefulMobs": false, "EnableAutoExclude": true, - "Enabled": true, - "IgnoreTags": [ - "ignore", - "不清理" + "BlackList": [ + "minecraft:guardian", + "minecraft:zombie_pigman" ], "Whitelist": [ "minecraft:ender_dragon", @@ -88,14 +89,14 @@ inline std::string defaultConfig = R"({ ] }, "ScheduleClean": { - "CleanInterval": 3600, - "Enabled": true - }, - "VoteClean": { - "CD": 120, - "Delay": 30, "Enabled": true, - "Percentage": 50, - "VoteCleanCommand": "voteclean" + "CleanInterval": 3600 + }, + "VoteClean": { + "Enabled": true, + "VoteCleanCommand": "voteclean", + "Cooldown": 120, + "CheckDelay": 30, + "Percentage": 50 } })"; \ No newline at end of file diff --git a/src/Features/Clean.cpp b/src/Features/Clean.cpp new file mode 100644 index 0000000..d524ae0 --- /dev/null +++ b/src/Features/Clean.cpp @@ -0,0 +1,124 @@ +#include "Cleaner.h" + +namespace Cleaner { + +bool isMatch(std::string& A, std::string& B) { + // 如果B是正则表达式 + if (B.find_first_of(".*+?()[]{}|^$") != std::string::npos) { + try { + std::regex regex(B); + return std::regex_match(A, regex); + } catch (...) { + return false; + } + } + return (A == B); +} + +bool shouldIgnore(GMLIB_Actor* ac) { + if (ac->isMob() || ac->isItemActor()) { + if (ac->isTame() || ac->isTrusting() || ac->getNameTag() != "") { + return true; + } + auto nbt = ac->getNbt(); + if (nbt->getByte("ShowBottom") == 1) { // End Crystal Used Only, if has this tag 1b, it is modified by cleaner. + return true; + } + } + return false; +} + +bool ShouldClean(Actor* actor) { + // Players + auto en = (GMLIB_Actor*)actor; + if (en->isPlayer() || shouldIgnore(en)) { + return false; + } + auto type = en->getTypeName(); + auto tags = Config->getValue>({"IgnoreTags"}, {}); + for (auto& tag : tags) { + if (en->hasTag(tag)) { + return false; + } + } + // Items + if (en->isItemActor()) { + if (Config->getValue({"CleanItem", "Enabled"}, false)) { + auto itac = (ItemActor*)en; + if (itac->age() <= Config->getValue({"CleanItem", "ExistTicks"}, 0)) { + return false; + } + auto itemType = itac->item().getTypeName(); + auto whitelist = Config->getValue>({"CleanItem", "Whitelist"}, {}); + for (auto& key : whitelist) { + if (isMatch(itemType, key)) { + return false; + } + } + return true; + } + return false; + } + // Mobs + else if (en->isMob()) { + if (Config->getValue({"CleanMobs", "Enabled"}, false)) { + auto blacklist = Config->getValue>({"CleanMobs", "Blacklist"}, {}); + for (auto& key : blacklist) { + if (isMatch(type, key)) { + return true; + } + } + auto whitelist = Config->getValue>({"CleanMobs", "Whitelist"}, {}); + for (auto& key : whitelist) { + if (isMatch(type, key)) { + return false; + } + } + if (Config->getValue({"CleanMobs", "CleanMonstors"}, false) + && en->hasCategory(ActorCategory::Monster)) { + return true; + } + if (Config->getValue({"CleanMobs", "CleanPeacefulMobs"}, false)) { + return true; + } + } + return false; + } + // Others + else { + if (Config->getValue({"CleanInanimate", "Enabled"}, false)) { + auto blacklist = Config->getValue>({"CleanInanimate", "Blacklist"}, {}); + for (auto& key : blacklist) { + if (isMatch(type, key)) { + return true; + } + } + } + return false; + } +} + +int ExecuteClean() { + int clean_count = 0; + auto all_entities = GMLIB_Level::getLevel()->getAllEntities(); + for (auto entity : all_entities) { + if (ShouldClean(entity)) { + entity->despawn(); + clean_count++; + } + } + return clean_count; +} + +int CountEntities() { + int clean_count = 0; + auto all_entities = GMLIB_Level::getLevel()->getAllEntities(); + for (auto entity : all_entities) { + if (ShouldClean(entity)) { + clean_count++; + } + } + return clean_count; +} + +} // namespace Cleaner diff --git a/src/Features/CleanTask.cpp b/src/Features/CleanTask.cpp new file mode 100644 index 0000000..153ba09 --- /dev/null +++ b/src/Features/CleanTask.cpp @@ -0,0 +1,108 @@ +#include "Cleaner.h" + +namespace ConfigFile { + +bool mConsoleLog = true; +bool mAnnounce = true; +bool mSendToast = true; + +} // namespace ConfigFile + + +namespace Cleaner { + +using namespace ll::schedule; +using namespace ll::chrono_literals; + +static std::shared_ptr> mAutoCleanTask; +static std::shared_ptr> mCheckCleanTask; + +ServerTimeScheduler scheduler; + +bool auto_clean_triggerred = false; + +void CleanTask() { + auto time = Config->getValue({"Basic", "Notice1"}, 20); + auto announce_time = Config->getValue({"Basic", "Notice2"}, 5); + auto time_1 = std::chrono::seconds::duration(time); + auto time_2 = std::chrono::seconds::duration(time - announce_time); + if (ConfigFile::mConsoleLog) { + logger.info(tr("cleaner.output.count1", {S(time_1.count())})); + } + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.count1", {S(time_1.count())})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)})); + } + scheduler.add(time_2, [announce_time] { + if (ConfigFile::mConsoleLog) { + logger.info(tr("cleaner.output.count2", {S(announce_time)})); + } + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.count2", {S(announce_time)})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)})); + } + }); + scheduler.add(time_1, [] { + auto count = ExecuteClean(); + if (ConfigFile::mConsoleLog) { + logger.info(tr("cleaner.output.finish", {S(count)})); + } + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.finish", {S(count)})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.finish", {S(count)})); + } + auto_clean_triggerred = false; + }); +} + +void AutoCleanTask(int seconds) { + auto time = std::chrono::seconds::duration(seconds); + mAutoCleanTask = scheduler.add(time, [] { CleanTask(); }); +} + +void CheckCleanTask(int max_entities, float min_tps) { + mCheckCleanTask = scheduler.add(10s, [max_entities, min_tps] { + auto count = CountEntities(); + if (auto_clean_triggerred == false) { + if (count >= max_entities) { + auto_clean_triggerred = true; + if (ConfigFile::mConsoleLog) { + logger.warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + } + CleanTask(); + } else if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { + auto_clean_triggerred = true; + auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps()); + if (ConfigFile::mConsoleLog) { + logger.warn(tr("cleaner.output.triggerAutoCleanCount", {mspt})); + } + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {mspt})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanCount", {mspt})); + } + CleanTask(); + } + } + }); +} + +void stopAllTasks() { + mCheckCleanTask->cancel(); + mAutoCleanTask->cancel(); +} + +} // namespace Cleaner diff --git a/src/Features/Cleaner.cpp b/src/Features/Cleaner.cpp new file mode 100644 index 0000000..3fc9f36 --- /dev/null +++ b/src/Features/Cleaner.cpp @@ -0,0 +1,36 @@ +#include "Cleaner.h" + +namespace Cleaner { + +void loadCleaner() { + ListenEvents(); + RegisterCommands(); + if (Config->getValue({"ScheduleClean", "Enabled"}, false)) { + Cleaner::AutoCleanTask(Config->getValue({"ScheduleClean", "CleanInterval"}, 3000)); + } + if (Config->getValue({"AutoCleanCount", "Enabled"}, false) + || Config->getValue({"AutoCleanTPS", "Enabled"}, false)) { + Cleaner::CheckCleanTask( + Config->getValue({"AutoCleanCount", "TriggerCount"}, 900), + Config->getValue({"AutoCleanTPS", "TriggerTPS"}, 15) + ); + } + ConfigFile::mItemDespawnTicks = Config->getValue({"ItemDespawn", "DespawnTime"}, 6000); + ConfigFile::mAnnounce = Config->getValue({"Basic", "SendBroadcast"}, true); + ConfigFile::mConsoleLog = Config->getValue({"Basic", "ConsoleLog"}, true); + ConfigFile::mSendToast = Config->getValue({"Basic", "SendToast"}, true); +} + +void unloadCleaner() { + stopAllTasks(); + delete Config; + delete Language; +} + +void reloadCleaner() { + unloadCleaner(); + initPlugin(); + loadCleaner(); +} + +} // namespace Cleaner \ No newline at end of file diff --git a/src/Features/Cleaner.h b/src/Features/Cleaner.h new file mode 100644 index 0000000..d3859f0 --- /dev/null +++ b/src/Features/Cleaner.h @@ -0,0 +1,14 @@ +#pragma once +#include "Global.h" + +namespace Cleaner { + +extern int ExecuteClean(); +extern int CountEntities(); + +extern void AutoCleanTask(int seconds); +extern void CheckCleanTask(int max_entities, float min_tps); +extern void ListenEvents(); +extern void stopAllTasks(); + +} // namespace Cleaner \ No newline at end of file diff --git a/src/Features/Events.cpp b/src/Features/Events.cpp new file mode 100644 index 0000000..be92567 --- /dev/null +++ b/src/Features/Events.cpp @@ -0,0 +1,44 @@ +#include "Cleaner.h" + +namespace ConfigFile { + +int mItemDespawnTicks = 3000; + +} // namespace ConfigFile + + +namespace Cleaner { + +void setShouldIgnore(GMLIB_Actor* ac) { + auto nbt = ac->getNbt(); + nbt->put("ShowBottom", ByteTag(1)); + ac->setNbt(*nbt); +} + +void ListenEvents() { + auto& eventBus = ll::event::EventBus::getInstance(); + // ItemSpawnEvent + eventBus.emplaceListener( + [](GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent& event) { + auto& item = event.getItemActor(); + auto pl = (GMLIB_Player*)event.getSpawner(); + if (pl) { + if (pl->isPlayer() && !pl->isAlive()) { // Death Drop + auto ac = (GMLIB_Actor*)&item; + setShouldIgnore(ac); + return; + } + } + item.lifeTime() = ConfigFile::mItemDespawnTicks; + } + ); + // MobTakeItemEvent + eventBus.emplaceListener( + [](GMLIB::Event::EntityEvent::MobPickupItemAfterEvent& event) { + auto mob = (GMLIB_Actor*)&event.self(); + setShouldIgnore(mob); + } + ); +} + +} // namespace Cleaner \ No newline at end of file diff --git a/src/Features/Helper.cpp b/src/Features/Helper.cpp new file mode 100644 index 0000000..0242b13 --- /dev/null +++ b/src/Features/Helper.cpp @@ -0,0 +1,14 @@ +#include "Global.h" + +namespace Helper { + +void broadcastMessage(std::string msg) { + TextPacket::createRawMessage(tr("cleaner.info.prefix") + msg).sendToClients(); +} + +void broadcastToast(std::string msg) { + auto pkt = ToastRequestPacket(tr("cleaner.info.prefix"), msg); + pkt.sendToClients(); +} + +} // namespace Helper \ No newline at end of file diff --git a/src/Features/VoteClean.cpp b/src/Features/VoteClean.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Global.h b/src/Global.h index 0ae0218..cd89680 100644 --- a/src/Global.h +++ b/src/Global.h @@ -1,27 +1,35 @@ #pragma once #include "Plugin.h" #include +#include #define S(x) std::to_string(x) -extern ll::Logger logger; -extern GMLIB::Files::JsonConfig* Config; +extern ll::Logger logger; + +extern GMLIB::Files::JsonConfig* Config; +extern GMLIB::Files::I18n::JsonI18n* Language; extern void RegisterCommands(); extern void initPlugin(); -extern int item_despawn_time; +namespace ConfigFile { +extern int mItemDespawnTicks; +extern bool mConsoleLog; +extern bool mAnnounce; +extern bool mSendToast; +} // namespace ConfigFile namespace Cleaner { - -static std::shared_ptr> mAutoCleanTask; -static std::shared_ptr> mCheckCleanTask; - +extern void CleanTask(); +extern void reloadCleaner(); extern void loadCleaner(); extern void unloadCleaner(); -extern void reloadCleaner(); -extern void CleanTask(); - } // namespace Cleaner +namespace Helper { +extern void broadcastMessage(std::string msg); +extern void broadcastToast(std::string msg); +} // namespace Helper + extern std::string tr(std::string key, std::vector data = {}); \ No newline at end of file diff --git a/src/Initialization.cpp b/src/Initialization.cpp index 1334c8c..8cf9199 100644 --- a/src/Initialization.cpp +++ b/src/Initialization.cpp @@ -15,7 +15,6 @@ void initPlugin() { Language->updateOrCreateLanguage("en_US", defaultLanguage_en_US); Language->updateOrCreateLanguage("zh_CN", defaultLanguage_zh_CN); Language->loadAllLanguages(); - logger.warn("language {}", languageCode); Language->chooseLanguage(languageCode); } diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index 07c586f..9a321ad 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -33,11 +33,14 @@ void RegCleanerCommand() { switch (param.action) { case CleanerParam::Action::clean: { Cleaner::CleanTask(); - if (Config->getValue({"Basic", "ConsoleLog"}, true)) { + if (ConfigFile::mConsoleLog) { logger.info(tr("cleaner.output.opClean")); } - if (Config->getValue({"Basic", "SendBroadcast"}, true)) { - TextPacket::createRawMessage(tr("cleaner.info.prefix") + tr("cleaner.output.opClean")).sendToClients(); + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.output.opClean")); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.output.opClean")); } return output.success(tr("cleaner.command.clean.output")); } @@ -61,19 +64,19 @@ void RegCleanerCommand() { .required("despawntime") .required("ticks") .execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { - item_despawn_time = param.ticks; - Config->setValue({"ItemDespawn", "DespawnTime"}, item_despawn_time); - return output.success(tr("cleaner.command.despawntime", {S(item_despawn_time)})); + ConfigFile::mItemDespawnTicks = param.ticks; + Config->setValue({"ItemDespawn", "DespawnTime"}, ConfigFile::mItemDespawnTicks); + return output.success(tr("cleaner.command.despawntime", {S(ConfigFile::mItemDespawnTicks)})); }>(); }; void RegisterCommands() { RegCleanerCommand(); - // RegVoteCommand(registry); + // RegVoteCommand(); } /* -void RegVoteCommand(CommandRegistry& registry) { +void RegVoteCommand() { auto command = DynamicCommand::createCommand(registry, "voteclean", "Clean entities", CommandPermissionLevel::Any); command->addOverload(); command->setCallback([](DynamicCommand const& cmd, From 1b1340d919d52f1fdf801ce0f4b82e6bd37b0848 Mon Sep 17 00:00:00 2001 From: Tsubasa6848 <116721335+Tsubasa6848@users.noreply.github.com> Date: Fri, 16 Feb 2024 13:44:47 +0800 Subject: [PATCH 6/6] feat: vote clean --- src/Features/CleanTask.cpp | 3 - src/Features/Cleaner.cpp | 13 ++-- src/Features/Cleaner.h | 17 ++++- src/Features/VoteClean.cpp | 138 +++++++++++++++++++++++++++++++++++++ src/Global.h | 7 -- src/Language.h | 18 +++-- src/Plugin.cpp | 3 + src/RegisterCommand.cpp | 36 +++++----- 8 files changed, 193 insertions(+), 42 deletions(-) diff --git a/src/Features/CleanTask.cpp b/src/Features/CleanTask.cpp index 153ba09..1dabec9 100644 --- a/src/Features/CleanTask.cpp +++ b/src/Features/CleanTask.cpp @@ -11,9 +11,6 @@ bool mSendToast = true; namespace Cleaner { -using namespace ll::schedule; -using namespace ll::chrono_literals; - static std::shared_ptr> mAutoCleanTask; static std::shared_ptr> mCheckCleanTask; diff --git a/src/Features/Cleaner.cpp b/src/Features/Cleaner.cpp index 3fc9f36..41b290d 100644 --- a/src/Features/Cleaner.cpp +++ b/src/Features/Cleaner.cpp @@ -3,8 +3,6 @@ namespace Cleaner { void loadCleaner() { - ListenEvents(); - RegisterCommands(); if (Config->getValue({"ScheduleClean", "Enabled"}, false)) { Cleaner::AutoCleanTask(Config->getValue({"ScheduleClean", "CleanInterval"}, 3000)); } @@ -21,15 +19,14 @@ void loadCleaner() { ConfigFile::mSendToast = Config->getValue({"Basic", "SendToast"}, true); } -void unloadCleaner() { - stopAllTasks(); - delete Config; - delete Language; -} +void unloadCleaner() { stopAllTasks(); } void reloadCleaner() { unloadCleaner(); - initPlugin(); + Config->init(); + std::string languageCode = Config->getValue({"Basic", "Language"}, "en_US"); + Language->loadAllLanguages(); + Language->chooseLanguage(languageCode); loadCleaner(); } diff --git a/src/Features/Cleaner.h b/src/Features/Cleaner.h index d3859f0..f085db5 100644 --- a/src/Features/Cleaner.h +++ b/src/Features/Cleaner.h @@ -1,8 +1,13 @@ #pragma once #include "Global.h" +using namespace ll::schedule; +using namespace ll::chrono_literals; + namespace Cleaner { +extern ServerTimeScheduler scheduler; + extern int ExecuteClean(); extern int CountEntities(); @@ -10,5 +15,15 @@ extern void AutoCleanTask(int seconds); extern void CheckCleanTask(int max_entities, float min_tps); extern void ListenEvents(); extern void stopAllTasks(); +extern void CleanTask(); +extern void reloadCleaner(); +extern void loadCleaner(); +extern void unloadCleaner(); -} // namespace Cleaner \ No newline at end of file +} // namespace Cleaner + +namespace VoteClean { + +extern void voteCommandExecute(Player* pl); + +} \ No newline at end of file diff --git a/src/Features/VoteClean.cpp b/src/Features/VoteClean.cpp index e69de29..1cb10c6 100644 --- a/src/Features/VoteClean.cpp +++ b/src/Features/VoteClean.cpp @@ -0,0 +1,138 @@ +#include "Cleaner.h" +#include "Global.h" + +namespace VoteClean { + +bool hasVote = false; +bool canVote = true; +int playerCount = 0; + +std::unordered_map voteList; + +static std::shared_ptr> mAutoCleanTask; + +int getPlayerCount() { + int result = 0; + ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool { + if (!pl.isSimulatedPlayer()) { + result++; + } + return true; + }); + return result; +} + +void sendVoteForm(Player* pl) { + auto fm = ll::form::ModalForm( + tr("cleaner.vote.title"), + tr("cleaner.vote.subtitle", {pl->getRealName()}), + tr("cleaner.vote.ok"), + tr("cleaner.vote.no") + ); + ll::service::getLevel()->forEachPlayer([&](Player& pl) -> bool { + fm.sendTo(pl, [](Player& player, ll::form::ModalForm::SelectedButton button) { + switch (button) { + case ll::form::ModalForm::SelectedButton::Upper: { + voteList[player.getUuid()] = true; + player.sendMessage(tr("cleaner.vote.accept")); + return; + } + case ll::form::ModalForm::SelectedButton::Lower: { + voteList[player.getUuid()] = false; + player.sendMessage(tr("cleaner.vote.deny")); + return; + } + default: + return; + } + }); + return true; + }); +} + +void checkVote() { + float percentage = Config->getValue({"VoteClean", "Percentage"}, 50.0f) / 100.0f; + int voteCount = 0; + for (auto& key : voteList) { + if (key.second == true) { + voteCount++; + } + } + float result = ((float)voteCount) / ((float)playerCount); + if (result >= percentage) { + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.vote.succeed")); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.vote.succeed")); + } + Cleaner::CleanTask(); + } else { + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.vote.failed")); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.vote.failed")); + } + } + hasVote = false; + playerCount = 0; +} + +void voteClean(Player* pl) { + voteList.clear(); + canVote = false; + hasVote = true; + playerCount = getPlayerCount(); + if (ConfigFile::mAnnounce) { + Helper::broadcastMessage(tr("cleaner.vote.voteMessage", {pl->getRealName()})); + } + if (ConfigFile::mSendToast) { + Helper::broadcastToast(tr("cleaner.vote.voteMessage", {pl->getRealName()})); + } + sendVoteForm(pl); + auto cooldown = std::chrono::seconds::duration(Config->getValue({"VoteClean", "Cooldown"}, 120)); + auto waitTime = std::chrono::seconds::duration(Config->getValue({"VoteClean", "CheckDelay"}, 30)); + Cleaner::scheduler.add(cooldown, [] { canVote = false; }); + Cleaner::scheduler.add(waitTime, [] { checkVote(); }); +} + +void confirmForm(Player* pl) { + auto fm = ll::form::ModalForm( + tr("cleaner.vote.title"), + tr("cleaner.vote.confirmTubtitle"), + tr("cleaner.vote.confirmOk"), + tr("cleaner.vote.confirmNo") + ); + fm.sendTo(*pl, [](Player& player, ll::form::ModalForm::SelectedButton button) { + switch (button) { + case ll::form::ModalForm::SelectedButton::Upper: { + return voteClean(&player); + } + case ll::form::ModalForm::SelectedButton::Lower: { + return player.sendMessage(tr("cleaner.vote.cancel")); + } + default: + return; + } + }); +} + +void voteCommandExecute(Player* pl) { + if (!hasVote) { + if (canVote) { + confirmForm(pl); + } else { + pl->sendMessage(tr("cleaner.vote.cooldown")); + } + } else { + if (voteList.count(pl->getUuid())) { + pl->sendMessage(tr("cleaner.vote.voted")); + } else { + voteList[pl->getUuid()] = true; + pl->sendMessage(tr("cleaner.vote.accept")); + } + } +} + +} // namespace VoteClean \ No newline at end of file diff --git a/src/Global.h b/src/Global.h index cd89680..b2e88c2 100644 --- a/src/Global.h +++ b/src/Global.h @@ -20,13 +20,6 @@ extern bool mAnnounce; extern bool mSendToast; } // namespace ConfigFile -namespace Cleaner { -extern void CleanTask(); -extern void reloadCleaner(); -extern void loadCleaner(); -extern void unloadCleaner(); -} // namespace Cleaner - namespace Helper { extern void broadcastMessage(std::string msg); extern void broadcastToast(std::string msg); diff --git a/src/Language.h b/src/Language.h index df33c9e..903c545 100644 --- a/src/Language.h +++ b/src/Language.h @@ -28,11 +28,13 @@ std::string defaultLanguage_en_US = R"({ "cleaner.vote.deny": "You have declined entity cleaning.", "cleaner.vote.no": "Deny", "cleaner.vote.ok": "Agree", - "cleaner.vote.Subtitle": "Do you agree to clean server entities now?", - "cleaner.vote.Timeout": "Vote has expired!", + "cleaner.vote.subtitle": "%1$s lunched a clean vote.\n\n Do you agree to clean server entities now?", + "cleaner.vote.timeout": "Vote has expired!", "cleaner.vote.succeed": "Vote cleaning successful!", + "cleaner.vote.failed": "Vote cleaning did not passed!", "cleaner.vote.title": "Vote Cleaning", - "cleaner.vote.toastNotice": "Notification" + "cleaner.vote.voted": "You have been voted!", + "cleaner.vote.voteMessage": "%1$s lunched a clean vote. If you agree cleaning entities but did not received a form, please type command /voteclean to vote." })"; std::string defaultLanguage_zh_CN = R"({ @@ -53,7 +55,7 @@ std::string defaultLanguage_zh_CN = R"({ "cleaner.output.reload": "已重载Cleaner插件,部分配置可能需要重启服务器才能生效。", "cleaner.output.triggerAutoCleanCount": "检测到服务器实体过多!!当前服务器存在 %1$s 个可清理实体,已启动自动清理程序。", "cleaner.output.triggerAutoCleanTps": "当前服务器TPS过低!!服务器平均TPS %1$s\n系统已启动清理程序。", - "cleaner.vote.cooldown": "投票清理冷却...", + "cleaner.vote.cooldown": "投票清理正在冷却...", "cleaner.vote.cancel": "投票已取消!", "cleaner.vote.confirmNo": "我再想想", "cleaner.vote.confirmOk": "发起投票", @@ -62,9 +64,11 @@ std::string defaultLanguage_zh_CN = R"({ "cleaner.vote.deny": "你已拒绝实体清理。", "cleaner.vote.no": "拒绝", "cleaner.vote.ok": "同意", - "cleaner.vote.Subtitle": "你是否同意现在清理服务器实体?", - "cleaner.vote.Timeout": "投票已过期!", + "cleaner.vote.subtitle": "%1$s 发起了服务器实体清理投票!\n\n你是否同意现在清理服务器实体?", + "cleaner.vote.timeout": "投票已过期!", "cleaner.vote.succeed": "投票清理成功!", + "cleaner.vote.failed": "投票清理未通过。", "cleaner.vote.title": "投票清理", - "cleaner.vote.toastNotice": "通知" + "cleaner.vote.voted": "你已经投过票了!", + "cleaner.vote.voteMessage": "%1$s 发起了服务器实体清理投票!如果同意清理但是未收到表单,请输入命令 /voteclean 投票。拒绝清理请忽略此信息。" })"; \ No newline at end of file diff --git a/src/Plugin.cpp b/src/Plugin.cpp index fe6c6dd..cba81ae 100644 --- a/src/Plugin.cpp +++ b/src/Plugin.cpp @@ -1,3 +1,4 @@ +#include "Features/Cleaner.h" #include "Global.h" ll::Logger logger("Cleaner"); @@ -10,6 +11,8 @@ Plugin::Plugin(ll::plugin::NativePlugin& self) : mSelf(self) { } bool Plugin::enable() { + Cleaner::ListenEvents(); + RegisterCommands(); Cleaner::loadCleaner(); logger.info("Cleaner Loaded!"); logger.info("Author: GroupMountain"); diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index 9a321ad..32d0fc1 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -1,3 +1,4 @@ +#include "Features/Cleaner.h" #include "Global.h" struct CleanerParam { @@ -70,21 +71,24 @@ void RegCleanerCommand() { }>(); }; -void RegisterCommands() { - RegCleanerCommand(); - // RegVoteCommand(); +void RegVoteCommand() { + auto& cmd = ll::command::CommandRegistrar::getInstance().getOrCreateCommand( + Config->getValue({"VoteClean", "VoteCleanCommand"}, "voteclean"), + tr("cleaner.command.voteclean"), + CommandPermissionLevel::Any + ); + 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 RegVoteCommand() { - auto command = DynamicCommand::createCommand(registry, "voteclean", "Clean entities", CommandPermissionLevel::Any); - command->addOverload(); - command->setCallback([](DynamicCommand const& cmd, - CommandOrigin const& origin, - CommandOutput& output, - std::unordered_map& result) { - // vote clean command - }); - DynamicCommand::setup(registry, std::move(command)); -} -*/ \ No newline at end of file +void RegisterCommands() { + RegCleanerCommand(); + if (Config->getValue({"VoteClean", "Enabled"}, false)) { + RegVoteCommand(); + } +} \ No newline at end of file