diff --git a/builtin/common/misc_helpers.lua b/builtin/common/misc_helpers.lua index f7111680c..1c7ff3958 100644 --- a/builtin/common/misc_helpers.lua +++ b/builtin/common/misc_helpers.lua @@ -691,3 +691,35 @@ end function core.strip_colors(str) return (str:gsub(ESCAPE_CHAR .. "%([bc]@[^)]+%)", "")) end + +-------------------------------------------------------------------------------- +-- Returns the exact coordinate of a pointed surface +-------------------------------------------------------------------------------- +function core.pointed_thing_to_face_pos(placer, pointed_thing) + local eye_offset_first = placer:get_eye_offset() + local node_pos = pointed_thing.under + local camera_pos = placer:get_pos() + local pos_off = vector.multiply( + vector.subtract(pointed_thing.above, node_pos), 0.5) + local look_dir = placer:get_look_dir() + local offset, nc + local oc = {} + + for c, v in pairs(pos_off) do + if v == 0 then + oc[#oc + 1] = c + else + offset = v + nc = c + end + end + local fine_pos = {[nc] = node_pos[nc] + offset} + camera_pos.y = camera_pos.y + 1.625 + eye_offset_first.y / 10 + local f = (node_pos[nc] + offset - camera_pos[nc]) / look_dir[nc] + + for i = 1, #oc do + fine_pos[oc[i]] = camera_pos[oc[i]] + look_dir[oc[i]] * f + end + return fine_pos +end + diff --git a/doc/client_lua_api.md b/doc/client_lua_api.md index deb5bfb13..c9ccbeefa 100644 --- a/doc/client_lua_api.md +++ b/doc/client_lua_api.md @@ -752,6 +752,8 @@ Call these functions only at load time! extra arguments and return the result * `fgettext(string, ...)` : returns string * same as fgettext_ne(), but calls minetest.formspec_escape before returning result +* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position + * returns the exact position on the surface of a pointed node ### UI * `minetest.ui.minimap` @@ -827,7 +829,7 @@ The following functions provide escape sequences: * Removes background colors added by `get_background_escape_sequence`. * `color.strip_colors(str)` * Removes all color escape sequences. - + `ColorString` ------------- `#RGB` defines a color in hexadecimal format. diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 0ca3767f9..0d3f00c67 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1939,6 +1939,8 @@ Helper functions * returns time with microsecond precision. May not return wall time. * `table.copy(table)`: returns a table * returns a deep copy of `table` +* `minetest.pointed_thing_to_face_pos(placer, pointed_thing)`: returns a position + * returns the exact position on the surface of a pointed node `minetest` namespace reference ------------------------------