Fix rail's selection box and tweak the logic that computes pointedthing.node_abovesur...
authorKahrl <kahrl@gmx.net>
Tue, 7 Feb 2012 02:05:15 +0000 (03:05 +0100)
committerKahrl <kahrl@gmx.net>
Tue, 7 Feb 2012 02:05:15 +0000 (03:05 +0100)
data/mods/default/init.lua
src/game.cpp

index f0e6b6dc230117c7a3f95f0afd4c2057fe4240f0..dad7f126a763e9a4daa34cc5c5fbddd1570617f2 100644 (file)
@@ -1296,7 +1296,7 @@ minetest.register_node("default:rail", {
        walkable = false,
        selection_box = {
                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),
 })
index df41e7da56d6226928bfdf4912ff66646402f587..5f7eaa8c40bba7d8914b2ff22106914d43de949f 100644 (file)
@@ -362,15 +362,6 @@ PointedThing getPointedThing(Client *client, v3f player_position,
                if(!isPointableNode(n, client, liquids_pointable))
                        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());
 
                v3s16 np(x,y,z);
@@ -384,52 +375,37 @@ PointedThing getPointedThing(Client *client, v3f player_position,
                        box.MinEdge += 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++)
                        {
-                               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();
                                if(distance >= mindistance)
                                        continue;
-                               if(!faceboxes[j].intersectsWithLine(shootline))
+                               if(!facebox.intersectsWithLine(shootline))
                                        continue;
 
+                               v3s16 np_above = floatToInt(centerpoint + intToFloat(facedir, d), BS);
+
                                result.type = POINTEDTHING_NODE;
                                result.node_undersurface = np;
-                               result.node_abovesurface = np+facedirs[j];
+                               result.node_abovesurface = np_above;
                                mindistance = distance;
 
                                hilightboxes.clear();