Biome API: Enable decorations placed on water
authorparamat <mat.gregory@virginmedia.com>
Thu, 5 Mar 2015 01:53:11 +0000 (01:53 +0000)
committerparamat <mat.gregory@virginmedia.com>
Fri, 6 Mar 2015 03:32:15 +0000 (03:32 +0000)
Add schematic decoration force placement flag

doc/lua_api.txt
src/mg_decoration.cpp
src/mg_decoration.h

index e2589d226f5c5f8187aca7ea3c93d9ada8dbb565..5fa164e6b675ec50bdecdb435308dde52d17459f 100644 (file)
@@ -792,11 +792,13 @@ Schematic attributes
 --------------------
 See section "Flag Specifier Format".
 
-Currently supported flags: `place_center_x`, `place_center_y`, `place_center_z`.
+Currently supported flags: `place_center_x`, `place_center_y`,
+                          `place_center_z`, `force_placement`.
 
 * `place_center_x`: Placement of this decoration is centered along the X axis.
 * `place_center_y`: Placement of this decoration is centered along the Y axis.
 * `place_center_z`: Placement of this decoration is centered along the Z axis.
+* `force_placement`: Schematic nodes other than "ignore" will replace existing nodes.
 
 
 HUD element types
@@ -3191,8 +3193,10 @@ Definition tables
         schematic = {
             size = {x=4, y=6, z=4},
             data = {
-                {name="cobble", param1=255, param2=0},
-                {name="dirt_with_grass", param1=255, param2=0},
+                {name="default:cobble", param1=255, param2=0},
+                {name="default:dirt_with_grass", param1=255, param2=0},
+                {name="ignore", param1=255, param2=0},
+                {name="air", param1=255, param2=0},
                  ...
             },
             yslice_prob = {
@@ -3203,7 +3207,7 @@ Definition tables
         },
     --  ^ See 'Schematic specifier' for details.
         replacements = {["oldname"] = "convert_to", ...},
-        flags = "place_center_x, place_center_z",
+        flags = "place_center_x, place_center_y, place_center_z, force_placement",
     --  ^ Flags for schematic decorations.  See 'Schematic attributes'.
         rotation = "90" -- rotate schematic 90 degrees on placement
     --  ^ Rotation can be "0", "90", "180", "270", or "random".
index a67c3cd8cfd325ce863b5b058f066ba9654bece8..ab9401e28629c9593149b89c9886454f36c8114c 100644 (file)
@@ -31,6 +31,7 @@ FlagDesc flagdesc_deco[] = {
        {"place_center_x", DECO_PLACE_CENTER_X},
        {"place_center_y", DECO_PLACE_CENTER_Y},
        {"place_center_z", DECO_PLACE_CENTER_Z},
+       {"force_placement", DECO_FORCE_PLACEMENT},
        {NULL,             0}
 };
 
@@ -140,6 +141,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                        s16 y = mg->heightmap ?
                                        mg->heightmap[mapindex] :
                                        mg->findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y);
+                       y = MYMAX(y, mg->water_level);
 
                        if (y < nmin.Y || y > nmax.Y ||
                                y < y_min  || y > y_max)
@@ -333,6 +335,8 @@ size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, s16 max_y, v3s16
        if (flags & DECO_PLACE_CENTER_Z)
                p.Z -= (schematic->size.Z + 1) / 2;
 
+       bool force_placement = (flags & DECO_FORCE_PLACEMENT);
+
        if (!vm->m_area.contains(p))
                return 0;
 
@@ -344,7 +348,7 @@ size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, s16 max_y, v3s16
        Rotation rot = (rotation == ROTATE_RAND) ?
                (Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation;
 
-       schematic->blitToVManip(p, vm, rot, false, m_ndef);
+       schematic->blitToVManip(p, vm, rot, force_placement, m_ndef);
 
        return 1;
 }
index ab4a9377b49361999f6dc9d77e8c4cea44f03e7b..fd7739b926e7d439e571606bb0181b1c1147f287 100644 (file)
@@ -35,10 +35,11 @@ enum DecorationType {
        DECO_LSYSTEM
 };
 
-#define DECO_PLACE_CENTER_X 0x01
-#define DECO_PLACE_CENTER_Y 0x02
-#define DECO_PLACE_CENTER_Z 0x04
-#define DECO_USE_NOISE      0x08
+#define DECO_PLACE_CENTER_X  0x01
+#define DECO_PLACE_CENTER_Y  0x02
+#define DECO_PLACE_CENTER_Z  0x04
+#define DECO_USE_NOISE       0x08
+#define DECO_FORCE_PLACEMENT 0x10
 
 extern FlagDesc flagdesc_deco[];