From 34eabf4df0ba895ac40f1506c700ea56e6f8ad79 Mon Sep 17 00:00:00 2001 From: Kahrl <kahrl@gmx.net> Date: Tue, 7 Feb 2012 03:05:15 +0100 Subject: [PATCH] Fix rail's selection box and tweak the logic that computes pointedthing.node_abovesurface -- you no longer can place torches above each other, or do similar placement with other nodes with non-full selection box. --- data/mods/default/init.lua | 2 +- src/game.cpp | 68 ++++++++++++-------------------------- 2 files changed, 23 insertions(+), 47 deletions(-) diff --git a/data/mods/default/init.lua b/data/mods/default/init.lua index f0e6b6dc2..dad7f126a 100644 --- a/data/mods/default/init.lua +++ b/data/mods/default/init.lua @@ -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), }) diff --git a/src/game.cpp b/src/game.cpp index df41e7da5..5f7eaa8c4 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -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(); -- 2.25.1