diff --git a/doc/en/audio.md b/doc/en/audio.md index 9322583fd..cacd71074 100644 --- a/doc/en/audio.md +++ b/doc/en/audio.md @@ -60,7 +60,7 @@ Library **audio** contains available Audio API in Lua scripts. ```lua audio.play_stream( - -- audio file location + -- audio file location (without entry point, but with extension included) name: string, -- audio source world position x: number, y: number, z: number, @@ -79,7 +79,7 @@ Plays streaming audio from the specified file at the specified world position. R ```lua audio.play_stream_2d( - -- audio file location + -- audio file location (without entry point, but with extension included) name: string, -- audio gain (0.0 - 1.0) volume: number @@ -202,4 +202,4 @@ audio.count_speakers() -> integer -- get current number of playing streams audio.count_streams() -> integer -``` \ No newline at end of file +``` diff --git a/doc/en/world-generator.md b/doc/en/world-generator.md index 2112bce21..b0ab265c9 100644 --- a/doc/en/world-generator.md +++ b/doc/en/world-generator.md @@ -52,6 +52,7 @@ The main properties described in the configuration file: - **biomes-bpd** - number of blocks per point of the biome selection parameter map. Default: 4. - **heights-bpd** - number of blocks per point of the height map. Default: 4. - **wide-structs-chunks-radius** - maximum radius for placing 'wide' structures, measured in chunks. +- **heightmap-inputs** - an array of parameter map numbers that will be passed by the inputs table to the height map generation function. ## Global variables diff --git a/doc/ru/audio.md b/doc/ru/audio.md index b560b7392..1fce6c358 100644 --- a/doc/ru/audio.md +++ b/doc/ru/audio.md @@ -61,7 +61,7 @@ ```lua audio.play_stream( - -- путь к аудио-файлу + -- путь к аудио-файлу (без точки входа, но с указанием расширения) name: string, -- позиция источника аудио в мире x: number, y: number, z: number, @@ -80,7 +80,7 @@ audio.play_stream( ```lua audio.play_stream_2d( - -- путь к аудио-файлу + -- путь к аудио-файлу (без точки входа, но с указанием расширения) name: string, -- громкость аудио (от 0.0 до 1.0) volume: number diff --git a/doc/ru/world-generator.md b/doc/ru/world-generator.md index 1523f94ad..5c1c6e6e9 100644 --- a/doc/ru/world-generator.md +++ b/doc/ru/world-generator.md @@ -52,6 +52,7 @@ - **biomes-bpd** - количество блоков на точку карты параметра выбора биомов. По-умолчанию: 4. - **heights-bpd** - количество блоков на точку карты высот. По-умолчанию: 4. - **wide-structs-chunks-radius** - масимальный радиус размещения 'широких' структур, измеряемый в чанках. +- **heightmap-inputs** - массив номеров карт параметров, которые будут переданы таблицей inputs в функцию генерации карты высот. ## Глобальные переменные diff --git a/res/scripts/stdmin.lua b/res/scripts/stdmin.lua index 71fdbda2d..678983609 100644 --- a/res/scripts/stdmin.lua +++ b/res/scripts/stdmin.lua @@ -74,7 +74,7 @@ function table.deep_copy(t) end end - return copied + return setmetatable(copied, getmetatable(t)) end function table.count_pairs(t) diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 1e954a557..fee559e4f 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -220,11 +220,11 @@ void ContentLoader::loadBlock( } // block model - std::string modelTypeName; + std::string modelTypeName = to_string(def.model); root.at("model").get(modelTypeName); root.at("model-name").get(def.modelName); if (auto model = BlockModel_from(modelTypeName)) { - if (*model == BlockModel::custom) { + if (*model == BlockModel::custom && def.customModelRaw == nullptr) { if (root.has("model-primitives")) { def.customModelRaw = root["model-primitives"]; } else if (def.modelName.empty()) { @@ -246,7 +246,7 @@ void ContentLoader::loadBlock( root.at("material").get(def.material); // rotation profile - std::string profile = "none"; + std::string profile = def.rotations.name; root.at("rotation").get(profile); def.rotatable = profile != "none"; @@ -285,8 +285,6 @@ void ContentLoader::loadBlock( ); aabb.b += aabb.a; def.hitboxes = {aabb}; - } else { - def.hitboxes = {AABB()}; } // block light emission [r, g, b] where r,g,b in range [0..15] diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 1a2d83150..c07fe8171 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -47,6 +47,7 @@ #include "window/Window.hpp" #include "world/Level.hpp" #include "world/World.hpp" +#include "debug/Logger.hpp" #include #include @@ -56,6 +57,8 @@ using namespace gui; +static debug::Logger logger("hud"); + bool Hud::showGeneratorMinimap = false; // implemented in debug_panel.cpp @@ -486,7 +489,32 @@ void Hud::openPermanent(UiDocument* doc) { add(HudElement(hud_element_mode::permanent, doc, doc->getRoot(), false)); } +void Hud::dropExchangeSlot() { + auto slotView = std::dynamic_pointer_cast( + gui->get(SlotView::EXCHANGE_SLOT_NAME) + ); + if (slotView == nullptr) { + return; + } + ItemStack& stack = slotView->getStack(); + + auto indices = frontend.getLevel().content->getIndices(); + if (auto invView = std::dynamic_pointer_cast(blockUI)) { + invView->getInventory()->move(stack, indices); + } + if (stack.isEmpty()) { + return; + } + player->getInventory()->move(stack, indices); + if (!stack.isEmpty()) { + logger.warning() << "discard item [" << stack.getItemId() << ":" + << stack.getCount(); + stack.clear(); + } +} + void Hud::closeInventory() { + dropExchangeSlot(); gui->remove(SlotView::EXCHANGE_SLOT_NAME); exchangeSlot = nullptr; exchangeSlotInv = nullptr; diff --git a/src/frontend/hud.hpp b/src/frontend/hud.hpp index 5594664ac..ad834955a 100644 --- a/src/frontend/hud.hpp +++ b/src/frontend/hud.hpp @@ -128,6 +128,9 @@ class Hud : public util::ObjectsKeeper { void updateHotbarControl(); void cleanup(); + /// @brief Perform exchange slot removal when it's not empty. + void dropExchangeSlot(); + void showExchangeSlot(); void updateWorldGenDebugVisualization(); public: diff --git a/src/voxels/Block.hpp b/src/voxels/Block.hpp index e7fb182cf..557bf04cb 100644 --- a/src/voxels/Block.hpp +++ b/src/voxels/Block.hpp @@ -181,7 +181,7 @@ class Block { bool translucent = false; /// @brief Set of block physical hitboxes - std::vector hitboxes; + std::vector hitboxes {AABB()}; /// @brief Set of available block rotations (coord-systems) BlockRotProfile rotations = BlockRotProfile::NONE;