Add wallmounted support for plantlike and plantlike_rooted nodes (#11379)

This commit is contained in:
Wuzzy 2021-07-15 19:19:59 +00:00 committed by GitHub
parent 68143ed8ec
commit f4d8cc0f0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 90 additions and 7 deletions

@ -157,7 +157,8 @@ core.register_entity(":__builtin:falling_node", {
if euler then if euler then
self.object:set_rotation(euler) self.object:set_rotation(euler)
end end
elseif (def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" or def.drawtype == "signlike") then elseif (def.drawtype ~= "plantlike" and def.drawtype ~= "plantlike_rooted" and
(def.paramtype2 == "wallmounted" or def.paramtype2 == "colorwallmounted" or def.drawtype == "signlike")) then
local rot = node.param2 % 8 local rot = node.param2 % 8
if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then
-- Change rotation to "floor" by default for non-wallmounted paramtype2 -- Change rotation to "floor" by default for non-wallmounted paramtype2

@ -1022,7 +1022,8 @@ The function of `param2` is determined by `paramtype2` in node definition.
to access/manipulate the content of this field to access/manipulate the content of this field
* Bit 3: If set, liquid is flowing downwards (no graphical effect) * Bit 3: If set, liquid is flowing downwards (no graphical effect)
* `paramtype2 = "wallmounted"` * `paramtype2 = "wallmounted"`
* Supported drawtypes: "torchlike", "signlike", "normal", "nodebox", "mesh" * Supported drawtypes: "torchlike", "signlike", "plantlike",
"plantlike_rooted", "normal", "nodebox", "mesh"
* The rotation of the node is stored in `param2` * The rotation of the node is stored in `param2`
* You can make this value by using `minetest.dir_to_wallmounted()` * You can make this value by using `minetest.dir_to_wallmounted()`
* Values range 0 - 5 * Values range 0 - 5
@ -1198,7 +1199,12 @@ Look for examples in `games/devtest` or `games/minetest_game`.
* `plantlike_rooted` * `plantlike_rooted`
* Enables underwater `plantlike` without air bubbles around the nodes. * Enables underwater `plantlike` without air bubbles around the nodes.
* Consists of a base cube at the co-ordinates of the node plus a * Consists of a base cube at the co-ordinates of the node plus a
`plantlike` extension above with a height of `param2 / 16` nodes. `plantlike` extension above
* If `paramtype2="leveled", the `plantlike` extension has a height
of `param2 / 16` nodes, otherwise it's the height of 1 node
* If `paramtype2="wallmounted"`, the `plantlike` extension
will be at one of the corresponding 6 sides of the base cube.
Also, the base cube rotates like a `normal` cube would
* The `plantlike` extension visually passes through any nodes above the * The `plantlike` extension visually passes through any nodes above the
base cube without affecting them. base cube without affecting them.
* The base cube texture tiles are defined as normal, the `plantlike` * The base cube texture tiles are defined as normal, the `plantlike`

@ -208,6 +208,19 @@ minetest.register_node("testnodes:plantlike_waving", {
groups = { dig_immediate = 3 }, groups = { dig_immediate = 3 },
}) })
minetest.register_node("testnodes:plantlike_wallmounted", {
description = S("Wallmounted Plantlike Drawtype Test Node"),
drawtype = "plantlike",
paramtype = "light",
paramtype2 = "wallmounted",
tiles = { "testnodes_plantlike_wallmounted.png" },
leveled = 1,
walkable = false,
sunlight_propagates = true,
groups = { dig_immediate = 3 },
})
-- param2 will rotate -- param2 will rotate
@ -320,6 +333,20 @@ minetest.register_node("testnodes:plantlike_rooted", {
groups = { dig_immediate = 3 }, groups = { dig_immediate = 3 },
}) })
minetest.register_node("testnodes:plantlike_rooted_wallmounted", {
description = S("Wallmounted Rooted Plantlike Drawtype Test Node"),
drawtype = "plantlike_rooted",
paramtype = "light",
paramtype2 = "wallmounted",
tiles = {
"testnodes_plantlike_rooted_base.png",
"testnodes_plantlike_rooted_base.png",
"testnodes_plantlike_rooted_base_side_wallmounted.png" },
special_tiles = { "testnodes_plantlike_rooted_wallmounted.png" },
groups = { dig_immediate = 3 },
})
minetest.register_node("testnodes:plantlike_rooted_waving", { minetest.register_node("testnodes:plantlike_rooted_waving", {
description = S("Waving Rooted Plantlike Drawtype Test Node"), description = S("Waving Rooted Plantlike Drawtype Test Node"),
drawtype = "plantlike_rooted", drawtype = "plantlike_rooted",
@ -588,6 +615,9 @@ scale("allfaces_optional_waving",
scale("plantlike", scale("plantlike",
S("Double-sized Plantlike Drawtype Test Node"), S("Double-sized Plantlike Drawtype Test Node"),
S("Half-sized Plantlike Drawtype Test Node")) S("Half-sized Plantlike Drawtype Test Node"))
scale("plantlike_wallmounted",
S("Double-sized Wallmounted Plantlike Drawtype Test Node"),
S("Half-sized Wallmounted Plantlike Drawtype Test Node"))
scale("torchlike_wallmounted", scale("torchlike_wallmounted",
S("Double-sized Wallmounted Torchlike Drawtype Test Node"), S("Double-sized Wallmounted Torchlike Drawtype Test Node"),
S("Half-sized Wallmounted Torchlike Drawtype Test Node")) S("Half-sized Wallmounted Torchlike Drawtype Test Node"))

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

@ -958,10 +958,38 @@ void MapblockMeshGenerator::drawPlantlikeQuad(float rotation, float quad_offset,
vertex.rotateXZBy(rotation + rotate_degree); vertex.rotateXZBy(rotation + rotate_degree);
vertex += offset; vertex += offset;
} }
u8 wall = n.getWallMounted(nodedef);
if (wall != DWM_YN) {
for (v3f &vertex : vertices) {
switch (wall) {
case DWM_YP:
vertex.rotateYZBy(180);
vertex.rotateXZBy(180);
break;
case DWM_XP:
vertex.rotateXYBy(90);
break;
case DWM_XN:
vertex.rotateXYBy(-90);
vertex.rotateYZBy(180);
break;
case DWM_ZP:
vertex.rotateYZBy(-90);
vertex.rotateXYBy(90);
break;
case DWM_ZN:
vertex.rotateYZBy(90);
vertex.rotateXYBy(90);
break;
}
}
}
drawQuad(vertices, v3s16(0, 0, 0), plant_height); drawQuad(vertices, v3s16(0, 0, 0), plant_height);
} }
void MapblockMeshGenerator::drawPlantlike() void MapblockMeshGenerator::drawPlantlike(bool is_rooted)
{ {
draw_style = PLANT_STYLE_CROSS; draw_style = PLANT_STYLE_CROSS;
scale = BS / 2 * f->visual_scale; scale = BS / 2 * f->visual_scale;
@ -998,6 +1026,22 @@ void MapblockMeshGenerator::drawPlantlike()
break; break;
} }
if (is_rooted) {
u8 wall = n.getWallMounted(nodedef);
switch (wall) {
case DWM_YP:
offset.Y += BS*2;
break;
case DWM_XN:
case DWM_XP:
case DWM_ZN:
case DWM_ZP:
offset.X += -BS;
offset.Y += BS;
break;
}
}
switch (draw_style) { switch (draw_style) {
case PLANT_STYLE_CROSS: case PLANT_STYLE_CROSS:
drawPlantlikeQuad(46); drawPlantlikeQuad(46);
@ -1048,7 +1092,7 @@ void MapblockMeshGenerator::drawPlantlikeRootedNode()
MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p); MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p);
light = LightPair(getInteriorLight(ntop, 1, nodedef)); light = LightPair(getInteriorLight(ntop, 1, nodedef));
} }
drawPlantlike(); drawPlantlike(true);
p.Y--; p.Y--;
} }

@ -146,7 +146,7 @@ public:
void drawPlantlikeQuad(float rotation, float quad_offset = 0, void drawPlantlikeQuad(float rotation, float quad_offset = 0,
bool offset_top_only = false); bool offset_top_only = false);
void drawPlantlike(); void drawPlantlike(bool is_rooted = false);
// firelike-specific // firelike-specific
void drawFirelikeQuad(float rotation, float opening_angle, void drawFirelikeQuad(float rotation, float opening_angle,

@ -161,7 +161,9 @@ u8 MapNode::getWallMounted(const NodeDefManager *nodemgr) const
if (f.param_type_2 == CPT2_WALLMOUNTED || if (f.param_type_2 == CPT2_WALLMOUNTED ||
f.param_type_2 == CPT2_COLORED_WALLMOUNTED) { f.param_type_2 == CPT2_COLORED_WALLMOUNTED) {
return getParam2() & 0x07; return getParam2() & 0x07;
} else if (f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_TORCHLIKE) { } else if (f.drawtype == NDT_SIGNLIKE || f.drawtype == NDT_TORCHLIKE ||
f.drawtype == NDT_PLANTLIKE ||
f.drawtype == NDT_PLANTLIKE_ROOTED) {
return 1; return 1;
} }
return 0; return 0;