Compare commits
10 Commits
@@ -1,5 +1,5 @@
|
||||
Diagnostics:
|
||||
Suppress: ["-Wmicrosoft-enum-forward-reference", "-Wc++11-narrowing", "-Wc++2b-extensions", "-Wmicrosoft-cast"]
|
||||
CompileFlags:
|
||||
Add: ["-ferror-limit=0", "-D__FUNCTION__=\"dummy\"", "-D_CRT_USE_BUILTIN_OFFSETOF", "-std:c++latest"]
|
||||
Add: ["-ferror-limit=0", "-D__FUNCTION__=\"dummy\"", "-D_CRT_USE_BUILTIN_OFFSETOF", "-std=c++23"]
|
||||
Remove: ["/Yu_HeaderOutputPredefine.h", "/FI_HeaderOutputPredefine.h"]
|
||||
|
||||
@@ -15,7 +15,8 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: xmake-io/github-action-setup-xmake@v1
|
||||
|
||||
with:
|
||||
xmake-version: latest
|
||||
- run: |
|
||||
xmake repo -u
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: xmake-io/github-action-setup-xmake@v1
|
||||
|
||||
with:
|
||||
xmake-version: latest
|
||||
- run: |
|
||||
xmake repo -u
|
||||
|
||||
|
||||
-1
Submodule SDK-GMLIB deleted from e4f3e2a188
+1
-1
@@ -2,7 +2,7 @@
|
||||
"name": "${pluginName}",
|
||||
"entry": "${pluginFile}",
|
||||
"type": "native",
|
||||
"version": "0.12.0",
|
||||
"version": "0.13.0",
|
||||
"author": "GroupMountain",
|
||||
"description": "Clean Entities",
|
||||
"dependencies": [
|
||||
|
||||
+3
-1
@@ -3,7 +3,9 @@
|
||||
#include <vector>
|
||||
|
||||
struct Config {
|
||||
int version = 1;
|
||||
int version = 2;
|
||||
|
||||
std::string language = "zh_CN";
|
||||
|
||||
struct basic {
|
||||
std::string Command = "cleaner";
|
||||
|
||||
+15
-15
@@ -15,35 +15,35 @@ void CleanTask() {
|
||||
auto time_1 = std::chrono::seconds::duration(time);
|
||||
auto time_2 = std::chrono::seconds::duration(time - announce_time);
|
||||
if (config.Basic.ConsoleLog) {
|
||||
logger.info(I18nAPI::get("cleaner.output.count1", {S(time_1.count())}));
|
||||
logger.info(tr("cleaner.output.count1", {S(time_1.count())}));
|
||||
}
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.count1", {S(time_1.count())}));
|
||||
Helper::broadcastMessage(tr("cleaner.output.count1", {S(time_1.count())}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.count2", {S(announce_time)}));
|
||||
Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)}));
|
||||
}
|
||||
Cleaner::Entry::getInstance().getScheduler().add<DelayTask>(time_2, [announce_time, &config] {
|
||||
if (config.Basic.ConsoleLog) {
|
||||
logger.info(I18nAPI::get("cleaner.output.count2", {S(announce_time)}));
|
||||
logger.info(tr("cleaner.output.count2", {S(announce_time)}));
|
||||
}
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.count2", {S(announce_time)}));
|
||||
Helper::broadcastMessage(tr("cleaner.output.count2", {S(announce_time)}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.count2", {S(announce_time)}));
|
||||
Helper::broadcastToast(tr("cleaner.output.count2", {S(announce_time)}));
|
||||
}
|
||||
});
|
||||
Cleaner::Entry::getInstance().getScheduler().add<DelayTask>(time_1, [&config] {
|
||||
auto count = ExecuteClean();
|
||||
if (config.Basic.ConsoleLog) {
|
||||
logger.info(I18nAPI::get("cleaner.output.finish", {S(count)}));
|
||||
logger.info(tr("cleaner.output.finish", {S(count)}));
|
||||
}
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.finish", {S(count)}));
|
||||
Helper::broadcastMessage(tr("cleaner.output.finish", {S(count)}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.finish", {S(count)}));
|
||||
Helper::broadcastToast(tr("cleaner.output.finish", {S(count)}));
|
||||
}
|
||||
auto_clean_triggerred = false;
|
||||
});
|
||||
@@ -62,13 +62,13 @@ void CleanTaskCount(int max_entities) {
|
||||
if (count >= max_entities) {
|
||||
auto_clean_triggerred = true;
|
||||
if (config.Basic.ConsoleLog) {
|
||||
logger.warn(I18nAPI::get("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
logger.warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
}
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanCount", {S(count)}));
|
||||
}
|
||||
CleanTask();
|
||||
}
|
||||
@@ -84,13 +84,13 @@ void CleanTaskTPS(float min_tps) {
|
||||
auto_clean_triggerred = true;
|
||||
auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps());
|
||||
if (config.Basic.ConsoleLog) {
|
||||
logger.warn(I18nAPI::get("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
logger.warn(tr("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
}
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
Helper::broadcastToast(tr("cleaner.output.triggerAutoCleanTps", {mspt}));
|
||||
}
|
||||
CleanTask();
|
||||
}
|
||||
|
||||
@@ -2,8 +2,12 @@
|
||||
|
||||
namespace Helper {
|
||||
|
||||
void broadcastMessage(std::string_view msg) { GMLIB_Level::broadcast(I18nAPI::get("cleaner.info.prefix") + std::string(msg)); }
|
||||
void broadcastMessage(std::string_view msg) {
|
||||
GMLIB_Level::getInstance()->broadcast(tr("cleaner.info.prefix") + std::string(msg));
|
||||
}
|
||||
|
||||
void broadcastToast(std::string_view msg) { GMLIB_Level::broadcastToast(I18nAPI::get("cleaner.info.prefix"), msg); }
|
||||
void broadcastToast(std::string_view msg) {
|
||||
GMLIB_Level::getInstance()->broadcastToast(tr("cleaner.info.prefix"), msg);
|
||||
}
|
||||
|
||||
} // namespace Helper
|
||||
+20
-20
@@ -24,10 +24,10 @@ int getPlayerCount() {
|
||||
|
||||
void sendVoteForm(Player* pl) {
|
||||
auto fm = ll::form::ModalForm(
|
||||
I18nAPI::get("cleaner.vote.title"),
|
||||
I18nAPI::get("cleaner.vote.subtitle", {pl->getRealName()}),
|
||||
I18nAPI::get("cleaner.vote.ok"),
|
||||
I18nAPI::get("cleaner.vote.no")
|
||||
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::ModalFormResult result, ll::form::FormCancelReason reason) {
|
||||
@@ -35,12 +35,12 @@ void sendVoteForm(Player* pl) {
|
||||
switch (result.value()) {
|
||||
case ll::form::ModalFormSelectedButton::Upper: {
|
||||
voteList[player.getUuid()] = true;
|
||||
player.sendMessage(I18nAPI::get("cleaner.vote.accept"));
|
||||
player.sendMessage(tr("cleaner.vote.accept"));
|
||||
return;
|
||||
}
|
||||
case ll::form::ModalFormSelectedButton::Lower: {
|
||||
voteList[player.getUuid()] = false;
|
||||
player.sendMessage(I18nAPI::get("cleaner.vote.deny"));
|
||||
player.sendMessage(tr("cleaner.vote.deny"));
|
||||
return;
|
||||
}
|
||||
default:
|
||||
@@ -64,18 +64,18 @@ void checkVote() {
|
||||
float result = ((float)voteCount) / ((float)playerCount);
|
||||
if (result >= percentage) {
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.vote.succeed"));
|
||||
Helper::broadcastMessage(tr("cleaner.vote.succeed"));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.vote.succeed"));
|
||||
Helper::broadcastToast(tr("cleaner.vote.succeed"));
|
||||
}
|
||||
Cleaner::CleanTask();
|
||||
} else {
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.vote.failed"));
|
||||
Helper::broadcastMessage(tr("cleaner.vote.failed"));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.vote.failed"));
|
||||
Helper::broadcastToast(tr("cleaner.vote.failed"));
|
||||
}
|
||||
}
|
||||
hasVote = false;
|
||||
@@ -89,10 +89,10 @@ void voteClean(Player* pl) {
|
||||
hasVote = true;
|
||||
playerCount = getPlayerCount();
|
||||
if (config.Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.vote.voteMessage", {pl->getRealName()}));
|
||||
Helper::broadcastMessage(tr("cleaner.vote.voteMessage", {pl->getRealName()}));
|
||||
}
|
||||
if (config.Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.vote.voteMessage", {pl->getRealName()}));
|
||||
Helper::broadcastToast(tr("cleaner.vote.voteMessage", {pl->getRealName()}));
|
||||
}
|
||||
sendVoteForm(pl);
|
||||
auto cooldown = std::chrono::seconds::duration(config.VoteClean.Cooldown);
|
||||
@@ -103,10 +103,10 @@ void voteClean(Player* pl) {
|
||||
|
||||
void confirmForm(Player* pl) {
|
||||
auto fm = ll::form::ModalForm(
|
||||
I18nAPI::get("cleaner.vote.title"),
|
||||
I18nAPI::get("cleaner.vote.confirmTubtitle"),
|
||||
I18nAPI::get("cleaner.vote.confirmOk"),
|
||||
I18nAPI::get("cleaner.vote.confirmNo")
|
||||
tr("cleaner.vote.title"),
|
||||
tr("cleaner.vote.confirmTubtitle"),
|
||||
tr("cleaner.vote.confirmOk"),
|
||||
tr("cleaner.vote.confirmNo")
|
||||
);
|
||||
fm.sendTo(*pl, [](Player& player, ll::form::ModalFormResult result, ll::form::FormCancelReason reason) {
|
||||
if (result.has_value()) {
|
||||
@@ -115,7 +115,7 @@ void confirmForm(Player* pl) {
|
||||
return voteClean(&player);
|
||||
}
|
||||
case ll::form::ModalFormSelectedButton::Lower: {
|
||||
return player.sendMessage(I18nAPI::get("cleaner.vote.cancel"));
|
||||
return player.sendMessage(tr("cleaner.vote.cancel"));
|
||||
}
|
||||
default:
|
||||
return;
|
||||
@@ -129,14 +129,14 @@ void voteCommandExecute(Player* pl) {
|
||||
if (canVote) {
|
||||
confirmForm(pl);
|
||||
} else {
|
||||
pl->sendMessage(I18nAPI::get("cleaner.vote.cooldown"));
|
||||
pl->sendMessage(tr("cleaner.vote.cooldown"));
|
||||
}
|
||||
} else {
|
||||
if (voteList.count(pl->getUuid())) {
|
||||
pl->sendMessage(I18nAPI::get("cleaner.vote.voted"));
|
||||
pl->sendMessage(tr("cleaner.vote.voted"));
|
||||
} else {
|
||||
voteList[pl->getUuid()] = true;
|
||||
pl->sendMessage(I18nAPI::get("cleaner.vote.accept"));
|
||||
pl->sendMessage(tr("cleaner.vote.accept"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,3 +13,5 @@ namespace Helper {
|
||||
extern void broadcastMessage(std::string_view msg);
|
||||
extern void broadcastToast(std::string_view msg);
|
||||
} // namespace Helper
|
||||
|
||||
extern std::string tr(std::string const& key, std::vector<std::string> const& params = {});
|
||||
+5
-1
@@ -44,4 +44,8 @@ ServerTimeScheduler& Entry::getScheduler() { return mScheduler.value(); }
|
||||
|
||||
} // namespace Cleaner
|
||||
|
||||
LL_REGISTER_PLUGIN(Cleaner::Entry, Cleaner::instance);
|
||||
LL_REGISTER_MOD(Cleaner::Entry, Cleaner::instance);
|
||||
|
||||
std::string tr(std::string const& key, std::vector<std::string> const& params) {
|
||||
return I18nAPI::get(key, params, Cleaner::Entry::getInstance().getConfig().language);
|
||||
}
|
||||
|
||||
+4
-4
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Config.h"
|
||||
#include <ll/api/plugin/NativePlugin.h>
|
||||
#include <ll/api/mod/NativeMod.h>
|
||||
#include <ll/api/schedule/Scheduler.h>
|
||||
|
||||
namespace Cleaner {
|
||||
@@ -13,9 +13,9 @@ class Entry {
|
||||
public:
|
||||
static Entry& getInstance();
|
||||
|
||||
Entry(ll::plugin::NativePlugin& self) : mSelf(self) {}
|
||||
Entry(ll::mod::NativeMod& self) : mSelf(self) {}
|
||||
|
||||
[[nodiscard]] ll::plugin::NativePlugin& getSelf() const { return mSelf; }
|
||||
[[nodiscard]] ll::mod::NativeMod& getSelf() const { return mSelf; }
|
||||
|
||||
/// @return True if the plugin is loaded successfully.
|
||||
bool load();
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
ServerTimeScheduler& getScheduler();
|
||||
|
||||
private:
|
||||
ll::plugin::NativePlugin& mSelf;
|
||||
ll::mod::NativeMod& mSelf;
|
||||
std::optional<Config> mConfig;
|
||||
std::optional<ServerTimeScheduler> mScheduler;
|
||||
};
|
||||
|
||||
+13
-13
@@ -13,7 +13,7 @@ void RegCleanerCommand() {
|
||||
auto& config = Cleaner::Entry::getInstance().getConfig();
|
||||
auto& cmd = ll::command::CommandRegistrar::getInstance().getOrCreateCommand(
|
||||
config.Basic.Command,
|
||||
I18nAPI::get("cleaner.command.cleaner"),
|
||||
tr("cleaner.command.cleaner"),
|
||||
CommandPermissionLevel::GameDirectors
|
||||
);
|
||||
cmd.overload<CleanerParam>()
|
||||
@@ -22,12 +22,12 @@ void RegCleanerCommand() {
|
||||
.execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) {
|
||||
auto ens = param.entity.results(origin);
|
||||
if (ens.empty()) {
|
||||
return output.error(I18nAPI::get("cleaner.command.error.noTarget"));
|
||||
return output.error(tr("cleaner.command.error.noTarget"));
|
||||
}
|
||||
for (auto en : ens) {
|
||||
en->despawn();
|
||||
}
|
||||
return output.success(I18nAPI::get("cleaner.command.despawnSuccess", {S(ens.size())}));
|
||||
return output.success(tr("cleaner.command.despawnSuccess", {S(ens.size())}));
|
||||
}>();
|
||||
cmd.overload<CleanerParam>()
|
||||
.required("action")
|
||||
@@ -36,18 +36,18 @@ void RegCleanerCommand() {
|
||||
case CleanerParam::Action::clean: {
|
||||
Cleaner::CleanTask();
|
||||
if (Cleaner::Entry::getInstance().getConfig().Basic.ConsoleLog) {
|
||||
logger.info(I18nAPI::get("cleaner.output.opClean"));
|
||||
logger.info(tr("cleaner.output.opClean"));
|
||||
}
|
||||
if (Cleaner::Entry::getInstance().getConfig().Basic.SendBroadcast) {
|
||||
Helper::broadcastMessage(I18nAPI::get("cleaner.output.opClean"));
|
||||
Helper::broadcastMessage(tr("cleaner.output.opClean"));
|
||||
}
|
||||
if (Cleaner::Entry::getInstance().getConfig().Basic.SendToast) {
|
||||
Helper::broadcastToast(I18nAPI::get("cleaner.output.opClean"));
|
||||
Helper::broadcastToast(tr("cleaner.output.opClean"));
|
||||
}
|
||||
return output.success(I18nAPI::get("cleaner.command.clean.output"));
|
||||
return output.success(tr("cleaner.command.clean.output"));
|
||||
}
|
||||
case CleanerParam::Action::tps: {
|
||||
return output.success(I18nAPI::get(
|
||||
return output.success(tr(
|
||||
"cleaner.command.tps.output",
|
||||
{S(GMLIB_Level::getLevel()->getServerCurrentTps()),
|
||||
S(GMLIB_Level::getLevel()->getServerAverageTps())}
|
||||
@@ -55,12 +55,12 @@ void RegCleanerCommand() {
|
||||
}
|
||||
case CleanerParam::Action::mspt: {
|
||||
return output.success(
|
||||
I18nAPI::get("cleaner.command.mspt.output", {S(GMLIB_Level::getLevel()->getServerMspt())})
|
||||
tr("cleaner.command.mspt.output", {S(GMLIB_Level::getLevel()->getServerMspt())})
|
||||
);
|
||||
}
|
||||
case CleanerParam::Action::reload: {
|
||||
Cleaner::reloadCleaner();
|
||||
return output.success(I18nAPI::get("cleaner.output.reload"));
|
||||
return output.success(tr("cleaner.output.reload"));
|
||||
}
|
||||
}
|
||||
}>();
|
||||
@@ -70,14 +70,14 @@ void RegCleanerCommand() {
|
||||
.execute<[&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) {
|
||||
Cleaner::Entry::getInstance().getConfig().ItemDespawn.DespawnTime = param.ticks;
|
||||
Cleaner::Entry::getInstance().saveConfig();
|
||||
return output.success(I18nAPI::get("cleaner.command.despawntime", {S(param.ticks)}));
|
||||
return output.success(tr("cleaner.command.despawntime", {S(param.ticks)}));
|
||||
}>();
|
||||
};
|
||||
|
||||
void RegVoteCommand() {
|
||||
auto& cmd = ll::command::CommandRegistrar::getInstance().getOrCreateCommand(
|
||||
Cleaner::Entry::getInstance().getConfig().VoteClean.VoteCleanCommand,
|
||||
I18nAPI::get("cleaner.command.voteclean"),
|
||||
tr("cleaner.command.voteclean"),
|
||||
CommandPermissionLevel::Any
|
||||
);
|
||||
cmd.overload().execute<[&](CommandOrigin const& origin, CommandOutput& output) {
|
||||
@@ -85,7 +85,7 @@ void RegVoteCommand() {
|
||||
auto pl = (Player*)origin.getEntity();
|
||||
return VoteClean::voteCommandExecute(pl);
|
||||
}
|
||||
return output.error(I18nAPI::get("cleaner.command.error.playerOnly"));
|
||||
return output.error(tr("cleaner.command.error.playerOnly"));
|
||||
}>();
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"format_version": 2,
|
||||
"tooth": "github.com/GroupMountain/Cleaner",
|
||||
"version": "0.12.0",
|
||||
"version": "0.13.0",
|
||||
"info": {
|
||||
"name": "Cleaner",
|
||||
"description": "A Powerful Entities Cleaning up Plugin for BDS",
|
||||
@@ -13,9 +13,9 @@
|
||||
"gmlib"
|
||||
]
|
||||
},
|
||||
"asset_url": "https://github.com/GroupMountain/Cleaner/releases/download/v0.12.0/Cleaner-windows-x64.zip",
|
||||
"asset_url": "https://github.com/GroupMountain/Cleaner/releases/download/v0.13.0/Cleaner-windows-x64.zip",
|
||||
"dependencies": {
|
||||
"github.com/GroupMountain/GMLIB": ">=0.12.1"
|
||||
"github.com/GroupMountain/GMLIB": ">=0.13.0"
|
||||
},
|
||||
"files": {
|
||||
"place": [
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
add_rules("mode.debug", "mode.release", "mode.releasedbg")
|
||||
|
||||
add_repositories("liteldev-repo https://github.com/LiteLDev/xmake-repo.git")
|
||||
add_repositories("groupmountain-repo https://github.com/GroupMountain/xmake-repo.git")
|
||||
|
||||
if not has_config("vs_runtime") then
|
||||
set_runtimes("MD")
|
||||
@@ -8,6 +9,7 @@ end
|
||||
|
||||
-- Option 1: Use the latest version of LeviLamina released on GitHub.
|
||||
add_requires("levilamina")
|
||||
add_requires("gmlib")
|
||||
|
||||
target("Cleaner") -- Change this to your plugin name.
|
||||
add_cxflags(
|
||||
@@ -17,15 +19,12 @@ target("Cleaner") -- Change this to your plugin name.
|
||||
add_files(
|
||||
"src/**.cpp"
|
||||
)
|
||||
add_links(
|
||||
"SDK-GMLIB/Lib/GMLIB"
|
||||
)
|
||||
add_includedirs(
|
||||
"SDK-GMLIB",
|
||||
"src"
|
||||
)
|
||||
add_packages(
|
||||
"levilamina"
|
||||
"levilamina",
|
||||
"gmlib"
|
||||
)
|
||||
add_shflags(
|
||||
"/DELAYLOAD:bedrock_server.dll"
|
||||
|
||||
Reference in New Issue
Block a user