mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 03:23:45 +01:00
Add object's own position for each collision to moveresult (#14608)
This commit is contained in:
parent
d7f9da49eb
commit
af8cb63292
@ -40,6 +40,7 @@ core.features = {
|
|||||||
lsystem_decoration_type = true,
|
lsystem_decoration_type = true,
|
||||||
item_meta_range = true,
|
item_meta_range = true,
|
||||||
node_interaction_actor = true,
|
node_interaction_actor = true,
|
||||||
|
moveresult_new_pos = true,
|
||||||
}
|
}
|
||||||
|
|
||||||
function core.has_feature(arg)
|
function core.has_feature(arg)
|
||||||
|
@ -103,7 +103,7 @@ if core.set_push_moveresult1 then
|
|||||||
-- must match CollisionAxis in collision.h
|
-- must match CollisionAxis in collision.h
|
||||||
local AXES = {"x", "y", "z"}
|
local AXES = {"x", "y", "z"}
|
||||||
-- <=> script/common/c_content.cpp push_collision_move_result()
|
-- <=> script/common/c_content.cpp push_collision_move_result()
|
||||||
core.set_push_moveresult1(function(b0, b1, b2, axis, npx, npy, npz, v0x, v0y, v0z, v1x, v1y, v1z)
|
core.set_push_moveresult1(function(b0, b1, b2, axis, npx, npy, npz, v0x, v0y, v0z, v1x, v1y, v1z, v2x, v2y, v2z)
|
||||||
return {
|
return {
|
||||||
touching_ground = b0,
|
touching_ground = b0,
|
||||||
collides = b1,
|
collides = b1,
|
||||||
@ -112,8 +112,9 @@ if core.set_push_moveresult1 then
|
|||||||
type = "node",
|
type = "node",
|
||||||
axis = AXES[axis],
|
axis = AXES[axis],
|
||||||
node_pos = vector.new(npx, npy, npz),
|
node_pos = vector.new(npx, npy, npz),
|
||||||
old_velocity = vector.new(v0x, v0y, v0z),
|
new_pos = vector.new(v0x, v0y, v0z),
|
||||||
new_velocity = vector.new(v1x, v1y, v1z),
|
old_velocity = vector.new(v1x, v1y, v1z),
|
||||||
|
new_velocity = vector.new(v2x, v2y, v2z),
|
||||||
}},
|
}},
|
||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
@ -5124,6 +5124,9 @@ Collision info passed to `on_step` (`moveresult` argument):
|
|||||||
axis = string, -- "x", "y" or "z"
|
axis = string, -- "x", "y" or "z"
|
||||||
node_pos = vector, -- if type is "node"
|
node_pos = vector, -- if type is "node"
|
||||||
object = ObjectRef, -- if type is "object"
|
object = ObjectRef, -- if type is "object"
|
||||||
|
-- The position of the entity when the collision occurred.
|
||||||
|
-- Available since feature "moveresult_new_pos".
|
||||||
|
new_pos = vector,
|
||||||
old_velocity = vector,
|
old_velocity = vector,
|
||||||
new_velocity = vector,
|
new_velocity = vector,
|
||||||
},
|
},
|
||||||
@ -5437,6 +5440,8 @@ Utilities
|
|||||||
-- Allow passing an optional "actor" ObjectRef to the following functions:
|
-- Allow passing an optional "actor" ObjectRef to the following functions:
|
||||||
-- minetest.place_node, minetest.dig_node, minetest.punch_node (5.9.0)
|
-- minetest.place_node, minetest.dig_node, minetest.punch_node (5.9.0)
|
||||||
node_interaction_actor = true,
|
node_interaction_actor = true,
|
||||||
|
-- "new_pos" field in entity moveresult (5.9.0)
|
||||||
|
moveresult_new_pos = true,
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -510,6 +510,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
|
|||||||
|
|
||||||
info.node_p = nearest_info.position;
|
info.node_p = nearest_info.position;
|
||||||
info.object = nearest_info.obj;
|
info.object = nearest_info.obj;
|
||||||
|
info.new_pos = *pos_f;
|
||||||
info.old_speed = *speed_f;
|
info.old_speed = *speed_f;
|
||||||
info.plane = nearest_collided;
|
info.plane = nearest_collided;
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ struct CollisionInfo
|
|||||||
CollisionAxis axis = COLLISION_AXIS_NONE;
|
CollisionAxis axis = COLLISION_AXIS_NONE;
|
||||||
v3s16 node_p = v3s16(-32768,-32768,-32768); // COLLISION_NODE
|
v3s16 node_p = v3s16(-32768,-32768,-32768); // COLLISION_NODE
|
||||||
ActiveObject *object = nullptr; // COLLISION_OBJECT
|
ActiveObject *object = nullptr; // COLLISION_OBJECT
|
||||||
|
v3f new_pos;
|
||||||
v3f old_speed;
|
v3f old_speed;
|
||||||
v3f new_speed;
|
v3f new_speed;
|
||||||
int plane = -1;
|
int plane = -1;
|
||||||
|
@ -2492,12 +2492,12 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res)
|
|||||||
lua_pushinteger(L, c.node_p.X);
|
lua_pushinteger(L, c.node_p.X);
|
||||||
lua_pushinteger(L, c.node_p.Y);
|
lua_pushinteger(L, c.node_p.Y);
|
||||||
lua_pushinteger(L, c.node_p.Z);
|
lua_pushinteger(L, c.node_p.Z);
|
||||||
for (v3f v : {c.old_speed / BS, c.new_speed / BS}) {
|
for (v3f v : {c.new_pos / BS, c.old_speed / BS, c.new_speed / BS}) {
|
||||||
lua_pushnumber(L, v.X);
|
lua_pushnumber(L, v.X);
|
||||||
lua_pushnumber(L, v.Y);
|
lua_pushnumber(L, v.Y);
|
||||||
lua_pushnumber(L, v.Z);
|
lua_pushnumber(L, v.Z);
|
||||||
}
|
}
|
||||||
lua_call(L, 3 + 1 + 3 + 3 * 2, 1);
|
lua_call(L, 3 + 1 + 3 + 3 * 3, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2511,7 +2511,7 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res)
|
|||||||
lua_createtable(L, res.collisions.size(), 0);
|
lua_createtable(L, res.collisions.size(), 0);
|
||||||
int i = 1;
|
int i = 1;
|
||||||
for (const auto &c : res.collisions) {
|
for (const auto &c : res.collisions) {
|
||||||
lua_createtable(L, 0, 5);
|
lua_createtable(L, 0, 6);
|
||||||
|
|
||||||
lua_pushstring(L, collision_type_str[c.type]);
|
lua_pushstring(L, collision_type_str[c.type]);
|
||||||
lua_setfield(L, -2, "type");
|
lua_setfield(L, -2, "type");
|
||||||
@ -2528,6 +2528,9 @@ void push_collision_move_result(lua_State *L, const collisionMoveResult &res)
|
|||||||
lua_setfield(L, -2, "object");
|
lua_setfield(L, -2, "object");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
push_v3f(L, c.new_pos / BS);
|
||||||
|
lua_setfield(L, -2, "new_pos");
|
||||||
|
|
||||||
push_v3f(L, c.old_speed / BS);
|
push_v3f(L, c.old_speed / BS);
|
||||||
lua_setfield(L, -2, "old_velocity");
|
lua_setfield(L, -2, "old_velocity");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user