forked from Mirrorlandia_minetest/minetest
Make fence post selection box smaller and create code to allow node placement to the side of a static box
This commit is contained in:
parent
de51f87e05
commit
e9620d9c8c
@ -375,6 +375,9 @@ void content_mapnode_init(ITextureSource *tsrc, IWritableNodeDefManager *nodemgr
|
|||||||
f->air_equivalent = true; // grass grows underneath
|
f->air_equivalent = true; // grass grows underneath
|
||||||
f->setInventoryTexture("fence.png", tsrc);
|
f->setInventoryTexture("fence.png", tsrc);
|
||||||
f->used_texturenames.insert("fence.png"); // Add to atlas
|
f->used_texturenames.insert("fence.png"); // Add to atlas
|
||||||
|
f->selection_box.type = NODEBOX_FIXED;
|
||||||
|
f->selection_box.fixed = core::aabbox3d<f32>(
|
||||||
|
-BS/7, -BS/2, -BS/7, BS/7, BS/2, BS/7);
|
||||||
setWoodLikeMaterialProperties(f->material, 0.75);
|
setWoodLikeMaterialProperties(f->material, 0.75);
|
||||||
|
|
||||||
i = CONTENT_RAIL;
|
i = CONTENT_RAIL;
|
||||||
|
58
src/game.cpp
58
src/game.cpp
@ -348,24 +348,68 @@ void getPointedNode(Client *client, v3f player_position,
|
|||||||
|
|
||||||
if(f.selection_box.type == NODEBOX_FIXED)
|
if(f.selection_box.type == NODEBOX_FIXED)
|
||||||
{
|
{
|
||||||
f32 distance = (npf - camera_position).getLength();
|
|
||||||
|
|
||||||
core::aabbox3d<f32> box = f.selection_box.fixed;
|
core::aabbox3d<f32> box = f.selection_box.fixed;
|
||||||
box.MinEdge += npf;
|
box.MinEdge += npf;
|
||||||
box.MaxEdge += npf;
|
box.MaxEdge += npf;
|
||||||
|
|
||||||
if(distance < mindistance)
|
v3s16 facedirs[6] = {
|
||||||
{
|
v3s16(-1,0,0),
|
||||||
if(box.intersectsWithLine(shootline))
|
v3s16(1,0,0),
|
||||||
|
v3s16(0,-1,0),
|
||||||
|
v3s16(0,1,0),
|
||||||
|
v3s16(0,0,-1),
|
||||||
|
v3s16(0,0,1),
|
||||||
|
};
|
||||||
|
|
||||||
|
core::aabbox3d<f32> faceboxes[6] = {
|
||||||
|
// X-
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
||||||
|
box.MinEdge.X+d, box.MaxEdge.Y, box.MaxEdge.Z
|
||||||
|
),
|
||||||
|
// X+
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MaxEdge.X-d, box.MinEdge.Y, box.MinEdge.Z,
|
||||||
|
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
||||||
|
),
|
||||||
|
// Y-
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
||||||
|
box.MaxEdge.X, box.MinEdge.Y+d, box.MaxEdge.Z
|
||||||
|
),
|
||||||
|
// Y+
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MinEdge.X, box.MaxEdge.Y-d, box.MinEdge.Z,
|
||||||
|
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
||||||
|
),
|
||||||
|
// Z-
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MinEdge.X, box.MinEdge.Y, box.MinEdge.Z,
|
||||||
|
box.MaxEdge.X, box.MaxEdge.Y, box.MinEdge.Z+d
|
||||||
|
),
|
||||||
|
// Z+
|
||||||
|
core::aabbox3d<f32>(
|
||||||
|
box.MinEdge.X, box.MinEdge.Y, box.MaxEdge.Z-d,
|
||||||
|
box.MaxEdge.X, box.MaxEdge.Y, box.MaxEdge.Z
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
for(u16 i=0; i<6; i++)
|
||||||
{
|
{
|
||||||
|
v3f facedir_f(facedirs[i].X, facedirs[i].Y, facedirs[i].Z);
|
||||||
|
v3f centerpoint = npf + facedir_f * BS/2;
|
||||||
|
f32 distance = (centerpoint - camera_position).getLength();
|
||||||
|
if(distance >= mindistance)
|
||||||
|
continue;
|
||||||
|
if(!faceboxes[i].intersectsWithLine(shootline))
|
||||||
|
continue;
|
||||||
nodefound = true;
|
nodefound = true;
|
||||||
nodepos = np;
|
nodepos = np;
|
||||||
neighbourpos = np;
|
neighbourpos = np+facedirs[i];
|
||||||
mindistance = distance;
|
mindistance = distance;
|
||||||
nodehilightbox = box;
|
nodehilightbox = box;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else if(f.selection_box.type == NODEBOX_WALLMOUNTED)
|
else if(f.selection_box.type == NODEBOX_WALLMOUNTED)
|
||||||
{
|
{
|
||||||
v3s16 dir = unpackDir(n.param2);
|
v3s16 dir = unpackDir(n.param2);
|
||||||
|
Loading…
Reference in New Issue
Block a user