Place schematic (on vmanip): Enable use of 'place center' flags
For 'place schematic' and 'place schematic on vmanip' APIs. Fix 'place center' code to properly centre schematics. Fix some comments.master
parent
6c9df2ffa7
commit
c610643c4c
|
@ -3276,7 +3276,7 @@ These functions return the leftover itemstack.
|
||||||
* If slice probability list equals `nil`, no slice probabilities are applied.
|
* If slice probability list equals `nil`, no slice probabilities are applied.
|
||||||
* Saves schematic in the Minetest Schematic format to filename.
|
* Saves schematic in the Minetest Schematic format to filename.
|
||||||
|
|
||||||
* `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement)`
|
* `minetest.place_schematic(pos, schematic, rotation, replacements, force_placement, flags)`
|
||||||
* Place the schematic specified by schematic (see: Schematic specifier) at `pos`.
|
* Place the schematic specified by schematic (see: Schematic specifier) at `pos`.
|
||||||
* `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
|
* `rotation` can equal `"0"`, `"90"`, `"180"`, `"270"`, or `"random"`.
|
||||||
* If the `rotation` parameter is omitted, the schematic is not rotated.
|
* If the `rotation` parameter is omitted, the schematic is not rotated.
|
||||||
|
@ -3288,14 +3288,22 @@ These functions return the leftover itemstack.
|
||||||
will always use the cached version and the replacement list defined for it,
|
will always use the cached version and the replacement list defined for it,
|
||||||
regardless of whether the file or the replacement list parameter have changed.
|
regardless of whether the file or the replacement list parameter have changed.
|
||||||
The only way to load the file anew is to restart the server.
|
The only way to load the file anew is to restart the server.
|
||||||
|
* `flags` is a flag field with the available flags:
|
||||||
|
* place_center_x
|
||||||
|
* place_center_y
|
||||||
|
* place_center_z
|
||||||
|
|
||||||
* `minetest.place_schematic_on_vmanip(vmanip, pos, schematic, rotation, replacement, force_placement)`:
|
* `minetest.place_schematic_on_vmanip(vmanip, pos, schematic, rotation, replacement, force_placement, flags)`:
|
||||||
* This function is analogous to minetest.place_schematic, but places a schematic onto the
|
* This function is analogous to minetest.place_schematic, but places a schematic onto the
|
||||||
specified VoxelManip object `vmanip` instead of the whole map.
|
specified VoxelManip object `vmanip` instead of the whole map.
|
||||||
* Returns false if any part of the schematic was cut-off due to the VoxelManip not
|
* Returns false if any part of the schematic was cut-off due to the VoxelManip not
|
||||||
containing the full area required, and true if the whole schematic was able to fit.
|
containing the full area required, and true if the whole schematic was able to fit.
|
||||||
* Returns nil if the schematic could not be loaded.
|
* Returns nil if the schematic could not be loaded.
|
||||||
* After execution, any external copies of the VoxelManip contents are invalidated.
|
* After execution, any external copies of the VoxelManip contents are invalidated.
|
||||||
|
* `flags` is a flag field with the available flags:
|
||||||
|
* place_center_x
|
||||||
|
* place_center_y
|
||||||
|
* place_center_z
|
||||||
|
|
||||||
* `minetest.serialize_schematic(schematic, format, options)`
|
* `minetest.serialize_schematic(schematic, format, options)`
|
||||||
* Return the serialized schematic specified by schematic (see: Schematic specifier)
|
* Return the serialized schematic specified by schematic (see: Schematic specifier)
|
||||||
|
|
|
@ -188,15 +188,15 @@ bool Schematic::placeOnVManip(MMVManip *vm, v3s16 p, u32 flags,
|
||||||
|
|
||||||
//// Adjust placement position if necessary
|
//// Adjust placement position if necessary
|
||||||
if (flags & DECO_PLACE_CENTER_X)
|
if (flags & DECO_PLACE_CENTER_X)
|
||||||
p.X -= (s.X + 1) / 2;
|
p.X -= (s.X - 1) / 2;
|
||||||
if (flags & DECO_PLACE_CENTER_Y)
|
if (flags & DECO_PLACE_CENTER_Y)
|
||||||
p.Y -= (s.Y + 1) / 2;
|
p.Y -= (s.Y - 1) / 2;
|
||||||
if (flags & DECO_PLACE_CENTER_Z)
|
if (flags & DECO_PLACE_CENTER_Z)
|
||||||
p.Z -= (s.Z + 1) / 2;
|
p.Z -= (s.Z - 1) / 2;
|
||||||
|
|
||||||
blitToVManip(vm, p, rot, force_place);
|
blitToVManip(vm, p, rot, force_place);
|
||||||
|
|
||||||
return vm->m_area.contains(VoxelArea(p, p + s - v3s16(1,1,1)));
|
return vm->m_area.contains(VoxelArea(p, p + s - v3s16(1, 1, 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags,
|
void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags,
|
||||||
|
@ -219,16 +219,16 @@ void Schematic::placeOnMap(ServerMap *map, v3s16 p, u32 flags,
|
||||||
|
|
||||||
//// Adjust placement position if necessary
|
//// Adjust placement position if necessary
|
||||||
if (flags & DECO_PLACE_CENTER_X)
|
if (flags & DECO_PLACE_CENTER_X)
|
||||||
p.X -= (s.X + 1) / 2;
|
p.X -= (s.X - 1) / 2;
|
||||||
if (flags & DECO_PLACE_CENTER_Y)
|
if (flags & DECO_PLACE_CENTER_Y)
|
||||||
p.Y -= (s.Y + 1) / 2;
|
p.Y -= (s.Y - 1) / 2;
|
||||||
if (flags & DECO_PLACE_CENTER_Z)
|
if (flags & DECO_PLACE_CENTER_Z)
|
||||||
p.Z -= (s.Z + 1) / 2;
|
p.Z -= (s.Z - 1) / 2;
|
||||||
|
|
||||||
//// Create VManip for effected area, emerge our area, modify area
|
//// Create VManip for effected area, emerge our area, modify area
|
||||||
//// inside VManip, then blit back.
|
//// inside VManip, then blit back.
|
||||||
v3s16 bp1 = getNodeBlockPos(p);
|
v3s16 bp1 = getNodeBlockPos(p);
|
||||||
v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1,1,1));
|
v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1, 1, 1));
|
||||||
|
|
||||||
MMVManip vm(map);
|
MMVManip vm(map);
|
||||||
vm.initialEmerge(bp1, bp2);
|
vm.initialEmerge(bp1, bp2);
|
||||||
|
|
|
@ -1529,7 +1529,8 @@ int ModApiMapgen::l_create_schematic(lua_State *L)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// place_schematic(p, schematic, rotation, replacement)
|
// place_schematic(p, schematic, rotation,
|
||||||
|
// replacements, force_placement, flagstring)
|
||||||
int ModApiMapgen::l_place_schematic(lua_State *L)
|
int ModApiMapgen::l_place_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
MAP_LOCK_REQUIRED;
|
MAP_LOCK_REQUIRED;
|
||||||
|
@ -1565,12 +1566,19 @@ int ModApiMapgen::l_place_schematic(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
schem->placeOnMap(map, p, 0, (Rotation)rot, force_placement);
|
//// Read flags
|
||||||
|
u32 flags = 0;
|
||||||
|
read_flags(L, 6, flagdesc_deco, &flags, NULL);
|
||||||
|
|
||||||
|
schem->placeOnMap(map, p, flags, (Rotation)rot, force_placement);
|
||||||
|
|
||||||
lua_pushboolean(L, true);
|
lua_pushboolean(L, true);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// place_schematic_on_vmanip(vm, p, schematic, rotation,
|
||||||
|
// replacements, force_placement, flagstring)
|
||||||
int ModApiMapgen::l_place_schematic_on_vmanip(lua_State *L)
|
int ModApiMapgen::l_place_schematic_on_vmanip(lua_State *L)
|
||||||
{
|
{
|
||||||
NO_MAP_LOCK_REQUIRED;
|
NO_MAP_LOCK_REQUIRED;
|
||||||
|
@ -1606,13 +1614,18 @@ int ModApiMapgen::l_place_schematic_on_vmanip(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//// Read flags
|
||||||
|
u32 flags = 0;
|
||||||
|
read_flags(L, 7, flagdesc_deco, &flags, NULL);
|
||||||
|
|
||||||
bool schematic_did_fit = schem->placeOnVManip(
|
bool schematic_did_fit = schem->placeOnVManip(
|
||||||
vm, p, 0, (Rotation)rot, force_placement);
|
vm, p, flags, (Rotation)rot, force_placement);
|
||||||
|
|
||||||
lua_pushboolean(L, schematic_did_fit);
|
lua_pushboolean(L, schematic_did_fit);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// serialize_schematic(schematic, format, options={...})
|
// serialize_schematic(schematic, format, options={...})
|
||||||
int ModApiMapgen::l_serialize_schematic(lua_State *L)
|
int ModApiMapgen::l_serialize_schematic(lua_State *L)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,10 +70,10 @@ private:
|
||||||
// get_noiseparam_defaults(name)
|
// get_noiseparam_defaults(name)
|
||||||
static int l_get_noiseparams(lua_State *L);
|
static int l_get_noiseparams(lua_State *L);
|
||||||
|
|
||||||
// set_gen_notify(flagstring)
|
// set_gen_notify(flags, {deco_id_table})
|
||||||
static int l_set_gen_notify(lua_State *L);
|
static int l_set_gen_notify(lua_State *L);
|
||||||
|
|
||||||
// set_gen_notify(flagstring)
|
// get_gen_notify()
|
||||||
static int l_get_gen_notify(lua_State *L);
|
static int l_get_gen_notify(lua_State *L);
|
||||||
|
|
||||||
// register_biome({lots of stuff})
|
// register_biome({lots of stuff})
|
||||||
|
@ -109,11 +109,12 @@ private:
|
||||||
// create_schematic(p1, p2, probability_list, filename)
|
// create_schematic(p1, p2, probability_list, filename)
|
||||||
static int l_create_schematic(lua_State *L);
|
static int l_create_schematic(lua_State *L);
|
||||||
|
|
||||||
// place_schematic(p, schematic, rotation, replacements, force_placement)
|
// place_schematic(p, schematic, rotation,
|
||||||
|
// replacements, force_placement, flagstring)
|
||||||
static int l_place_schematic(lua_State *L);
|
static int l_place_schematic(lua_State *L);
|
||||||
|
|
||||||
// place_schematic_on_vmanip(vm, p, schematic,
|
// place_schematic_on_vmanip(vm, p, schematic, rotation,
|
||||||
// rotation, replacements, force_placement)
|
// replacements, force_placement, flagstring)
|
||||||
static int l_place_schematic_on_vmanip(lua_State *L);
|
static int l_place_schematic_on_vmanip(lua_State *L);
|
||||||
|
|
||||||
// serialize_schematic(schematic, format, options={...})
|
// serialize_schematic(schematic, format, options={...})
|
||||||
|
|
Loading…
Reference in New Issue