]> git.lizzy.rs Git - minetest.git/commitdiff
Add wallmounted support for plantlike and plantlike_rooted nodes (#11379)
authorWuzzy <wuzzy2@mail.ru>
Thu, 15 Jul 2021 19:19:59 +0000 (19:19 +0000)
committerGitHub <noreply@github.com>
Thu, 15 Jul 2021 19:19:59 +0000 (21:19 +0200)
builtin/game/falling.lua
doc/lua_api.txt
games/devtest/mods/testnodes/drawtypes.lua
games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png [new file with mode: 0644]
games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png [new file with mode: 0644]
games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png [new file with mode: 0644]
src/client/content_mapblock.cpp
src/client/content_mapblock.h
src/mapnode.cpp

index 4a13b0776a74782843662bbfaf856cc55f62c73e..6db56353449535fa45add44b4051feaa475d898f 100644 (file)
@@ -157,7 +157,8 @@ core.register_entity(":__builtin:falling_node", {
                                if euler then
                                        self.object:set_rotation(euler)
                                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
                                if (def.drawtype == "signlike" and def.paramtype2 ~= "wallmounted" and def.paramtype2 ~= "colorwallmounted") then
                                        -- Change rotation to "floor" by default for non-wallmounted paramtype2
index ad11d7235211ab3238e44bbd5b3ddac53f708cc8..3c96d0b36cfb60bf63e417abc77b4e4a92100bbc 100644 (file)
@@ -1022,7 +1022,8 @@ The function of `param2` is determined by `paramtype2` in node definition.
       to access/manipulate the content of this field
     * Bit 3: If set, liquid is flowing downwards (no graphical effect)
 * `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`
     * You can make this value by using `minetest.dir_to_wallmounted()`
     * Values range 0 - 5
@@ -1198,7 +1199,12 @@ Look for examples in `games/devtest` or `games/minetest_game`.
 * `plantlike_rooted`
     * Enables underwater `plantlike` without air bubbles around the nodes.
     * 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
       base cube without affecting them.
     * The base cube texture tiles are defined as normal, the `plantlike`
index 2bc7ec2e3d5e5a29e8b2fa5f23e84fd822309cf4..208774f6c09ab110be3acb5bdb3488dc31d22fe9 100644 (file)
@@ -208,6 +208,19 @@ minetest.register_node("testnodes:plantlike_waving", {
        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
@@ -320,6 +333,20 @@ minetest.register_node("testnodes:plantlike_rooted", {
        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", {
        description = S("Waving Rooted Plantlike Drawtype Test Node"),
        drawtype = "plantlike_rooted",
@@ -588,6 +615,9 @@ scale("allfaces_optional_waving",
 scale("plantlike",
        S("Double-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",
        S("Double-sized Wallmounted Torchlike Drawtype Test Node"),
        S("Half-sized Wallmounted Torchlike Drawtype Test Node"))
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png
new file mode 100644 (file)
index 0000000..b0be8d0
Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_base_side_wallmounted.png differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png
new file mode 100644 (file)
index 0000000..4214664
Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_rooted_wallmounted.png differ
diff --git a/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png
new file mode 100644 (file)
index 0000000..c89b29e
Binary files /dev/null and b/games/devtest/mods/testnodes/textures/testnodes_plantlike_wallmounted.png differ
index 810c57138cabd2e8ad286ddb6378574a47cb1103..bb2d6398f1015c855a19d07dc3f495fbcaeaafa2 100644 (file)
@@ -958,10 +958,38 @@ void MapblockMeshGenerator::drawPlantlikeQuad(float rotation, float quad_offset,
                vertex.rotateXZBy(rotation + rotate_degree);
                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);
 }
 
-void MapblockMeshGenerator::drawPlantlike()
+void MapblockMeshGenerator::drawPlantlike(bool is_rooted)
 {
        draw_style = PLANT_STYLE_CROSS;
        scale = BS / 2 * f->visual_scale;
@@ -998,6 +1026,22 @@ void MapblockMeshGenerator::drawPlantlike()
                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) {
        case PLANT_STYLE_CROSS:
                drawPlantlikeQuad(46);
@@ -1048,7 +1092,7 @@ void MapblockMeshGenerator::drawPlantlikeRootedNode()
                MapNode ntop = data->m_vmanip.getNodeNoEx(blockpos_nodes + p);
                light = LightPair(getInteriorLight(ntop, 1, nodedef));
        }
-       drawPlantlike();
+       drawPlantlike(true);
        p.Y--;
 }
 
index 237cc7847d9628df50109f7ed122548cc46e0e26..7344f05ee20cdcf7d307c38a74b9aa134bbd4cd5 100644 (file)
@@ -146,7 +146,7 @@ class MapblockMeshGenerator
 
        void drawPlantlikeQuad(float rotation, float quad_offset = 0,
                bool offset_top_only = false);
-       void drawPlantlike();
+       void drawPlantlike(bool is_rooted = false);
 
 // firelike-specific
        void drawFirelikeQuad(float rotation, float opening_angle,
index c885bfe1dbfcec10504863442b4e023967af0642..f212ea8c9bf8e0edde93000ab49090f1c8910247 100644 (file)
@@ -161,7 +161,9 @@ u8 MapNode::getWallMounted(const NodeDefManager *nodemgr) const
        if (f.param_type_2 == CPT2_WALLMOUNTED ||
                        f.param_type_2 == CPT2_COLORED_WALLMOUNTED) {
                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 0;