mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-06 17:41:04 +00:00
Merge remote branch 'upstream_kahrl/collision_allow_stairs_v2' into object_object_collision
This commit is contained in:
commit
c525330153
2 changed files with 23 additions and 47 deletions
|
@ -1302,7 +1302,7 @@ minetest.register_node("default:rail", {
|
||||||
walkable = false,
|
walkable = false,
|
||||||
selection_box = {
|
selection_box = {
|
||||||
type = "fixed",
|
type = "fixed",
|
||||||
--fixed = <default>
|
fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
|
||||||
},
|
},
|
||||||
material = minetest.digprop_dirtlike(0.75),
|
material = minetest.digprop_dirtlike(0.75),
|
||||||
})
|
})
|
||||||
|
|
68
src/game.cpp
68
src/game.cpp
|
@ -362,15 +362,6 @@ PointedThing getPointedThing(Client *client, v3f player_position,
|
||||||
if(!isPointableNode(n, client, liquids_pointable))
|
if(!isPointableNode(n, client, liquids_pointable))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
v3s16 facedirs[6] = {
|
|
||||||
v3s16(-1,0,0),
|
|
||||||
v3s16(1,0,0),
|
|
||||||
v3s16(0,-1,0),
|
|
||||||
v3s16(0,1,0),
|
|
||||||
v3s16(0,0,-1),
|
|
||||||
v3s16(0,0,1),
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<aabb3f> boxes = n.getSelectionBoxes(client->ndef());
|
std::vector<aabb3f> boxes = n.getSelectionBoxes(client->ndef());
|
||||||
|
|
||||||
v3s16 np(x,y,z);
|
v3s16 np(x,y,z);
|
||||||
|
@ -384,52 +375,37 @@ PointedThing getPointedThing(Client *client, v3f player_position,
|
||||||
box.MinEdge += npf;
|
box.MinEdge += npf;
|
||||||
box.MaxEdge += npf;
|
box.MaxEdge += npf;
|
||||||
|
|
||||||
f32 d = 0.001*BS;
|
|
||||||
aabb3f faceboxes[6] = {
|
|
||||||
// X-
|
|
||||||
aabb3f(
|
|
||||||
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
|
||||||
box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z
|
|
||||||
),
|
|
||||||
// X+
|
|
||||||
aabb3f(
|
|
||||||
box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z,
|
|
||||||
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
|
||||||
),
|
|
||||||
// Y-
|
|
||||||
aabb3f(
|
|
||||||
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
|
||||||
box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z
|
|
||||||
),
|
|
||||||
// Y+
|
|
||||||
aabb3f(
|
|
||||||
box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z,
|
|
||||||
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
|
||||||
),
|
|
||||||
// Z-
|
|
||||||
aabb3f(
|
|
||||||
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
|
||||||
box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d
|
|
||||||
),
|
|
||||||
// Z+
|
|
||||||
aabb3f(
|
|
||||||
box.MinEdge.X, box.MinEdge.Y, box.MaxEdge.Z-d,
|
|
||||||
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
|
||||||
),
|
|
||||||
};
|
|
||||||
|
|
||||||
for(u16 j=0; j<6; j++)
|
for(u16 j=0; j<6; j++)
|
||||||
{
|
{
|
||||||
v3f centerpoint = faceboxes[j].getCenter();
|
v3s16 facedir = g_6dirs[j];
|
||||||
|
aabb3f facebox = box;
|
||||||
|
|
||||||
|
f32 d = 0.001*BS;
|
||||||
|
if(facedir.X > 0)
|
||||||
|
facebox.MinEdge.X = facebox.MaxEdge.X-d;
|
||||||
|
else if(facedir.X < 0)
|
||||||
|
facebox.MaxEdge.X = facebox.MinEdge.X+d;
|
||||||
|
else if(facedir.Y > 0)
|
||||||
|
facebox.MinEdge.Y = facebox.MaxEdge.Y-d;
|
||||||
|
else if(facedir.Y < 0)
|
||||||
|
facebox.MaxEdge.Y = facebox.MinEdge.Y+d;
|
||||||
|
else if(facedir.Z > 0)
|
||||||
|
facebox.MinEdge.Z = facebox.MaxEdge.Z-d;
|
||||||
|
else if(facedir.Z < 0)
|
||||||
|
facebox.MaxEdge.Z = facebox.MinEdge.Z+d;
|
||||||
|
|
||||||
|
v3f centerpoint = facebox.getCenter();
|
||||||
f32 distance = (centerpoint - camera_position).getLength();
|
f32 distance = (centerpoint - camera_position).getLength();
|
||||||
if(distance >= mindistance)
|
if(distance >= mindistance)
|
||||||
continue;
|
continue;
|
||||||
if(!faceboxes[j].intersectsWithLine(shootline))
|
if(!facebox.intersectsWithLine(shootline))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
v3s16 np_above = floatToInt(centerpoint + intToFloat(facedir, d), BS);
|
||||||
|
|
||||||
result.type = POINTEDTHING_NODE;
|
result.type = POINTEDTHING_NODE;
|
||||||
result.node_undersurface = np;
|
result.node_undersurface = np;
|
||||||
result.node_abovesurface = np+facedirs[j];
|
result.node_abovesurface = np_above;
|
||||||
mindistance = distance;
|
mindistance = distance;
|
||||||
|
|
||||||
hilightboxes.clear();
|
hilightboxes.clear();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue