|
26 | 26 | */
|
27 | 27 | #include <gk/core/Debug.hpp>
|
28 | 28 |
|
| 29 | +#include "BlockPlacementConstraints.hpp" |
29 | 30 | #include "LuaBlockLoader.hpp"
|
30 | 31 | #include "LuaMod.hpp"
|
31 | 32 | #include "Registry.hpp"
|
@@ -77,6 +78,7 @@ void LuaBlockLoader::loadBlockState(BlockState &state, const sol::table &table,
|
77 | 78 | loadBoundingBox(state, table);
|
78 | 79 | loadItemDrop(state, table);
|
79 | 80 | loadColorMultiplier(state, table);
|
| 81 | + loadPlacementConstraints(block, table); |
80 | 82 |
|
81 | 83 | loadStates(block, state, table);
|
82 | 84 | }
|
@@ -213,6 +215,39 @@ inline void LuaBlockLoader::loadStates(ServerBlock &block, BlockState &state, co
|
213 | 215 | }
|
214 | 216 | }
|
215 | 217 |
|
| 218 | +inline void LuaBlockLoader::loadPlacementConstraints(ServerBlock &block, const sol::table &table) const { |
| 219 | + sol::object constraintsObject = table["placement_constraints"]; |
| 220 | + if (constraintsObject.valid()) { |
| 221 | + if (constraintsObject.get_type() == sol::type::table) { |
| 222 | + sol::table constraintsTable = constraintsObject.as<sol::table>(); |
| 223 | + for (auto &constraintsObject : constraintsTable) { |
| 224 | + BlockPlacementConstraint constraint; |
| 225 | + |
| 226 | + sol::optional<sol::table> blockOffset = constraintsObject.first.as<sol::table>(); |
| 227 | + if (blockOffset != sol::nullopt) { |
| 228 | + constraint.blockOffset.x = blockOffset.value().get<u32>(1); |
| 229 | + constraint.blockOffset.y = blockOffset.value().get<u32>(2); |
| 230 | + constraint.blockOffset.z = blockOffset.value().get<u32>(3); |
| 231 | + } |
| 232 | + else |
| 233 | + gkError() << "For block" << block.stringID() << ": 'placement_constraints' offset is wrong"; |
| 234 | + |
| 235 | + sol::optional<sol::table> constraintTable = constraintsObject.second.as<sol::table>(); |
| 236 | + if (constraintTable != sol::nullopt) { |
| 237 | + constraint.blockID = constraintTable.value()["block"].get<std::string>(); |
| 238 | + constraint.isWhitelist = constraintTable.value()["is_whitelist"].get<bool>(); |
| 239 | + } |
| 240 | + else |
| 241 | + gkError() << "For block" << block.stringID() << ": 'placement_constraints' table is wrong"; |
| 242 | + |
| 243 | + block.placementConstraints().addConstraint(constraint); |
| 244 | + } |
| 245 | + } |
| 246 | + else |
| 247 | + gkError() << "For block" << block.stringID() << ": 'placement_constraints' must be a table"; |
| 248 | + } |
| 249 | +} |
| 250 | + |
216 | 251 | inline void LuaBlockLoader::loadGroups(ServerBlock &block, const sol::table &table, Item *item) const {
|
217 | 252 | sol::object groupsObject = table["groups"];
|
218 | 253 | if (groupsObject.valid()) {
|
|
0 commit comments