6 Commits

11 changed files with 144 additions and 98 deletions
+21 -3
View File
@@ -1,5 +1,23 @@
Diagnostics: Diagnostics:
Suppress: ["-Wmicrosoft-enum-forward-reference", "-Wc++11-narrowing", "-Wc++2b-extensions", "-Wmicrosoft-cast"] Suppress:
- "-Wmicrosoft-enum-forward-reference"
- "-Wc++11-narrowing"
- "-Wc++2b-extensions"
- "-Wmicrosoft-cast"
- "-Wcxx20_deducing_this"
- "-Wundefined_internal_type"
- "-Wincomplete_member_access"
- "-Wsizeof_alignof_incomplete_or_sizeless_type"
- "-Wexplicit_spec_non_template"
- "-Wovl_no_viable_function_in_init"
CompileFlags: CompileFlags:
Add: ["-ferror-limit=0", "-D__FUNCTION__=\"dummy\"", "-D_CRT_USE_BUILTIN_OFFSETOF", "-std=c++23"] Add:
Remove: ["/Yu_HeaderOutputPredefine.h", "/FI_HeaderOutputPredefine.h"] - "-Xclang"
- "-triple=x86_64-windows-msvc"
- "-ferror-limit=0"
- '-D__FUNCTION__="dummy"'
- "-Dnsel_CONFIG_SELECT_EXPECTED=nsel_EXPECTED_NONSTD"
- "-Xclang"
- "-std=c++23"
Remove:
- "-std"
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "${modName}", "name": "${modName}",
"entry": "${modFile}", "entry": "${modFile}",
"type": "native", "type": "native",
"version": "0.13.3", "version": "0.13.4",
"author": "GroupMountain", "author": "GroupMountain",
"description": "Clean Entities", "description": "Clean Entities",
"dependencies": [ "dependencies": [
+13 -8
View File
@@ -1,4 +1,5 @@
#include "Cleaner.h" #include "Cleaner.h"
#include "mc/world/actor/provider/SynchedActorDataAccess.h"
namespace Cleaner { namespace Cleaner {
@@ -15,9 +16,11 @@ bool isMatch(std::string& A, std::string& B) {
return (A == B); return (A == B);
} }
bool shouldIgnore(GMLIB_Actor* ac) { bool isTrust(Actor* ac) { return SynchedActorDataAccess::getActorFlag(ac->getEntityContext(), ::ActorFlags::Trusting); }
if (ac->isMob() || ac->isItemActor()) {
if (ac->isTame() || ac->isTrusting() || ac->getNameTag() != "" || ac->hasTag("cleaner:ignore")) { bool shouldIgnore(gmlib::world::actor::GMActor* ac) {
if (ac->hasCategory(::ActorCategory::Mob) || ac->hasCategory(::ActorCategory::Item)) {
if (ac->isTame() || isTrust(ac) || ac->getNameTag() != "" || ac->hasTag("cleaner:ignore")) {
return true; return true;
} }
} }
@@ -27,7 +30,7 @@ bool shouldIgnore(GMLIB_Actor* ac) {
bool ShouldClean(Actor* actor) { bool ShouldClean(Actor* actor) {
// Players // Players
auto& config = Cleaner::Entry::getInstance().getConfig(); auto& config = Cleaner::Entry::getInstance().getConfig();
auto en = (GMLIB_Actor*)actor; auto en = (gmlib::world::actor::GMActor*)actor;
if (en->isPlayer() || shouldIgnore(en)) { if (en->isPlayer() || shouldIgnore(en)) {
return false; return false;
} }
@@ -38,7 +41,7 @@ bool ShouldClean(Actor* actor) {
} }
} }
// Items // Items
if (en->isItemActor()) { if (en->hasCategory(::ActorCategory::Item)) {
if (config.CleanItem.Enabled) { if (config.CleanItem.Enabled) {
auto itac = (ItemActor*)en; auto itac = (ItemActor*)en;
if (itac->age() <= config.CleanItem.ExistTicks) { if (itac->age() <= config.CleanItem.ExistTicks) {
@@ -56,7 +59,7 @@ bool ShouldClean(Actor* actor) {
return false; return false;
} }
// Mobs // Mobs
else if (en->isMob()) { else if (en->hasCategory(::ActorCategory::Mob)) {
if (config.CleanMobs.Enabled) { if (config.CleanMobs.Enabled) {
auto blacklist = config.CleanMobs.BlackList; auto blacklist = config.CleanMobs.BlackList;
for (auto& key : blacklist) { for (auto& key : blacklist) {
@@ -94,8 +97,9 @@ bool ShouldClean(Actor* actor) {
} }
int ExecuteClean() { int ExecuteClean() {
auto level = ll::service::getLevel();
int clean_count = 0; int clean_count = 0;
auto all_entities = GMLIB_Level::getLevel()->getRuntimeActorList(); auto all_entities = level->getRuntimeActorList();
for (auto entity : all_entities) { for (auto entity : all_entities) {
if (ShouldClean(entity)) { if (ShouldClean(entity)) {
entity->despawn(); entity->despawn();
@@ -106,8 +110,9 @@ int ExecuteClean() {
} }
int CountEntities() { int CountEntities() {
auto level = ll::service::getLevel();
int clean_count = 0; int clean_count = 0;
auto all_entities = GMLIB_Level::getLevel()->getRuntimeActorList(); auto all_entities = level->getRuntimeActorList();
for (auto* entity : all_entities) { for (auto* entity : all_entities) {
if (ShouldClean(entity)) { if (ShouldClean(entity)) {
clean_count++; clean_count++;
+13 -11
View File
@@ -10,11 +10,11 @@ static std::shared_ptr<bool> mCleanTaskTPS = std::make_shared<bool>(false);
bool auto_clean_triggerred = false; bool auto_clean_triggerred = false;
void CleanTask() { void CleanTask() {
auto& config = Cleaner::Entry::getInstance().getConfig(); auto& config = Cleaner::Entry::getInstance().getConfig();
auto time = config.Basic.Notice1; auto time = config.Basic.Notice1;
auto announce_time = config.Basic.Notice2; auto announce_time = config.Basic.Notice2;
auto time_1 = std::chrono::seconds::duration(time); std::chrono::seconds time_1(time);
auto time_2 = std::chrono::seconds::duration(time - announce_time); std::chrono::seconds time_2(time - announce_time);
if (config.Basic.ConsoleLog) { if (config.Basic.ConsoleLog) {
ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info( ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info(
tr("cleaner.output.count1", {S(time_1.count())}) tr("cleaner.output.count1", {S(time_1.count())})
@@ -59,7 +59,7 @@ void CleanTask() {
} }
void AutoCleanTask(int seconds) { void AutoCleanTask(int seconds) {
auto time = std::chrono::seconds::duration(seconds); std::chrono::seconds time(seconds);
*mAutoCleanTask = true; *mAutoCleanTask = true;
ll::coro::keepThis([time]() -> ll::coro::CoroTask<> { ll::coro::keepThis([time]() -> ll::coro::CoroTask<> {
while (true) { while (true) {
@@ -72,7 +72,7 @@ void AutoCleanTask(int seconds) {
} }
void CleanTaskCount(int max_entities) { void CleanTaskCount(int max_entities) {
auto& config = Cleaner::Entry::getInstance().getConfig(); auto& config = Cleaner::Entry::getInstance().getConfig();
*mCleanTaskCount = true; *mCleanTaskCount = true;
ll::coro::keepThis([max_entities, &config]() -> ll::coro::CoroTask<> { ll::coro::keepThis([max_entities, &config]() -> ll::coro::CoroTask<> {
while (true) { while (true) {
@@ -83,7 +83,9 @@ void CleanTaskCount(int max_entities) {
if (count >= max_entities) { if (count >= max_entities) {
auto_clean_triggerred = true; auto_clean_triggerred = true;
if (config.Basic.ConsoleLog) { if (config.Basic.ConsoleLog) {
ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn(
tr("cleaner.output.triggerAutoCleanCount", {S(count)})
);
} }
if (config.Basic.SendBroadcast) { if (config.Basic.SendBroadcast) {
Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)}));
@@ -100,16 +102,16 @@ void CleanTaskCount(int max_entities) {
} }
void CleanTaskTPS(float min_tps) { void CleanTaskTPS(float min_tps) {
auto& config = Cleaner::Entry::getInstance().getConfig(); auto& config = Cleaner::Entry::getInstance().getConfig();
*mCleanTaskTPS = true; *mCleanTaskTPS = true;
ll::coro::keepThis([min_tps, &config]() -> ll::coro::CoroTask<> { ll::coro::keepThis([min_tps, &config]() -> ll::coro::CoroTask<> {
while (true) { while (true) {
co_await 10s; co_await 10s;
if (*mCleanTaskTPS == false) co_return; if (*mCleanTaskTPS == false) co_return;
if (auto_clean_triggerred == false) { if (auto_clean_triggerred == false) {
if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { if (gmlib::world::GMLevel::getInstance()->getServerAverageTps() <= min_tps) {
auto_clean_triggerred = true; auto_clean_triggerred = true;
auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps()); auto mspt = S(gmlib::world::GMLevel::getInstance()->getServerAverageTps());
if (config.Basic.ConsoleLog) { if (config.Basic.ConsoleLog) {
ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn( ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn(
tr("cleaner.output.triggerAutoCleanTps", {mspt}) tr("cleaner.output.triggerAutoCleanTps", {mspt})
+23 -28
View File
@@ -1,44 +1,39 @@
#include "Cleaner.h" #include "Cleaner.h"
namespace Cleaner { namespace Cleaner {
void setShouldIgnore(gmlib::world::actor::GMActor* ac) { ac->addTag("cleaner:ignore"); }
void setShouldIgnore(GMLIB_Actor* ac) { ac->addTag("cleaner:ignore"); }
void ListenEvents() { void ListenEvents() {
auto& eventBus = ll::event::EventBus::getInstance(); auto& eventBus = ll::event::EventBus::getInstance();
auto& config = Cleaner::Entry::getInstance().getConfig(); auto& config = Cleaner::Entry::getInstance().getConfig();
// ItemSpawnEvent // ItemSpawnEvent
eventBus.emplaceListener<GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent>( eventBus.emplaceListener<ila::mc::SpawnItemActorAfterEvent>([&config](ila::mc::SpawnItemActorAfterEvent& event) {
[&config](GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent& event) { auto& item = event.itemActor();
auto& item = event.getItemActor(); if (event.spawner()) {
if (event.getSpawner().has_value()) { auto pl = (gmlib::world::actor::GMPlayer*)event.spawner();
auto pl = (GMLIB_Player*)event.getSpawner().as_ptr(); if (pl->isPlayer() && !pl->isAlive()) { // Death Drop
if (pl->isPlayer() && !pl->isAlive()) { // Death Drop auto ac = (gmlib::world::actor::GMActor*)&item;
auto ac = (GMLIB_Actor*)&item; setShouldIgnore(ac);
setShouldIgnore(ac); return;
}
}
if (config.ItemDespawn.Enabled) {
item->lifeTime() = config.ItemDespawn.DespawnTime;
auto list = config.ItemDespawn.WhiteList;
auto type = item->item().getTypeName();
for (auto& key : list) {
if (isMatch(type, key)) {
return; return;
} }
} }
if (config.ItemDespawn.Enabled) { item->lifeTime() = config.ItemDespawn.DespawnTime;
item.lifeTime() = config.ItemDespawn.DespawnTime;
auto list = config.ItemDespawn.WhiteList;
auto type = item.item().getTypeName();
for (auto& key : list) {
if (isMatch(type, key)) {
return;
}
}
item.lifeTime() = config.ItemDespawn.DespawnTime;
}
} }
); });
// MobTakeItemEvent // MobTakeItemEvent
eventBus.emplaceListener<GMLIB::Event::EntityEvent::MobPickupItemAfterEvent>( eventBus.emplaceListener<ila::mc::ActorPickupItemAfterEvent>([](ila::mc::ActorPickupItemAfterEvent& event) {
[](GMLIB::Event::EntityEvent::MobPickupItemAfterEvent& event) { auto mob = (gmlib::world::actor::GMActor*)&event.self();
auto mob = (GMLIB_Actor*)&event.self(); setShouldIgnore(mob);
setShouldIgnore(mob); });
}
);
} }
} // namespace Cleaner } // namespace Cleaner
+2 -2
View File
@@ -3,11 +3,11 @@
namespace Helper { namespace Helper {
void broadcastMessage(std::string_view msg) { void broadcastMessage(std::string_view msg) {
GMLIB_Level::getInstance()->broadcast(tr("cleaner.info.prefix") + std::string(msg)); gmlib::world::GMLevel::getInstance()->broadcast(tr("cleaner.info.prefix") + std::string(msg));
} }
void broadcastToast(std::string_view msg) { void broadcastToast(std::string_view msg) {
GMLIB_Level::getInstance()->broadcastToast(tr("cleaner.info.prefix"), msg); gmlib::world::GMLevel::getInstance()->broadcastToast(tr("cleaner.info.prefix"), msg);
} }
} // namespace Helper } // namespace Helper
+5 -1
View File
@@ -1,7 +1,11 @@
#pragma once #pragma once
// IWYU pragma: begin_exports
#include "Mod.h" #include "Mod.h"
#include <include_all.h> #include "gmlib/include_lib.h"
#include "gmlib/include_ll.h"
#include "ila/include_all.h"
#include <regex> #include <regex>
// IWYU pragma: end_exports
#define S(x) std::to_string(x) #define S(x) std::to_string(x)
+4 -4
View File
@@ -16,9 +16,9 @@ bool Entry::enable() {
mConfig.emplace(); mConfig.emplace();
ll::config::loadConfig(*mConfig, getSelf().getConfigDir() / "config.json"); ll::config::loadConfig(*mConfig, getSelf().getConfigDir() / "config.json");
saveConfig(); saveConfig();
I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "en_US", en_US); gmlib::locale::I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "en_US", en_US);
I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "zh_CN", zh_CN); gmlib::locale::I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "zh_CN", zh_CN);
I18nAPI::loadLanguagesFromDirectory(getSelf().getLangDir()); gmlib::locale::I18nAPI::loadLanguagesFromDirectory(getSelf().getLangDir());
Cleaner::ListenEvents(); Cleaner::ListenEvents();
RegisterCommands(); RegisterCommands();
Cleaner::loadCleaner(); Cleaner::loadCleaner();
@@ -43,5 +43,5 @@ void Entry::saveConfig() { ll::config::saveConfig(*mConfig, getSelf().getConfigD
LL_REGISTER_MOD(Cleaner::Entry, Cleaner::Entry::getInstance()); LL_REGISTER_MOD(Cleaner::Entry, Cleaner::Entry::getInstance());
std::string tr(std::string const& key, std::vector<std::string> const& params) { std::string tr(std::string const& key, std::vector<std::string> const& params) {
return I18nAPI::get(key, params, Cleaner::Entry::getInstance().getConfig().language); return gmlib::locale::I18nAPI::get(key, params);
} }
+14 -15
View File
@@ -15,10 +15,8 @@ void RegCleanerCommand() {
tr("cleaner.command.cleaner"), tr("cleaner.command.cleaner"),
CommandPermissionLevel::GameDirectors CommandPermissionLevel::GameDirectors
); );
cmd.overload<CleanerParam>() cmd.overload<CleanerParam>().required("despawn").required("entity").execute(
.required("despawn") [&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) {
.required("entity")
.execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) {
auto ens = param.entity.results(origin); auto ens = param.entity.results(origin);
if (ens.empty()) { if (ens.empty()) {
return output.error(tr("cleaner.command.error.noTarget")); return output.error(tr("cleaner.command.error.noTarget"));
@@ -27,10 +25,10 @@ void RegCleanerCommand() {
en->despawn(); en->despawn();
} }
return output.success(tr("cleaner.command.despawnSuccess", {S(ens.size())})); return output.success(tr("cleaner.command.despawnSuccess", {S(ens.size())}));
}); }
cmd.overload<CleanerParam>() );
.required("action") cmd.overload<CleanerParam>().required("action").execute(
.execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { [&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) {
switch (param.action) { switch (param.action) {
case CleanerParam::Action::clean: { case CleanerParam::Action::clean: {
Cleaner::CleanTask(); Cleaner::CleanTask();
@@ -46,15 +44,15 @@ void RegCleanerCommand() {
return output.success(tr("cleaner.command.clean.output")); return output.success(tr("cleaner.command.clean.output"));
} }
case CleanerParam::Action::tps: { case CleanerParam::Action::tps: {
return output.success(tr( return output.success(
"cleaner.command.tps.output", tr("cleaner.command.tps.output",
{S(GMLIB_Level::getLevel()->getServerCurrentTps()), {S(gmlib::world::GMLevel::getInstance()->getServerCurrentTps()),
S(GMLIB_Level::getLevel()->getServerAverageTps())} S(gmlib::world::GMLevel::getInstance()->getServerAverageTps())})
)); );
} }
case CleanerParam::Action::mspt: { case CleanerParam::Action::mspt: {
return output.success( return output.success(
tr("cleaner.command.mspt.output", {S(GMLIB_Level::getLevel()->getServerMspt())}) tr("cleaner.command.mspt.output", {S(gmlib::world::GMLevel::getInstance()->getServerMspt())})
); );
} }
case CleanerParam::Action::reload: { case CleanerParam::Action::reload: {
@@ -62,7 +60,8 @@ void RegCleanerCommand() {
return output.success(tr("cleaner.output.reload")); return output.success(tr("cleaner.output.reload"));
} }
} }
}); }
);
cmd.overload<CleanerParam>() cmd.overload<CleanerParam>()
.required("despawntime") .required("despawntime")
.required("ticks") .required("ticks")
+44 -24
View File
@@ -1,28 +1,48 @@
{ {
"format_version": 2, "format_version": 3,
"tooth": "github.com/GroupMountain/Cleaner", "format_uuid": "289f771f-2c9a-4d73-9f3f-8492495a924d",
"version": "0.13.3", "tooth": "github.com/GroupMountain/Cleaner",
"info": { "version": "0.13.4",
"name": "Cleaner", "info": {
"description": "A Powerful Entities Cleaning up Mod for BDS", "name": "Cleaner",
"author": "GroupMountain", "description": "A Powerful Entities Cleaning up Mod for BDS",
"source": "github.com/GroupMountain/Cleaner", "tags": ["levilamina", "cleaner", "gmlib"],
"tags": [ "avatar_url": ""
"levilamina", },
"cleaner", "variants": [
"gmlib" {
] "label": "",
}, "platform": "win-x64",
"asset_url": "https://github.com/GroupMountain/Cleaner/releases/download/v0.13.3/Cleaner-windows-x64.zip", "dependencies": {
"dependencies": { "github.com/GroupMountain/GMLIB": ">= 1.0.0"
"github.com/GroupMountain/GMLIB": ">=1.0.0-rc.3" },
}, "assets": [
"files": { {
"place": [ "type": "zip",
"urls": [
"https://github.com/GroupMountain/Cleaner/releases/download/v0.13.4/Cleaner-windows-x64.zip"
],
"placements": [
{ {
"src": "Cleaner/*", "type": "dir",
"dest": "mods/Cleaner" "src": "Cleaner/",
"dest": "mods/Cleaner"
} }
] ]
}
],
"preserve_files": [],
"remove_files": [],
"scripts": {
"pre_install": [],
"install": [],
"post_install": [],
"pre_pack": [],
"post_pack": [],
"pre_uninstall": [],
"uninstall": [],
"post_uninstall": []
}
} }
} ]
}
+4 -1
View File
@@ -2,6 +2,7 @@ add_rules("mode.debug", "mode.release", "mode.releasedbg")
add_repositories("liteldev-repo https://github.com/LiteLDev/xmake-repo.git") add_repositories("liteldev-repo https://github.com/LiteLDev/xmake-repo.git")
add_repositories("groupmountain-repo https://github.com/GroupMountain/xmake-repo.git") add_repositories("groupmountain-repo https://github.com/GroupMountain/xmake-repo.git")
add_repositories("miracleforest https://github.com/MiracleForest/xmake-repo")
if not has_config("vs_runtime") then if not has_config("vs_runtime") then
set_runtimes("MD") set_runtimes("MD")
@@ -11,6 +12,7 @@ end
add_requires("levilamina") add_requires("levilamina")
add_requires("levibuildscript") add_requires("levibuildscript")
add_requires("gmlib") add_requires("gmlib")
add_requires("ilistenattentively")
target("Cleaner") -- Change this to your mod name. target("Cleaner") -- Change this to your mod name.
add_cxflags( add_cxflags(
@@ -25,7 +27,8 @@ target("Cleaner") -- Change this to your mod name.
) )
add_packages( add_packages(
"levilamina", "levilamina",
"gmlib" "gmlib",
"ilistenattentively"
) )
add_defines( add_defines(
"NOMINMAX", "NOMINMAX",