diff --git a/src/Command.cpp b/src/Command.cpp index 57f1ce0..47c75f5 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -1,4 +1,3 @@ -#include "Forms.h" #include "Global.h" void RegisterCommand() { diff --git a/src/Forms.cpp b/src/Forms.cpp deleted file mode 100644 index 739525c..0000000 --- a/src/Forms.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "Forms.h" - -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.sendTo(pl); -} - -void checkOnlineForm(Player& pl) { - auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); - std::unordered_map onlineList; - GMLIB_Level::getLevel()->forEachPlayer([&onlineList](Player& pl) -> bool { - if (!pl.isSimulated()) { - onlineList[pl.getUuid()] = pl.getRealName(); - } - return true; - }); - for (auto& [uuid, name] : onlineList) { - fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); }); - } - fm.sendTo(pl, [](Player& pl, int index) { - if (index == -1) { - return mainForm(pl); - } - }); -} - -std::string getNameFormUuid(mce::UUID& uuid) { - auto player = GMLIB_Level::getLevel()->getPlayer(uuid); - std::string name; - if (player) { - name = player->getRealName(); - } else { - auto strUuid = uuid.asString(); - auto cachename = GMLIB::Server::UserCache::getNameByUuid(strUuid); - if (cachename.has_value()) { - name = cachename.value(); - } else { - name = strUuid; - } - } - return name; -} - -std::unordered_map generateUuidMap() { - auto allUuids = GMLIB_Player::getAllUuids(); - std::unordered_map allList; - for (auto& strUuid : allUuids) { - auto uuid = mce::UUID::fromString(strUuid); - auto name = getNameFormUuid(uuid); - allList[uuid] = name; - } - return std::move(allList); -} - -void checkAllForm(Player& pl) { - auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); - auto allList = generateUuidMap(); - for (auto& [uuid, name] : allList) { - fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); }); - } - fm.sendTo(pl, [](Player& pl, int index) { - if (index == -1) { - return mainForm(pl); - } - }); -} - -void searchPlayerForm(Player& pl) { - auto fm = ll::form::CustomForm(tr("form.searchPlayer.title")); - fm.appendLabel(tr("form.searchPlayer.description")); - fm.appendInput("name", tr("form.searchPlayer.input"), tr("form.searchPlayer.inputName")); - fm.appendDropdown( - "mode", - tr("form.searchForm.searchMode"), - {tr("form.searchPlayer.fuzzySearch"), tr("form.searchPlayer.preciseSearch")}, - 0 - ); - fm.sendTo(pl, [](Player& pl, const ll::form::CustomFormResult& result) { - if (result.empty()) { - return mainForm(pl); - } - std::string inputName; - if (std::holds_alternative(result.at("name"))) { - inputName = std::get(result.at("name")); - } - auto searchMode = std::get(result.at("mode")); - if (inputName.empty()) { - return invalidInputForm(pl); - } - auto allList = generateUuidMap(); - if (searchMode == tr("form.searchPlayer.preciseSearch")) { - for (auto& [uuid, name] : allList) { - if (name == inputName) { - return checkPlayerForm(pl, uuid); - } - } - } else { - std::unordered_map resultList; - for (auto& [uuid, name] : allList) { - if (name.find(inputName) != std::string::npos) { - resultList[uuid] = name; - } - } - if (!resultList.empty()) { - return searchResultForm(pl, resultList); - } - } - return searchNotFoundForm(pl, inputName); - }); -} - -void searchResultForm(Player& pl, std::unordered_map resultList) { - auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); - for (auto& [uuid, name] : resultList) { - fm.appendButton(name, [&uuid](Player& pl) { checkPlayerForm(pl, uuid); }); - } - fm.sendTo(pl, [](Player& pl, int index) { - if (index == -1) { - return searchPlayerForm(pl); - } - }); -} - -void searchNotFoundForm(Player& pl, std::string& name) { - auto fm = ll::form::ModalForm( - tr("form.notFound.title"), - tr("form.notFound.content", {name}), - tr("form.notFound.returnSearch"), - tr("form.returnMainForm") - ); - fm.sendTo(pl, [](Player& pl, ll::form::ModalForm::SelectedButton result) { - if (result == ll::form::ModalForm::SelectedButton::Upper) { - return searchPlayerForm(pl); - } - return mainForm(pl); - }); -} - -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](Player& pl) { - auto nbt = GMLIB_Player::getPlayerNbt(uuid); - auto self = (GMLIB_Player*)(&pl); - self->setPlayerNbtTags(pl.getUuid(), *nbt, {"Offhand", "Inventory", "Armor", "EnderChestInventory"}); - }); - fm.appendButton(tr("form.checkPlayer.writeInventory"), [uuid](Player& pl) { - // - }); - fm.appendButton(tr("form.checkPlayer.deleteData"), [uuid](Player& pl) { - // - }); - fm.sendTo(pl, [](Player& pl, int index) { - if (index == -1) { - return mainForm(pl); - } - }); -} - -void invalidInputForm(Player& pl) { - auto fm = ll::form::ModalForm( - tr("form.invalidInput.title"), - tr("form.invalidInput.content"), - tr("form.invalidInput.returnSearch"), - tr("form.returnMainForm") - ); - fm.sendTo(pl, [](Player& pl, ll::form::ModalForm::SelectedButton result) { - if (result == ll::form::ModalForm::SelectedButton::Upper) { - return searchPlayerForm(pl); - } - return mainForm(pl); - }); -} \ No newline at end of file diff --git a/src/Forms.h b/src/Forms.h deleted file mode 100644 index e8e44d8..0000000 --- a/src/Forms.h +++ /dev/null @@ -1,10 +0,0 @@ -#include "Global.h" - -extern void mainForm(Player& pl) ; -extern void checkOnlineForm(Player& pl); -extern void checkAllForm(Player& pl) ; -extern void searchPlayerForm(Player& pl); -extern void searchResultForm(Player& pl, std::unordered_map resultList); -extern void searchNotFoundForm(Player& pl, std::string& name) ; -extern void checkPlayerForm(Player& pl, mce::UUID uuid); -extern void invalidInputForm(Player& pl); \ No newline at end of file diff --git a/src/Global.h b/src/Global.h index af1e947..ce622f2 100644 --- a/src/Global.h +++ b/src/Global.h @@ -8,4 +8,16 @@ extern ll::Logger logger; extern std::string tr(std::string key, std::vector data = {}); extern void initPlugin(); -extern void RegisterCommand(); \ No newline at end of file +extern void RegisterCommand(); + +extern void mainForm(Player& pl) ; +extern void checkOnlineForm(Player& pl); +extern void checkAllForm(Player& pl) ; +extern void searchPlayerForm(Player& pl); +extern void searchResultForm(Player& pl, std::unordered_map resultList); +extern void searchNotFoundForm(Player& pl, std::string& name) ; +extern void checkPlayerForm(Player& pl, mce::UUID uuid); +extern void invalidInputForm(Player& pl); +extern void confirmWriteForm(Player& pl, mce::UUID uuid, std::string name); +extern void confirmDeleteForm(Player& pl, mce::UUID uuid, std::string name); +extern void deleteFailedForm(Player& pl, mce::UUID uuid, std::string name); \ No newline at end of file diff --git a/src/InventoryCheck.cpp b/src/InventoryCheck.cpp index 61e8f7a..ba94819 100644 --- a/src/InventoryCheck.cpp +++ b/src/InventoryCheck.cpp @@ -1 +1,239 @@ -#include "Global.h" \ No newline at end of file +#include "Global.h" + +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.sendTo(pl); +} + +void checkOnlineForm(Player& pl) { + auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); + std::unordered_map onlineList; + GMLIB_Level::getLevel()->forEachPlayer([&onlineList](Player& pl) -> bool { + if (!pl.isSimulated()) { + onlineList[pl.getUuid()] = pl.getRealName(); + } + return true; + }); + for (auto& [uuid, name] : onlineList) { + fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); }); + } + fm.sendTo(pl, [](Player& pl, int index) { + if (index == -1) { + return mainForm(pl); + } + }); +} + +std::string getNameFormUuid(mce::UUID& uuid) { + auto player = GMLIB_Level::getLevel()->getPlayer(uuid); + std::string name; + if (player) { + name = player->getRealName(); + } else { + auto strUuid = uuid.asString(); + auto cachename = GMLIB::Server::UserCache::getNameByUuid(strUuid); + if (cachename.has_value()) { + name = cachename.value(); + } else { + name = strUuid; + } + } + return name; +} + +std::unordered_map generateUuidMap() { + auto allUuids = GMLIB_Player::getAllUuids(); + std::unordered_map allList; + for (auto& strUuid : allUuids) { + auto uuid = mce::UUID::fromString(strUuid); + auto name = getNameFormUuid(uuid); + allList[uuid] = name; + } + return std::move(allList); +} + +void checkAllForm(Player& pl) { + auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); + auto allList = generateUuidMap(); + for (auto& [uuid, name] : allList) { + fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); }); + } + fm.sendTo(pl, [](Player& pl, int index) { + if (index == -1) { + return mainForm(pl); + } + }); +} + +void searchPlayerForm(Player& pl) { + auto fm = ll::form::CustomForm(tr("form.searchPlayer.title")); + fm.appendLabel(tr("form.searchPlayer.description")); + fm.appendInput("name", tr("form.searchPlayer.input"), tr("form.searchPlayer.inputName")); + fm.appendDropdown( + "mode", + tr("form.searchForm.searchMode"), + {tr("form.searchPlayer.fuzzySearch"), tr("form.searchPlayer.preciseSearch")}, + 0 + ); + fm.sendTo(pl, [](Player& pl, const ll::form::CustomFormResult& result) { + if (result.empty()) { + return mainForm(pl); + } + std::string inputName; + if (std::holds_alternative(result.at("name"))) { + inputName = std::get(result.at("name")); + } + auto searchMode = std::get(result.at("mode")); + if (inputName.empty()) { + return invalidInputForm(pl); + } + auto allList = generateUuidMap(); + if (searchMode == tr("form.searchPlayer.preciseSearch")) { + for (auto& [uuid, name] : allList) { + if (name == inputName) { + return checkPlayerForm(pl, uuid); + } + } + } else { + std::unordered_map resultList; + for (auto& [uuid, name] : allList) { + if (name.find(inputName) != std::string::npos) { + resultList[uuid] = name; + } + } + if (!resultList.empty()) { + return searchResultForm(pl, resultList); + } + } + return searchNotFoundForm(pl, inputName); + }); +} + +void searchResultForm(Player& pl, std::unordered_map resultList) { + auto fm = ll::form::SimpleForm(tr("form.checkList.title"), tr("form.checkList.content")); + for (auto& [uuid, name] : resultList) { + fm.appendButton(name, [&uuid](Player& pl) { checkPlayerForm(pl, uuid); }); + } + fm.sendTo(pl, [](Player& pl, int index) { + if (index == -1) { + return searchPlayerForm(pl); + } + }); +} + +void searchNotFoundForm(Player& pl, std::string& name) { + auto fm = ll::form::ModalForm( + tr("form.notFound.title"), + tr("form.notFound.content", {name}), + tr("form.notFound.returnSearch"), + tr("form.returnMainForm") + ); + fm.sendTo(pl, [](Player& pl, ll::form::ModalForm::SelectedButton result) { + if (result == ll::form::ModalForm::SelectedButton::Upper) { + return searchPlayerForm(pl); + } + return mainForm(pl); + }); +} + +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) { + auto nbt = GMLIB_Player::getPlayerNbt(uuid); + if (!nbt) { + return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name})); + } + auto& self = static_cast(pl); + GMLIB_Player::setPlayerNbtTags(pl.getUuid(), *nbt, {"Offhand", "Inventory", "Armor", "EnderChestInventory"}); + return pl.sendMessage(tr("checkPlayer.copyInventory.success", {name})); + }); + fm.appendButton(tr("form.checkPlayer.writeInventory"), [uuid, name](Player& pl) { + return confirmWriteForm(pl, uuid, name); + }); + fm.appendButton(tr("form.checkPlayer.deleteData"), [uuid, name](Player& pl) { + return confirmDeleteForm(pl, uuid, name); + }); + fm.sendTo(pl, [](Player& pl, int index) { + if (index == -1) { + return mainForm(pl); + } + }); +} + +void invalidInputForm(Player& pl) { + auto fm = ll::form::ModalForm( + tr("form.invalidInput.title"), + tr("form.invalidInput.content"), + tr("form.invalidInput.returnSearch"), + tr("form.returnMainForm") + ); + fm.sendTo(pl, [](Player& pl, ll::form::ModalForm::SelectedButton result) { + if (result == ll::form::ModalForm::SelectedButton::Upper) { + return searchPlayerForm(pl); + } + return mainForm(pl); + }); +} + +void confirmWriteForm(Player& pl, mce::UUID uuid, std::string name) { + auto fm = ll::form::ModalForm( + tr("form.confirmWrite.title"), + tr("form.confirmWrite.content", {name}), + tr("form.confirmAction"), + tr("form.cancelAction") + ); + fm.sendTo(pl, [uuid, name](Player& pl, ll::form::ModalForm::SelectedButton result) { + if (result == ll::form::ModalForm::SelectedButton::Upper) { + auto& self = static_cast(pl); + auto nbt = self.getNbt(); + auto targetNbt = GMLIB_Player::getPlayerNbt(uuid); + if (!targetNbt) { + return pl.sendMessage(tr("checkPlayer.writeInventory.failed", {name})); + } + GMLIB_Player::setPlayerNbtTags(uuid, *nbt, {"Offhand", "Inventory", "Armor", "EnderChestInventory"}); + return pl.sendMessage(tr("checkPlayer.writeInventory.success", {name})); + } + return checkPlayerForm(pl, uuid); + }); +} + +void confirmDeleteForm(Player& pl, mce::UUID uuid, std::string name) { + auto fm = ll::form::ModalForm( + tr("form.confirmDelete.title"), + tr("form.confirmDelete.content", {name}), + tr("form.confirmAction"), + tr("form.cancelAction") + ); + fm.sendTo(pl, [uuid, name](Player& pl, ll::form::ModalForm::SelectedButton result) { + if (result == ll::form::ModalForm::SelectedButton::Upper) { + auto player = GMLIB_Level::getLevel()->getPlayer(uuid); + if (player) { + return deleteFailedForm(pl, uuid, name); + } + auto serverId = GMLIB_Player::getServerIdFromUuid(uuid); + GMLIB_Player::deletePlayerNbt(serverId); + return pl.sendMessage(tr("checkPlayer.deleteNbt.success", {name})); + } + return checkPlayerForm(pl, uuid); + }); +} + +void deleteFailedForm(Player& pl, mce::UUID uuid, std::string name) { + auto fm = ll::form::ModalForm( + tr("form.deleteFailed.title"), + tr("form.deleteFailed.content", {name}), + tr("form.deleteFailed.returnCheck"), + tr("form.returnMainForm") + ); + fm.sendTo(pl, [uuid](Player& pl, ll::form::ModalForm::SelectedButton result) { + if (result == ll::form::ModalForm::SelectedButton::Upper) { + return checkPlayerForm(pl, uuid); + } + return mainForm(pl); + }); +} \ No newline at end of file diff --git a/src/Language.h b/src/Language.h index 5bc43d3..ec95a37 100644 --- a/src/Language.h +++ b/src/Language.h @@ -35,4 +35,18 @@ std::string defaultLanguage_zh_CN = R"( form.invalidInput.returnSearch=重新搜索 command.error.console=该命令只能由玩家执行 command.inventorycheck.desc=查询玩家背包 + checkPlayer.copyInventory.success=已成功将玩家 %s 的背包复制到你的背包! + checkPlayer.copyInventory.failed=无法将玩家 %s 的背包复制到你的背包!\n玩家 %s 没有任何数据! + form.confirmWrite.title=确认覆盖背包 + form.confirmWrite.content=你确定要用你的背包覆盖玩家 %s 的背包吗?\n\n注意!\n此操作不可逆! + form.confirmAction=确认操作 + form.cancelAction=我再想想 + checkPlayer.writeInventory.success=已成功覆盖玩家 %s 的背包! + checkPlayer.writeInventory.failed=无法覆盖玩家 %s 的背包!\n玩家 %s 没有任何数据! + form.confirmDelete.title=确认删除数据 + form.confirmDelete.content=你确定要删除玩家 %s 的全部数据吗?\n这包含玩家在存档的全部数据!\n不仅仅是背包!\n\n注意!\n此操作不可逆!\n请谨慎操作 + checkPlayer.deleteNbt.success=已成功删除玩家 %s 的全部数据! + form.deleteFailed.title=删除失败 + form.deleteFailed.content=玩家 %s 在线!无法删除玩家全部数据!\n\n如需删除全部玩家数据,请先将该玩家踢出游戏再操作! + form.deleteFailed.returnCheck=返回操作界面 )";