mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
Allow giving "pointabilities" to Lua raycasts (#14390)
This commit is contained in:
parent
aac616fcc5
commit
e40417f687
@ -6202,13 +6202,16 @@ Environment access
|
|||||||
* Returns the position of the blocking node when `false`
|
* Returns the position of the blocking node when `false`
|
||||||
* `pos1`: First position
|
* `pos1`: First position
|
||||||
* `pos2`: Second position
|
* `pos2`: Second position
|
||||||
* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast`
|
* `minetest.raycast(pos1, pos2, objects, liquids, pointabilities)`: returns `Raycast`
|
||||||
* Creates a `Raycast` object.
|
* Creates a `Raycast` object.
|
||||||
* `pos1`: start of the ray
|
* `pos1`: start of the ray
|
||||||
* `pos2`: end of the ray
|
* `pos2`: end of the ray
|
||||||
* `objects`: if false, only nodes will be returned. Default is `true`.
|
* `objects`: if false, only nodes will be returned. Default is `true`.
|
||||||
* `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be
|
* `liquids`: if false, liquid nodes (`liquidtype ~= "none"`) won't be
|
||||||
returned. Default is `false`.
|
returned. Default is `false`.
|
||||||
|
* `pointabilities`: Allows overriding the `pointable` property of
|
||||||
|
nodes and objects. Uses the same format as the `pointabilities` property
|
||||||
|
of item definitions. Default is `nil`.
|
||||||
* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
|
* `minetest.find_path(pos1,pos2,searchdistance,max_jump,max_drop,algorithm)`
|
||||||
* returns table containing path that can be walked on
|
* returns table containing path that can be walked on
|
||||||
* returns a table of 3D points representing a path from `pos1` to `pos2` or
|
* returns a table of 3D points representing a path from `pos1` to `pos2` or
|
||||||
@ -8939,9 +8942,9 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
|
|||||||
objects = {
|
objects = {
|
||||||
["modname:entityname"] = true,
|
["modname:entityname"] = true,
|
||||||
["group:ghosty"] = true, -- (an armor group)
|
["group:ghosty"] = true, -- (an armor group)
|
||||||
}
|
|
||||||
},
|
},
|
||||||
-- Contains lists to override the `pointable` property of pointed nodes and objects.
|
},
|
||||||
|
-- Contains lists to override the `pointable` property of nodes and objects.
|
||||||
-- The index can be a node/entity name or a group with the prefix `"group:"`.
|
-- The index can be a node/entity name or a group with the prefix `"group:"`.
|
||||||
-- (For objects `armor_groups` are used and for players the entity name is irrelevant.)
|
-- (For objects `armor_groups` are used and for players the entity name is irrelevant.)
|
||||||
-- If multiple fields fit, the following priority order is applied:
|
-- If multiple fields fit, the following priority order is applied:
|
||||||
|
@ -182,6 +182,7 @@ dofile(modpath .. "/get_version.lua")
|
|||||||
dofile(modpath .. "/itemstack_equals.lua")
|
dofile(modpath .. "/itemstack_equals.lua")
|
||||||
dofile(modpath .. "/content_ids.lua")
|
dofile(modpath .. "/content_ids.lua")
|
||||||
dofile(modpath .. "/metadata.lua")
|
dofile(modpath .. "/metadata.lua")
|
||||||
|
dofile(modpath .. "/raycast.lua")
|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
|
36
games/devtest/mods/unittests/raycast.lua
Normal file
36
games/devtest/mods/unittests/raycast.lua
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
local function raycast_with_pointabilities(start_pos, end_pos, pointabilities)
|
||||||
|
local ray = core.raycast(start_pos, end_pos, nil, nil, pointabilities)
|
||||||
|
for hit in ray do
|
||||||
|
if hit.type == "node" then
|
||||||
|
return hit.under
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function test_raycast_pointabilities(player, pos1)
|
||||||
|
local pos2 = pos1:offset(0, 0, 1)
|
||||||
|
local pos3 = pos1:offset(0, 0, 2)
|
||||||
|
|
||||||
|
local oldnode1 = core.get_node(pos1)
|
||||||
|
local oldnode2 = core.get_node(pos2)
|
||||||
|
local oldnode3 = core.get_node(pos3)
|
||||||
|
core.swap_node(pos1, {name = "air"})
|
||||||
|
core.swap_node(pos2, {name = "testnodes:not_pointable"})
|
||||||
|
core.swap_node(pos3, {name = "testnodes:pointable"})
|
||||||
|
|
||||||
|
local p = nil
|
||||||
|
assert(raycast_with_pointabilities(pos1, pos3, p) == pos3)
|
||||||
|
|
||||||
|
p = core.registered_items["testtools:blocked_pointing_staff"].pointabilities
|
||||||
|
assert(raycast_with_pointabilities(pos1, pos3, p) == nil)
|
||||||
|
|
||||||
|
p = core.registered_items["testtools:ultimate_pointing_staff"].pointabilities
|
||||||
|
assert(raycast_with_pointabilities(pos1, pos3, p) == pos2)
|
||||||
|
|
||||||
|
core.swap_node(pos1, oldnode1)
|
||||||
|
core.swap_node(pos2, oldnode2)
|
||||||
|
core.swap_node(pos3, oldnode3)
|
||||||
|
end
|
||||||
|
|
||||||
|
unittests.register("test_raycast_pointabilities", test_raycast_pointabilities, {map=true})
|
@ -177,6 +177,7 @@ int LuaRaycast::create_object(lua_State *L)
|
|||||||
|
|
||||||
bool objects = true;
|
bool objects = true;
|
||||||
bool liquids = false;
|
bool liquids = false;
|
||||||
|
std::optional<Pointabilities> pointabilities = std::nullopt;
|
||||||
|
|
||||||
v3f pos1 = checkFloatPos(L, 1);
|
v3f pos1 = checkFloatPos(L, 1);
|
||||||
v3f pos2 = checkFloatPos(L, 2);
|
v3f pos2 = checkFloatPos(L, 2);
|
||||||
@ -186,9 +187,12 @@ int LuaRaycast::create_object(lua_State *L)
|
|||||||
if (lua_isboolean(L, 4)) {
|
if (lua_isboolean(L, 4)) {
|
||||||
liquids = readParam<bool>(L, 4);
|
liquids = readParam<bool>(L, 4);
|
||||||
}
|
}
|
||||||
|
if (lua_istable(L, 5)) {
|
||||||
|
pointabilities = read_pointabilities(L, 5);
|
||||||
|
}
|
||||||
|
|
||||||
LuaRaycast *o = new LuaRaycast(core::line3d<f32>(pos1, pos2),
|
LuaRaycast *o = new LuaRaycast(core::line3d<f32>(pos1, pos2),
|
||||||
objects, liquids, std::nullopt);
|
objects, liquids, pointabilities);
|
||||||
|
|
||||||
*(void **) (lua_newuserdata(L, sizeof(void *))) = o;
|
*(void **) (lua_newuserdata(L, sizeof(void *))) = o;
|
||||||
luaL_getmetatable(L, className);
|
luaL_getmetatable(L, className);
|
||||||
|
Loading…
Reference in New Issue
Block a user