Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: dump item components & creative group #137

Merged
merged 11 commits into from
Mar 5, 2025
10 changes: 10 additions & 0 deletions src/bedrock/world/item/item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,13 @@ float Item::getFurnaceBurnIntervalMultipler() const
{
return furnace_burn_interval_modifier_;
}

const std::string &Item::getCreativeGroup() const
{
return creative_group_;
}

CreativeItemCategory Item::getCreativeCategory() const
{
return creative_category_;
}
6 changes: 5 additions & 1 deletion src/bedrock/world/item/item.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,13 @@ class Item {
Item &setMinRequiredBaseGameVersion(const BaseGameVersion &base_game_version);
ItemDescriptor buildDescriptor(std::int16_t, const CompoundTag *) const;
[[nodiscard]] float getFurnaceBurnIntervalMultipler() const;
[[nodiscard]] const std::string &getCreativeGroup() const;
[[nodiscard]] CreativeItemCategory getCreativeCategory() const;

public:
ItemVersion item_parse_version;

protected:
ItemVersion item_parse_version_;
std::string texture_atlas_file_;
int frame_count_;
bool animates_in_toolbar_;
Expand Down
7 changes: 7 additions & 0 deletions src/bedrock/world/item/registry/creative_item_entry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@

#include "bedrock/world/item/registry/creative_item_entry.h"

#include "bedrock/world/item/registry/creative_item_registry.h"

ItemInstance const &CreativeItemEntry::getItemInstance() const
{
return item_instance_;
}

CreativeGroupInfoPtr CreativeItemEntry::getGroup() const
{
return registry_->getCreativeGroup(group_index_);
}
2 changes: 2 additions & 0 deletions src/bedrock/world/item/registry/creative_item_entry.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include "bedrock/core/utility/enable_non_owner_references.h"
#include "bedrock/world/inventory/network/item_stack_net_id_variant.h"
#include "bedrock/world/item/item_instance.h"
#include "bedrock/world/item/registry/creative_item_entry_fwd.h"

class CreativeItemRegistry;

Expand All @@ -26,6 +27,7 @@ using CreativeItemNetId = TypedServerNetId<CreativeItemNetIdTag, unsigned int>;
class CreativeItemEntry : public Bedrock::EnableNonOwnerReferences {
public:
[[nodiscard]] ItemInstance const &getItemInstance() const;
[[nodiscard]] CreativeGroupInfoPtr getGroup() const;

private:
CreativeItemRegistry *registry_; // +24
Expand Down
10 changes: 10 additions & 0 deletions src/bedrock/world/item/registry/creative_item_registry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@

#include "bedrock/world/item/item_instance.h"

CreativeGroupInfoPtr CreativeItemRegistry::getCreativeGroup(const uint32_t index)
{
return &creative_groups_[index];
}

const std::vector<CreativeItemEntry> &CreativeItemRegistry::getCreativeItemEntries() const
{
return creative_items_;
}

const std::vector<CreativeGroupInfo> &CreativeItemRegistry::getCreativeGroups() const
{
return creative_groups_;
Expand Down
4 changes: 3 additions & 1 deletion src/bedrock/world/item/registry/creative_item_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@

class CreativeItemRegistry : public Bedrock::EnableNonOwnerReferences {
public:
const std::vector<CreativeGroupInfo> &getCreativeGroups() const;
CreativeGroupInfoPtr getCreativeGroup(std::uint32_t);
[[nodiscard]] const std::vector<CreativeItemEntry> &getCreativeItemEntries() const;
[[nodiscard]] const std::vector<CreativeGroupInfo> &getCreativeGroups() const;
void forEachCreativeItemInstance(std::function<bool(const ItemInstance &)>) const;

private:
Expand Down
24 changes: 24 additions & 0 deletions src/endstone/core/devtools/devtools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,14 @@ struct adl_serializer<ListTag> {
adl_serializer<Tag>::to_json(j, tag);
}
};

template <>
struct adl_serializer<CompoundTag> {
static void to_json(json &j, const CompoundTag &tag) // NOLINT(*-identifier-naming)
{
adl_serializer<Tag>::to_json(j, tag);
}
};
NLOHMANN_JSON_NAMESPACE_END

namespace endstone::devtools {
Expand Down Expand Up @@ -284,6 +292,10 @@ void render()
file_to_save = data->item_tags;
openFileBrowser("Save Item Tags", "item_tags.json");
}
if (ImGui::MenuItem("Creative Groups")) {
file_to_save = data->creative_groups;
openFileBrowser("Save Creative Groups", "creative_groups.json");
}
if (ImGui::MenuItem("Recipes")) {
file_to_save = nlohmann::json{
{"shapeless", data->recipes.shapeless},
Expand Down Expand Up @@ -319,6 +331,11 @@ void render()
std::get<CompoundTag>(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<CompoundTag>(file_to_save).deepCopy(data->item_components);
openFileBrowser("Save Item Components", "item_components.nbt");
}
ImGui::EndMenu();
}
ImGui::EndMenu();
Expand Down Expand Up @@ -501,6 +518,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();
}

Expand Down Expand Up @@ -617,8 +638,11 @@ void exportAll(const std::filesystem::path &base_path, const VanillaData *data)
save_json_to_file(data->block_tags, "block_tags.json");
save_json_to_file(data->items, "items.json");
save_json_to_file(data->item_tags, "item_tags.json");
save_json_to_file(data->creative_groups, "creative_groups.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");
Expand Down
21 changes: 15 additions & 6 deletions src/endstone/core/devtools/vanilla_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,27 +144,36 @@ 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<std::int32_t>(item->item_parse_version));
data.item_components.put(name, std::move(tag));
}

if (!tags.is_null()) {
data.items[name]["tags"] = tags;
}
}

auto creative_item_registry = item_registry.getCreativeItemRegistry();
creative_item_registry->forEachCreativeItemInstance([&](const ItemInstance &item_instance) {
for (const auto &creative_item_entry : creative_item_registry->getCreativeItemEntries()) {
const ItemInstance &item_instance = creative_item_entry.getItemInstance();

CompoundTag tag;
tag.putString("name", item_instance.getItem()->getFullItemName());
tag.putInt64("groupIndex", creative_item_entry.getGroup()->getIndex());
tag.putShort("damage", static_cast<std::int16_t>(item_instance.getAuxValue()));
tag.putString("category", std::string(magic_enum::enum_name(item_instance.getItem()->getCreativeCategory())));

if (const auto *user_data = item_instance.getUserData(); user_data) {
tag.putCompound("tag", user_data->clone());
}

if (item_instance.isBlock()) {
tag.putInt("blockStateHash", static_cast<std::int32_t>(item_instance.getBlock()->getRuntimeId()));
}
data.creative_items.add(tag.copy());
return true;
});
}

for (const auto &creative_group : creative_item_registry->getCreativeGroups()) {
data.creative_groups.push_back({
Expand Down
2 changes: 1 addition & 1 deletion src/endstone/core/devtools/vanilla_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading