From 8729d7113331280ba191d48f24059e2c2594bcc5 Mon Sep 17 00:00:00 2001 From: killcerr Date: Sat, 22 Mar 2025 23:32:42 +0800 Subject: [PATCH] feat: adapt LeviLamin 1.1.1 & GMLIB 1.0.0-rc.3 --- .clangd | 24 +++++++++++++++--- src/Features/Clean.cpp | 21 ++++++++++------ src/Features/CleanTask.cpp | 24 ++++++++++-------- src/Features/Events.cpp | 51 +++++++++++++++++--------------------- src/Features/Helper.cpp | 4 +-- src/Global.h | 6 ++++- src/Mod.cpp | 8 +++--- src/RegisterCommand.cpp | 29 +++++++++++----------- xmake.lua | 5 +++- 9 files changed, 99 insertions(+), 73 deletions(-) diff --git a/.clangd b/.clangd index 40ad7a5..4785d56 100644 --- a/.clangd +++ b/.clangd @@ -1,5 +1,23 @@ 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: - Add: ["-ferror-limit=0", "-D__FUNCTION__=\"dummy\"", "-D_CRT_USE_BUILTIN_OFFSETOF", "-std=c++23"] - Remove: ["/Yu_HeaderOutputPredefine.h", "/FI_HeaderOutputPredefine.h"] + Add: + - "-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" \ No newline at end of file diff --git a/src/Features/Clean.cpp b/src/Features/Clean.cpp index 43485fb..2494241 100644 --- a/src/Features/Clean.cpp +++ b/src/Features/Clean.cpp @@ -1,4 +1,5 @@ #include "Cleaner.h" +#include "mc/world/actor/provider/SynchedActorDataAccess.h" namespace Cleaner { @@ -15,9 +16,11 @@ bool isMatch(std::string& A, std::string& B) { return (A == B); } -bool shouldIgnore(GMLIB_Actor* ac) { - if (ac->isMob() || ac->isItemActor()) { - if (ac->isTame() || ac->isTrusting() || ac->getNameTag() != "" || ac->hasTag("cleaner:ignore")) { +bool isTrust(Actor* ac) { return SynchedActorDataAccess::getActorFlag(ac->getEntityContext(), ::ActorFlags::Trusting); } + +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; } } @@ -27,7 +30,7 @@ bool shouldIgnore(GMLIB_Actor* ac) { bool ShouldClean(Actor* actor) { // Players auto& config = Cleaner::Entry::getInstance().getConfig(); - auto en = (GMLIB_Actor*)actor; + auto en = (gmlib::world::actor::GMActor*)actor; if (en->isPlayer() || shouldIgnore(en)) { return false; } @@ -38,7 +41,7 @@ bool ShouldClean(Actor* actor) { } } // Items - if (en->isItemActor()) { + if (en->hasCategory(::ActorCategory::Item)) { if (config.CleanItem.Enabled) { auto itac = (ItemActor*)en; if (itac->age() <= config.CleanItem.ExistTicks) { @@ -56,7 +59,7 @@ bool ShouldClean(Actor* actor) { return false; } // Mobs - else if (en->isMob()) { + else if (en->hasCategory(::ActorCategory::Mob)) { if (config.CleanMobs.Enabled) { auto blacklist = config.CleanMobs.BlackList; for (auto& key : blacklist) { @@ -94,8 +97,9 @@ bool ShouldClean(Actor* actor) { } int ExecuteClean() { + auto level = ll::service::getLevel(); int clean_count = 0; - auto all_entities = GMLIB_Level::getLevel()->getRuntimeActorList(); + auto all_entities = level->getRuntimeActorList(); for (auto entity : all_entities) { if (ShouldClean(entity)) { entity->despawn(); @@ -106,8 +110,9 @@ int ExecuteClean() { } int CountEntities() { + auto level = ll::service::getLevel(); int clean_count = 0; - auto all_entities = GMLIB_Level::getLevel()->getRuntimeActorList(); + auto all_entities = level->getRuntimeActorList(); for (auto* entity : all_entities) { if (ShouldClean(entity)) { clean_count++; diff --git a/src/Features/CleanTask.cpp b/src/Features/CleanTask.cpp index 9972055..1ae4354 100644 --- a/src/Features/CleanTask.cpp +++ b/src/Features/CleanTask.cpp @@ -10,11 +10,11 @@ static std::shared_ptr mCleanTaskTPS = std::make_shared(false); bool auto_clean_triggerred = false; void CleanTask() { - auto& config = Cleaner::Entry::getInstance().getConfig(); - auto time = config.Basic.Notice1; - auto announce_time = config.Basic.Notice2; - auto time_1 = std::chrono::seconds::duration(time); - auto time_2 = std::chrono::seconds::duration(time - announce_time); + auto& config = Cleaner::Entry::getInstance().getConfig(); + auto time = config.Basic.Notice1; + auto announce_time = config.Basic.Notice2; + std::chrono::seconds time_1(time); + std::chrono::seconds time_2(time - announce_time); if (config.Basic.ConsoleLog) { ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->info( tr("cleaner.output.count1", {S(time_1.count())}) @@ -59,7 +59,7 @@ void CleanTask() { } void AutoCleanTask(int seconds) { - auto time = std::chrono::seconds::duration(seconds); + std::chrono::seconds time(seconds); *mAutoCleanTask = true; ll::coro::keepThis([time]() -> ll::coro::CoroTask<> { while (true) { @@ -72,7 +72,7 @@ void AutoCleanTask(int seconds) { } void CleanTaskCount(int max_entities) { - auto& config = Cleaner::Entry::getInstance().getConfig(); + auto& config = Cleaner::Entry::getInstance().getConfig(); *mCleanTaskCount = true; ll::coro::keepThis([max_entities, &config]() -> ll::coro::CoroTask<> { while (true) { @@ -83,7 +83,9 @@ void CleanTaskCount(int max_entities) { if (count >= max_entities) { auto_clean_triggerred = true; if (config.Basic.ConsoleLog) { - ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); + ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn( + tr("cleaner.output.triggerAutoCleanCount", {S(count)}) + ); } if (config.Basic.SendBroadcast) { Helper::broadcastMessage(tr("cleaner.output.triggerAutoCleanCount", {S(count)})); @@ -100,16 +102,16 @@ void CleanTaskCount(int max_entities) { } void CleanTaskTPS(float min_tps) { - auto& config = Cleaner::Entry::getInstance().getConfig(); + auto& config = Cleaner::Entry::getInstance().getConfig(); *mCleanTaskTPS = true; ll::coro::keepThis([min_tps, &config]() -> ll::coro::CoroTask<> { while (true) { co_await 10s; if (*mCleanTaskTPS == false) co_return; if (auto_clean_triggerred == false) { - if (GMLIB_Level::getLevel()->getServerAverageTps() <= min_tps) { + if (gmlib::world::GMLevel::getInstance()->getServerAverageTps() <= min_tps) { auto_clean_triggerred = true; - auto mspt = S(GMLIB_Level::getLevel()->getServerAverageTps()); + auto mspt = S(gmlib::world::GMLevel::getInstance()->getServerAverageTps()); if (config.Basic.ConsoleLog) { ll::io::LoggerRegistry::getInstance().getOrCreate("Cleaner")->warn( tr("cleaner.output.triggerAutoCleanTps", {mspt}) diff --git a/src/Features/Events.cpp b/src/Features/Events.cpp index 74db49f..c278441 100644 --- a/src/Features/Events.cpp +++ b/src/Features/Events.cpp @@ -1,44 +1,39 @@ #include "Cleaner.h" namespace Cleaner { - -void setShouldIgnore(GMLIB_Actor* ac) { ac->addTag("cleaner:ignore"); } +void setShouldIgnore(gmlib::world::actor::GMActor* ac) { ac->addTag("cleaner:ignore"); } void ListenEvents() { auto& eventBus = ll::event::EventBus::getInstance(); auto& config = Cleaner::Entry::getInstance().getConfig(); // ItemSpawnEvent - eventBus.emplaceListener( - [&config](GMLIB::Event::EntityEvent::ItemActorSpawnAfterEvent& event) { - auto& item = event.getItemActor(); - if (event.getSpawner().has_value()) { - auto pl = (GMLIB_Player*)event.getSpawner().as_ptr(); - if (pl->isPlayer() && !pl->isAlive()) { // Death Drop - auto ac = (GMLIB_Actor*)&item; - setShouldIgnore(ac); + eventBus.emplaceListener([&config](ila::mc::SpawnItemActorAfterEvent& event) { + auto& item = event.itemActor(); + if (event.spawner()) { + auto pl = (gmlib::world::actor::GMPlayer*)event.spawner(); + if (pl->isPlayer() && !pl->isAlive()) { // Death Drop + auto ac = (gmlib::world::actor::GMActor*)&item; + 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; } } - 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; - } - } - item.lifeTime() = config.ItemDespawn.DespawnTime; - } + item->lifeTime() = config.ItemDespawn.DespawnTime; } - ); + }); // MobTakeItemEvent - eventBus.emplaceListener( - [](GMLIB::Event::EntityEvent::MobPickupItemAfterEvent& event) { - auto mob = (GMLIB_Actor*)&event.self(); - setShouldIgnore(mob); - } - ); + eventBus.emplaceListener([](ila::mc::ActorPickupItemAfterEvent& event) { + auto mob = (gmlib::world::actor::GMActor*)&event.self(); + setShouldIgnore(mob); + }); } } // namespace Cleaner \ No newline at end of file diff --git a/src/Features/Helper.cpp b/src/Features/Helper.cpp index 8805e3a..5b2c4ba 100644 --- a/src/Features/Helper.cpp +++ b/src/Features/Helper.cpp @@ -3,11 +3,11 @@ namespace Helper { 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) { - GMLIB_Level::getInstance()->broadcastToast(tr("cleaner.info.prefix"), msg); + gmlib::world::GMLevel::getInstance()->broadcastToast(tr("cleaner.info.prefix"), msg); } } // namespace Helper \ No newline at end of file diff --git a/src/Global.h b/src/Global.h index 6a89157..7ec39a7 100644 --- a/src/Global.h +++ b/src/Global.h @@ -1,7 +1,11 @@ #pragma once +// IWYU pragma: begin_exports #include "Mod.h" -#include +#include "gmlib/include_lib.h" +#include "gmlib/include_ll.h" +#include "ila/include_all.h" #include +// IWYU pragma: end_exports #define S(x) std::to_string(x) diff --git a/src/Mod.cpp b/src/Mod.cpp index f6e0e15..44e97ba 100644 --- a/src/Mod.cpp +++ b/src/Mod.cpp @@ -16,9 +16,9 @@ bool Entry::enable() { mConfig.emplace(); ll::config::loadConfig(*mConfig, getSelf().getConfigDir() / "config.json"); saveConfig(); - I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "en_US", en_US); - I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "zh_CN", zh_CN); - I18nAPI::loadLanguagesFromDirectory(getSelf().getLangDir()); + gmlib::locale::I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "en_US", en_US); + gmlib::locale::I18nAPI::updateOrCreateLanguageFile(getSelf().getLangDir(), "zh_CN", zh_CN); + gmlib::locale::I18nAPI::loadLanguagesFromDirectory(getSelf().getLangDir()); Cleaner::ListenEvents(); RegisterCommands(); Cleaner::loadCleaner(); @@ -43,5 +43,5 @@ void Entry::saveConfig() { ll::config::saveConfig(*mConfig, getSelf().getConfigD LL_REGISTER_MOD(Cleaner::Entry, Cleaner::Entry::getInstance()); std::string tr(std::string const& key, std::vector const& params) { - return I18nAPI::get(key, params, Cleaner::Entry::getInstance().getConfig().language); + return gmlib::locale::I18nAPI::get(key, params); } diff --git a/src/RegisterCommand.cpp b/src/RegisterCommand.cpp index ebd7eb1..1bc5aec 100644 --- a/src/RegisterCommand.cpp +++ b/src/RegisterCommand.cpp @@ -15,10 +15,8 @@ void RegCleanerCommand() { tr("cleaner.command.cleaner"), CommandPermissionLevel::GameDirectors ); - cmd.overload() - .required("despawn") - .required("entity") - .execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { + cmd.overload().required("despawn").required("entity").execute( + [&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { auto ens = param.entity.results(origin); if (ens.empty()) { return output.error(tr("cleaner.command.error.noTarget")); @@ -27,10 +25,10 @@ void RegCleanerCommand() { en->despawn(); } return output.success(tr("cleaner.command.despawnSuccess", {S(ens.size())})); - }); - cmd.overload() - .required("action") - .execute([&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { + } + ); + cmd.overload().required("action").execute( + [&](CommandOrigin const& origin, CommandOutput& output, CleanerParam const& param) { switch (param.action) { case CleanerParam::Action::clean: { Cleaner::CleanTask(); @@ -46,15 +44,15 @@ void RegCleanerCommand() { return output.success(tr("cleaner.command.clean.output")); } case CleanerParam::Action::tps: { - return output.success(tr( - "cleaner.command.tps.output", - {S(GMLIB_Level::getLevel()->getServerCurrentTps()), - S(GMLIB_Level::getLevel()->getServerAverageTps())} - )); + return output.success( + tr("cleaner.command.tps.output", + {S(gmlib::world::GMLevel::getInstance()->getServerCurrentTps()), + S(gmlib::world::GMLevel::getInstance()->getServerAverageTps())}) + ); } case CleanerParam::Action::mspt: { 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: { @@ -62,7 +60,8 @@ void RegCleanerCommand() { return output.success(tr("cleaner.output.reload")); } } - }); + } + ); cmd.overload() .required("despawntime") .required("ticks") diff --git a/xmake.lua b/xmake.lua index 3c28635..d415a20 100644 --- a/xmake.lua +++ b/xmake.lua @@ -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("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 set_runtimes("MD") @@ -11,6 +12,7 @@ end add_requires("levilamina") add_requires("levibuildscript") add_requires("gmlib") +add_requires("ilistenattentively") target("Cleaner") -- Change this to your mod name. add_cxflags( @@ -25,7 +27,8 @@ target("Cleaner") -- Change this to your mod name. ) add_packages( "levilamina", - "gmlib" + "gmlib", + "ilistenattentively" ) add_defines( "NOMINMAX",