feat: resume inventory
This commit is contained in:
@@ -15,6 +15,12 @@ void initPlugin() {
|
|||||||
Language->updateOrCreateLanguage("zh_CN", defaultLanguage_zh_CN);
|
Language->updateOrCreateLanguage("zh_CN", defaultLanguage_zh_CN);
|
||||||
Language->loadAllLanguages();
|
Language->loadAllLanguages();
|
||||||
Language->chooseLanguage(languageCode);
|
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<std::string> data) { return Language->translate(key, data); }
|
std::string tr(std::string key, std::vector<std::string> data) { return Language->translate(key, data); }
|
||||||
|
|||||||
+51
-1
@@ -1,11 +1,60 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
|
|
||||||
|
bool saveInventory(Player& player) {
|
||||||
|
auto& pl = static_cast<GMLIB_Player&>(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<GMLIB_Player&>(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<char> 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) {
|
void mainForm(Player& pl) {
|
||||||
auto fm = ll::form::SimpleForm(tr("form.main.title"), tr("form.main.content"));
|
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.checkOnline"), [](Player& pl) { return checkOnlineForm(pl); });
|
||||||
fm.appendButton(tr("form.main.checkAll"), [](Player& pl) { return checkAllForm(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.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);
|
fm.sendTo(pl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,6 +203,7 @@ void checkPlayerForm(Player& pl, mce::UUID uuid) {
|
|||||||
std::string name = getNameFormUuid(uuid);
|
std::string name = getNameFormUuid(uuid);
|
||||||
auto fm = ll::form::SimpleForm(tr("form.checkPlayer.title"), tr("form.checkPlayer.content", {name}));
|
auto fm = ll::form::SimpleForm(tr("form.checkPlayer.title"), tr("form.checkPlayer.content", {name}));
|
||||||
fm.appendButton(tr("form.checkPlayer.copyInventory"), [uuid, name](Player& pl) {
|
fm.appendButton(tr("form.checkPlayer.copyInventory"), [uuid, name](Player& pl) {
|
||||||
|
saveInventory(pl);
|
||||||
auto nbt = GMLIB_Player::getPlayerNbt(uuid);
|
auto nbt = GMLIB_Player::getPlayerNbt(uuid);
|
||||||
if (!nbt) {
|
if (!nbt) {
|
||||||
return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name}));
|
return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name}));
|
||||||
|
|||||||
@@ -51,4 +51,6 @@ std::string defaultLanguage_zh_CN = R"(
|
|||||||
form.deleteFailed.returnCheck=返回操作界面
|
form.deleteFailed.returnCheck=返回操作界面
|
||||||
checkOnline.empty=全服就你一个人在线,还在这查在线玩家呢?\n还不快去招人?
|
checkOnline.empty=全服就你一个人在线,还在这查在线玩家呢?\n还不快去招人?
|
||||||
checkAll.empty=整个存档就你一个人玩过,还在这玩查包呢?\n还不快去招人?
|
checkAll.empty=整个存档就你一个人玩过,还在这玩查包呢?\n还不快去招人?
|
||||||
|
resumeInventory.success=已成功复原你的背包!
|
||||||
|
resumeInventory.failed=无法复原你的背包,没有找到你的背包数据!
|
||||||
)";
|
)";
|
||||||
|
|||||||
Reference in New Issue
Block a user