From b6541ba6acb269345fc1976321215c09f02c065d Mon Sep 17 00:00:00 2001 From: Tsubasa6848 Date: Wed, 28 Feb 2024 05:31:31 +0800 Subject: [PATCH] feat: resume inventory --- src/Initialization.cpp | 6 +++++ src/InventoryCheck.cpp | 52 +++++++++++++++++++++++++++++++++++++++++- src/Language.h | 2 ++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/Initialization.cpp b/src/Initialization.cpp index 005f39e..826b995 100644 --- a/src/Initialization.cpp +++ b/src/Initialization.cpp @@ -15,6 +15,12 @@ void initPlugin() { Language->updateOrCreateLanguage("zh_CN", defaultLanguage_zh_CN); Language->loadAllLanguages(); Language->chooseLanguage(languageCode); + if (!std::filesystem::exists("./plugins/InventoryCheck/data/")) { + std::filesystem::create_directories("./plugins/InventoryCheck/data/"); + } + if (!std::filesystem::exists("./plugins/InventoryCheck/save/")) { + std::filesystem::create_directories("./plugins/InventoryCheck/save/"); + } } std::string tr(std::string key, std::vector data) { return Language->translate(key, data); } diff --git a/src/InventoryCheck.cpp b/src/InventoryCheck.cpp index 7e396a4..0ba3c0f 100644 --- a/src/InventoryCheck.cpp +++ b/src/InventoryCheck.cpp @@ -1,11 +1,60 @@ #include "Global.h" +bool saveInventory(Player& player) { + auto& pl = static_cast(player); + auto uuid = pl.getUuid(); + std::string path = "./plugins/InventoryCheck/save/" + uuid.asString() + ".dat"; + if (!std::filesystem::exists(path)) { + auto nbt = pl.getNbt()->toBinaryNbt(); + std::ofstream newFile(path, std::ios::out | std::ios::binary); + if (newFile.is_open()) { + newFile.write(nbt.c_str(), nbt.size()); + newFile.close(); + + return true; + } + } + return false; +} + +bool resumeInventory(Player& player) { + auto& pl = static_cast(player); + auto uuid = pl.getUuid(); + std::string path = "./plugins/InventoryCheck/save/" + uuid.asString() + ".dat"; + if (std::filesystem::exists(path)) { + std::ifstream dataFile(path, std::ios::binary); + if (dataFile.is_open()) { + dataFile.seekg(0, std::ios::end); + std::streampos fileSize = dataFile.tellg(); + dataFile.seekg(0, std::ios::beg); + std::vector buffer(fileSize); + dataFile.read(buffer.data(), fileSize); + std::string_view binaryData(buffer.data(), fileSize); + dataFile.close(); + std::filesystem::remove(path); + auto nbt = CompoundTag::fromBinaryNbt(binaryData); + if (nbt) { + GMLIB_Player::setPlayerNbtTags(uuid, *nbt, {"Offhand", "Inventory", "Armor", "EnderChestInventory"}); + return true; + } + } + } + return false; +} + + void mainForm(Player& pl) { auto fm = ll::form::SimpleForm(tr("form.main.title"), tr("form.main.content")); fm.appendButton(tr("form.main.checkOnline"), [](Player& pl) { return checkOnlineForm(pl); }); fm.appendButton(tr("form.main.checkAll"), [](Player& pl) { return checkAllForm(pl); }); fm.appendButton(tr("form.main.searchPlayer"), [](Player& pl) { return searchPlayerForm(pl); }); - fm.appendButton(tr("form.main.resumeInventory"), [](Player& pl) { return; }); + fm.appendButton(tr("form.main.resumeInventory"), [](Player& pl) { + auto res = resumeInventory(pl); + if (res) { + return pl.sendMessage(tr("resumeInventory.success")); + } + return pl.sendMessage(tr("resumeInventory.failed")); + }); fm.sendTo(pl); } @@ -154,6 +203,7 @@ void checkPlayerForm(Player& pl, mce::UUID uuid) { std::string name = getNameFormUuid(uuid); auto fm = ll::form::SimpleForm(tr("form.checkPlayer.title"), tr("form.checkPlayer.content", {name})); fm.appendButton(tr("form.checkPlayer.copyInventory"), [uuid, name](Player& pl) { + saveInventory(pl); auto nbt = GMLIB_Player::getPlayerNbt(uuid); if (!nbt) { return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name})); diff --git a/src/Language.h b/src/Language.h index 73f7b99..6c17c1e 100644 --- a/src/Language.h +++ b/src/Language.h @@ -51,4 +51,6 @@ std::string defaultLanguage_zh_CN = R"( form.deleteFailed.returnCheck=返回操作界面 checkOnline.empty=全服就你一个人在线,还在这查在线玩家呢?\n还不快去招人? checkAll.empty=整个存档就你一个人玩过,还在这玩查包呢?\n还不快去招人? + resumeInventory.success=已成功复原你的背包! + resumeInventory.failed=无法复原你的背包,没有找到你的背包数据! )";