feat: reflect the main functions

Signed-off-by: wed150 <wed15058338634@outlook.com>
This commit is contained in:
2026-06-13 23:58:39 +08:00
Unverified
parent 1828622d4d
commit 2028526e1d
+57 -105
View File
@@ -15,10 +15,16 @@
#include "ll/api/form/SimpleForm.h" #include "ll/api/form/SimpleForm.h"
#include "ll/api/form/CustomForm.h" #include "ll/api/form/CustomForm.h"
#include "gmlib/gm/data/UserCache.h"
#include "gmlib/mc/world/actor/OfflinePlayer.h" #include "gmlib/mc/world/actor/OfflinePlayer.h"
#include <ll/api/service/PlayerInfo.h>
/**
* @brief the keys of the playr nbt that would be copied or written
*/
static constexpr const char* InvKey[] = {
"Armor","Offhand","Inventory","EnderChestInventory"
};
void saveInventory(Player& player) { void saveInventory(Player& player) {
auto& pl = static_cast<gmlib::GMPlayer&>(player); auto& pl = static_cast<gmlib::GMPlayer&>(player);
auto uuid = pl.getUuid(); auto uuid = pl.getUuid();
@@ -28,36 +34,31 @@ void saveInventory(Player& player) {
true true
); );
} }
/**
* @brief set the playerNBT easily and validly
*/
bool validSetNbt(mce::UUID uuid, const std::unique_ptr<CompoundTag>& nbt) { bool validSetNbt(mce::UUID uuid, const std::unique_ptr<CompoundTag>& nbt) {
try { if (!nbt) return false;
Player* player = ll::service::getLevel()->getPlayer(uuid);
if (player && nbt) { if (auto* p = ll::service::getLevel()->getPlayer(uuid)) {
auto& pl=static_cast<gmlib::GMPlayer&>(*player); auto& pl = static_cast<gmlib::GMPlayer&>(*p);
pl.setNbt(*nbt); pl.setNbt(*nbt);
pl.refreshInventory(); pl.refreshInventory();
return true; return true;
} else if (nbt) {auto db = ll::service::getDBStorage(); }
if (db && db->hasKey("player_" + uuid.asString(), DBHelpers::Category::Player)) {
std::unique_ptr<CompoundTag> playerTag = auto db = ll::service::getDBStorage();
db->getCompoundTag("player_" + uuid.asString(), DBHelpers::Category::Player); if (!db) return false;
if (playerTag) {
std::string serverId = playerTag->at("ServerId"); auto tag = db->getCompoundTag("player_" + uuid.asString(), DBHelpers::Category::Player);
if (!serverId.empty()) {
auto player_offline = gmlib::OfflinePlayer(uuid,serverId); if (!tag || !tag->contains("ServerId"))
player_offline.setNbt(*nbt); return false;
gmlib::OfflinePlayer(uuid, tag->at("ServerId")).setNbt(*nbt);
return true; return true;
} }
}
}
}
return false;
}
catch (...) {
return false;
}
}
bool resumeInventory(Player& player) { bool resumeInventory(Player& player) {
auto& pl = static_cast<gmlib::GMPlayer&>(player); auto& pl = static_cast<gmlib::GMPlayer&>(player);
@@ -67,15 +68,10 @@ bool resumeInventory(Player& player) {
std::filesystem::remove(path); std::filesystem::remove(path);
if (auto nbt = CompoundTag::fromBinaryNbt(binaryData.value())) { if (auto nbt = CompoundTag::fromBinaryNbt(binaryData.value())) {
auto playerNbt=pl.getNbt(); auto playerNbt=pl.getNbt();
for (auto key : InvKey)
playerNbt->mTags["Armor"] =nbt->at("Armor"); playerNbt->mTags[key] = nbt->at(key);
playerNbt->mTags["EnderChestInventory"] = nbt->at("EnderChestInventory");
playerNbt->mTags["Offhand"] = nbt->at("Offhand");
playerNbt->mTags["Inventory"] = nbt->at("Inventory");
pl.setNbt(*playerNbt); pl.setNbt(*playerNbt);
pl.refreshInventory(); pl.refreshInventory();
return true; return true;
} }
} }
@@ -88,10 +84,9 @@ void mainForm(Player& 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) { fm.appendButton(tr("form.main.resumeInventory"), [](Player& pl) {
if (auto res = resumeInventory(pl)) { pl.sendMessage(resumeInventory(pl)
return pl.sendMessage(tr("resumeInventory.success")); ? tr("resumeInventory.success")
} : tr("resumeInventory.failed"));
return pl.sendMessage(tr("resumeInventory.failed"));
}); });
fm.sendTo(pl); fm.sendTo(pl);
} }
@@ -105,7 +100,6 @@ void checkOnlineForm(Player& pl) {
} }
return true; return true;
}); });
for (auto& [uuid, name] : onlineList) { for (auto& [uuid, name] : onlineList) {
if (uuid != pl.getUuid()) { if (uuid != pl.getUuid()) {
fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); }); fm.appendButton(name, [uuid](Player& pl) { return checkPlayerForm(pl, uuid); });
@@ -120,39 +114,23 @@ void checkOnlineForm(Player& pl) {
} }
}); });
} }
std::string getNameFormUuid(mce::UUID const& uuid) { std::string getNameFormUuid(mce::UUID const& uuid) {
auto player = ll::service::getLevel()->getPlayer(uuid); auto player = ll::service::getLevel()->getPlayer(uuid);
std::string name; std::string name;
if (player) { if (player) {
name = player->getRealName(); name = player->getRealName();
} else { } else {
// 获取 UserCache 实例 auto cache = ll::service::PlayerInfo::getInstance().fromUuid(uuid);
auto userCache = gmlib::UserCache::getInstance(); name = cache ? cache->name : uuid.asString();
if (!userCache) {
return uuid.asString(); // UserCache 未初始化或不可用
}
// 查询用户信息
auto entry = userCache->from(uuid);
if (!entry) {
return uuid.asString(); // 未找到对应 UUID 的用户
}
name = entry->mName;
} }
return name; return name;
} }
std::unordered_map<mce::UUID, std::string> generateUuidMap() { std::unordered_map<mce::UUID, std::string> generateUuidMap() {
auto userCache = gmlib::UserCache::getInstance();
if (!userCache) {
// 处理 UserCache 未初始化的情况
}
std::vector<mce::UUID> allUuids; std::vector<mce::UUID> allUuids;
for (const auto& entry : userCache->entries()) { for (const auto& entry : ll::service::PlayerInfo::getInstance().entries()) {
allUuids.push_back(entry.mUuid); allUuids.push_back(entry.uuid);
} }
for (const auto& player : ll::service::getLevel()->getPlayerList()) { for (const auto& player : ll::service::getLevel()->getPlayerList()) {
allUuids.push_back(player.first); allUuids.push_back(player.first);
@@ -253,57 +231,40 @@ void searchNotFoundForm(Player& pl, std::string const& name) {
return mainForm(pl); return mainForm(pl);
}); });
} }
/**
* @brief get the playerNBT conveninetly
*/
std::unique_ptr<CompoundTag> getNBTptr(mce::UUID uuid) { std::unique_ptr<CompoundTag> getNBTptr(mce::UUID uuid) {
if (auto player = ll::service::getLevel()->getPlayer(uuid))
if (auto player = ll::service::getLevel()->getPlayer(uuid)) { return static_cast<gmlib::GMPlayer&>(*player).getNbt();
auto& pl=static_cast<gmlib::GMPlayer&>(*player);
return pl.getNbt();
}
else {
auto db = ll::service::getDBStorage(); auto db = ll::service::getDBStorage();
if (db && db->hasKey("player_" + uuid.asString(), DBHelpers::Category::Player)) { if (!db) return nullptr;
std::unique_ptr<CompoundTag> playerTag = auto playerTag = db->getCompoundTag(
db->getCompoundTag("player_" + uuid.asString(), DBHelpers::Category::Player); "player_" + uuid.asString(),
if (playerTag) { DBHelpers::Category::Player
std::string serverId = playerTag->at("ServerId"); );
if (!serverId.empty() && db->hasKey(serverId, DBHelpers::Category::Player)) { if (!playerTag||!playerTag->contains("ServerId")) return nullptr;
auto player_offline = gmlib::OfflinePlayer(uuid,serverId); auto nbt =gmlib::OfflinePlayer(uuid, playerTag->at("ServerId")).getNbt();
if (auto nbtResult = player_offline.getNbt()) { return nbt ? std::make_unique<CompoundTag>(*nbt) : nullptr;
return std::make_unique<CompoundTag>(nbtResult.value());
} }
}
}
}
}
return nullptr;
}
void checkPlayerForm(Player& pl, mce::UUID const& uuid) { void checkPlayerForm(Player& pl, mce::UUID const& 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); saveInventory(pl);
auto nbt =getNBTptr(uuid); auto nbt =getNBTptr(uuid);
auto playerNbt=getNBTptr(pl.getUuid()); auto playerNbt=getNBTptr(pl.getUuid());
if ((!nbt)||(!playerNbt)) { if ((!nbt)||(!playerNbt)) {
return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name})); return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name}));
} }
playerNbt->mTags["Armor"] = nbt->at("Armor"); for (auto key : InvKey)
playerNbt->mTags["EnderChestInventory"] = nbt->at("EnderChestInventory"); playerNbt->mTags[key] = nbt->at(key);
playerNbt->mTags["Offhand"] = nbt->at("Offhand");
playerNbt->mTags["Inventory"] = nbt->at("Inventory");
bool success= validSetNbt(pl.getUuid(), std::move(playerNbt)); bool success= validSetNbt(pl.getUuid(), std::move(playerNbt));
pl.refreshInventory(); pl.refreshInventory();
if (!success) { return pl.sendMessage(tr(success ? "checkPlayer.copyInventory.success" :
return pl.sendMessage(tr("checkPlayer.copyInventory.failed", {name})); "checkPlayer.copyInventory.setFailed",{name}));
}
return pl.sendMessage(tr("checkPlayer.copyInventory.success", {name}));
}); });
fm.appendButton(tr("form.checkPlayer.writeInventory"), [uuid, name](Player& pl) { fm.appendButton(tr("form.checkPlayer.writeInventory"), [uuid, name](Player& pl) {
@@ -334,8 +295,6 @@ void invalidInputForm(Player& pl) {
}); });
} }
void confirmWriteForm(Player& pl, mce::UUID const& uuid, std::string const& name) { void confirmWriteForm(Player& pl, mce::UUID const& uuid, std::string const& name) {
auto fm = ll::form::ModalForm( auto fm = ll::form::ModalForm(
tr("form.confirmWrite.title"), tr("form.confirmWrite.title"),
@@ -348,21 +307,15 @@ void confirmWriteForm(Player& pl, mce::UUID const& uuid, std::string const& name
auto& self = static_cast<gmlib::GMPlayer&>(pl); auto& self = static_cast<gmlib::GMPlayer&>(pl);
auto nbt = self.getNbt(); auto nbt = self.getNbt();
auto targetNbt = getNBTptr(uuid); auto targetNbt = getNBTptr(uuid);
if (!targetNbt) { if (!targetNbt) {
return pl.sendMessage(tr("checkPlayer.writeInventory.failed", {name})); return pl.sendMessage(tr("checkPlayer.writeInventory.failed", {name}));
} }
targetNbt->mTags["Armor"] = nbt->at("Armor"); for (auto key : InvKey)
targetNbt->mTags["EnderChestInventory"] = nbt->at("EnderChestInventory"); targetNbt->mTags[key] = nbt->at(key);
targetNbt->mTags["Offhand"] = nbt->at("Offhand");
targetNbt->mTags["Inventory"] = nbt->at("Inventory");
bool success= validSetNbt(uuid, std::move(targetNbt)); bool success= validSetNbt(uuid, std::move(targetNbt));
pl.refreshInventory(); pl.refreshInventory();
if (!success) { return pl.sendMessage(tr(success ? "checkPlayer.writeInventory.success" :
return pl.sendMessage(tr("checkPlayer.writeInventory.failed", {name})); "checkPlayer.writeInventory.setFailed",{name}));
}
return pl.sendMessage(tr("checkPlayer.writeInventory.success", {name}));
} }
return checkPlayerForm(pl, uuid); return checkPlayerForm(pl, uuid);
}); });
@@ -381,7 +334,6 @@ void confirmDeleteForm(Player& pl, mce::UUID const& uuid, std::string const& nam
return deleteFailedForm(pl, uuid, name); return deleteFailedForm(pl, uuid, name);
} }
gmlib::OfflinePlayer::deletePlayerNbt(uuid); gmlib::OfflinePlayer::deletePlayerNbt(uuid);
return pl.sendMessage(tr("checkPlayer.deletePlayer.success", {name})); return pl.sendMessage(tr("checkPlayer.deletePlayer.success", {name}));
} }
return checkPlayerForm(pl, uuid); return checkPlayerForm(pl, uuid);