From e0ac76b8b1d83c919bcb1f27ef34d73204eab240 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Thu, 20 Feb 2025 20:18:28 +0800 Subject: [PATCH] feat: dump item components & creative group --- src/bedrock/world/item/item.cpp | 11 +++++++++++ src/bedrock/world/item/item.h | 2 ++ src/endstone/core/devtools/devtools.cpp | 19 +++++++++++++++++++ src/endstone/core/devtools/vanilla_data.cpp | 10 ++++++++++ src/endstone/core/devtools/vanilla_data.h | 2 +- 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/bedrock/world/item/item.cpp b/src/bedrock/world/item/item.cpp index 50e510bea..353b4d8e0 100644 --- a/src/bedrock/world/item/item.cpp +++ b/src/bedrock/world/item/item.cpp @@ -62,3 +62,14 @@ float Item::getFurnaceBurnIntervalMultipler() const { return furnace_burn_interval_modifier_; } + +ItemVersion Item::getItemVersion() const +{ + return item_parse_version_; +} + +const std::string &Item::getCreativeGroup() const +{ + return creative_group_; +} + diff --git a/src/bedrock/world/item/item.h b/src/bedrock/world/item/item.h index 8563da1b6..824d76a79 100644 --- a/src/bedrock/world/item/item.h +++ b/src/bedrock/world/item/item.h @@ -180,6 +180,8 @@ class Item { Item &setMinRequiredBaseGameVersion(const BaseGameVersion &base_game_version); ItemDescriptor buildDescriptor(std::int16_t, const CompoundTag *) const; [[nodiscard]] float getFurnaceBurnIntervalMultipler() const; + [[nodiscard]] ItemVersion getItemVersion() const; + [[nodiscard]] const std::string &getCreativeGroup() const; protected: ItemVersion item_parse_version_; diff --git a/src/endstone/core/devtools/devtools.cpp b/src/endstone/core/devtools/devtools.cpp index 1c034b693..adea07c39 100644 --- a/src/endstone/core/devtools/devtools.cpp +++ b/src/endstone/core/devtools/devtools.cpp @@ -118,6 +118,14 @@ struct adl_serializer { adl_serializer::to_json(j, tag); } }; + +template <> +struct adl_serializer { + static void to_json(json &j, const CompoundTag &tag) // NOLINT(*-identifier-naming) + { + adl_serializer::to_json(j, tag); + } +}; NLOHMANN_JSON_NAMESPACE_END namespace endstone::devtools { @@ -319,6 +327,11 @@ void render() std::get(file_to_save).put("items", data->creative_items.copy()); openFileBrowser("Save Creative Items", "creative_items.nbt"); } + if (ImGui::MenuItem("Item Components")) { + file_to_save = CompoundTag(); + std::get(file_to_save).deepCopy(data->item_components); + openFileBrowser("Save Item Components", "item_components.nbt"); + } ImGui::EndMenu(); } ImGui::EndMenu(); @@ -501,6 +514,10 @@ void showItemWindow(bool *open) if (ImGui::CollapsingHeader(fmt::format("{} Item Tags", data->item_tags.size()).c_str())) { ImGui::Json(data->item_tags); } + + if (ImGui::CollapsingHeader(fmt::format("{} Item Components", data->item_components.size()).c_str())) { + ImGui::Json(data->item_components); + } ImGui::End(); } @@ -619,6 +636,8 @@ void exportAll(const std::filesystem::path &base_path, const VanillaData *data) save_json_to_file(data->item_tags, "item_tags.json"); save_json_to_file(data->biomes, "biomes.json"); + save_nbt_to_file(data->item_components, "item_components.nbt"); + auto block_palette = CompoundTag(); block_palette.put("blocks", data->block_palette.copy()); save_nbt_to_file(block_palette, "block_palette.nbt"); diff --git a/src/endstone/core/devtools/vanilla_data.cpp b/src/endstone/core/devtools/vanilla_data.cpp index f904c657d..9b3ebfe74 100644 --- a/src/endstone/core/devtools/vanilla_data.cpp +++ b/src/endstone/core/devtools/vanilla_data.cpp @@ -144,6 +144,15 @@ void dumpItemData(VanillaData &data, const ::Level &level) {"maxStackSize", item->getMaxStackSize(ItemDescriptor())}, {"furnaceBurnDuration", FurnaceBlockActor::getBurnDuration(::ItemStack(*item), 200)}, {"furnaceXPMultiplier", item->getFurnaceXPmultiplier(nullptr)}}; + + if (const auto components = item->buildNetworkTag()) { + CompoundTag tag; + tag.putCompound("components", components->clone()); + tag.putBoolean("isComponentBased", item->isComponentBased()); + tag.putInt("version", static_cast(item->getItemVersion())); + data.item_components.put(name, tag.clone()); + } + if (!tags.is_null()) { data.items[name]["tags"] = tags; } @@ -154,6 +163,7 @@ void dumpItemData(VanillaData &data, const ::Level &level) CompoundTag tag; tag.putString("name", item_instance.getItem()->getFullItemName()); tag.putShort("damage", static_cast(item_instance.getAuxValue())); + tag.putString("group", item_instance.getItem()->getCreativeGroup()); if (const auto *user_data = item_instance.getUserData(); user_data) { tag.putCompound("tag", user_data->clone()); diff --git a/src/endstone/core/devtools/vanilla_data.h b/src/endstone/core/devtools/vanilla_data.h index 29d843aa4..68e51e5d3 100644 --- a/src/endstone/core/devtools/vanilla_data.h +++ b/src/endstone/core/devtools/vanilla_data.h @@ -25,11 +25,11 @@ struct VanillaData { nlohmann::json block_states; nlohmann::json block_tags; ::ListTag block_palette; - // nlohmann::json materials; nlohmann::json items; ::ListTag creative_items; nlohmann::json creative_groups; nlohmann::json item_tags; + ::CompoundTag item_components; nlohmann::json biomes; struct { nlohmann::json shapeless;