add 'grounded' support for 'pipe' rotation profile

This commit is contained in:
MihailRis 2024-07-10 09:14:24 +03:00
parent 359123bb36
commit 4c8ae465c7
4 changed files with 21 additions and 5 deletions

View File

@ -13,5 +13,6 @@
"light-passing": true,
"shadeless": true,
"obstacle": false,
"grounded": true,
"rotation": "pipe"
}

View File

@ -84,9 +84,12 @@ void BlocksController::updateBlock(int x, int y, int z) {
if (vox == nullptr)
return;
const Block* def = level->content->getIndices()->getBlockDef(vox->id);
if (def->grounded && !chunks->isSolidBlock(x, y-1, z)) {
breakBlock(nullptr, def, x, y, z);
return;
if (def->grounded) {
const auto& vec = get_ground_direction(def, vox->state.rotation);
if (!chunks->isSolidBlock(x+vec.x, y+vec.y, z+vec.z)) {
breakBlock(nullptr, def, x, y, z);
return;
}
}
if (def->rt.funcsset.update) {
scripting::update_block(def, x, y, z);

View File

@ -404,8 +404,11 @@ void PlayerController::processRightClick(Block* def, Block* target) {
if (!chunks->checkReplaceability(def, state, coord)) {
return;
}
if (def->grounded && !chunks->isSolidBlock(coord.x, coord.y-1, coord.z)) {
return;
if (def->grounded) {
const auto& vec = get_ground_direction(def, state.rotation);
if (!chunks->isSolidBlock(coord.x+vec.x, coord.y+vec.y, coord.z+vec.z)) {
return;
}
}
if (chosenBlock != vox->id && chosenBlock) {
onBlockInteraction(coord, def, BlockInteraction::placing);

View File

@ -202,4 +202,13 @@ public:
Block(const Block&) = delete;
};
inline glm::ivec3 get_ground_direction(const Block* def, int rotation) {
const auto& profileName = def->rotations.name;
if (profileName == BlockRotProfile::PIPE_NAME) {
return -def->rotations.variants[rotation].axisY;
} else {
return glm::ivec3(0, -1, 0);
}
}
#endif // VOXELS_BLOCK_HPP_