void Interface::PlaceBlock() {
        if (!aim_world) return;
 
-       glm::vec3 next_pos = aim_world.BlockCoords() + aim_world.normal;
-       BlockLookup next_block(&aim_world.GetChunk(), next_pos);
-       if (next_block) {
+       BlockLookup next_block(aim_world.chunk, aim_world.BlockPos(), Block::NormalFace(aim_world.normal));
+       if (!next_block) {
+               return;
        }
        next_block.SetBlock(selection);
 
        const Entity &player = ctrl.Controlled();
        env.audio.Play(
                place_sound,
-               aim_world.GetChunk().ToSceneCoords(player.ChunkCoords(), next_pos)
+               next_block.GetChunk().ToSceneCoords(player.ChunkCoords(), next_block.GetBlockCoords())
        );
 }
 
 
        // only valid if lookup was successful
        Chunk &GetChunk() const noexcept { return *chunk; }
        const Chunk::Pos &GetBlockPos() const noexcept { return pos; }
+       Block::Pos GetBlockCoords() const noexcept { return Chunk::ToCoords(pos); }
        const Block &GetBlock() const noexcept { return GetChunk().BlockAt(GetBlockPos()); }
        const BlockType &GetType() const noexcept { return GetChunk().Type(GetBlock()); }
        int GetLight() const noexcept { return GetChunk().GetLight(GetBlockPos()); }
 
 
        bool Blocks() const noexcept { return chunk->Type(block).collide_block; }
 
-       glm::vec3 BlockPos() const noexcept { return Chunk::ToPos(block); }
+       glm::ivec3 BlockPos() const noexcept { return Chunk::ToPos(block); }
        glm::vec3 BlockCoords() const noexcept { return Chunk::ToCoords(block); }
        glm::mat4 BlockTransform() const noexcept { return GetChunk().ToTransform(BlockPos(), block); }