}
-void DecorationManager::clear()
-{
- for (size_t i = 0; i < m_objects.size(); i++) {
- Decoration *deco = (Decoration *)m_objects[i];
- delete deco;
- }
- m_objects.clear();
-}
-
-
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, v3s16 p)
+DecoSchematic::DecoSchematic()
{
- if (flags & DECO_PLACE_CENTER_X)
- p.X -= (schematic->size.X + 1) / 2;
- if (flags & DECO_PLACE_CENTER_Y)
- p.Y -= (schematic->size.Y + 1) / 2;
- if (flags & DECO_PLACE_CENTER_Z)
- p.Z -= (schematic->size.Z + 1) / 2;
+ schematic = NULL;
+}
- bool force_placement = (flags & DECO_FORCE_PLACEMENT);
- if (!vm->m_area.contains(p))
+size_t DecoSchematic::generate(MMVManip *vm, PseudoRandom *pr, v3s16 p)
+{
+ // Schematic could have been unloaded but not the decoration
+ // In this case generate() does nothing (but doesn't *fail*)
+ if (schematic == NULL)
return 0;
u32 vi = vm->m_area.index(p);
if (!CONTAINS(c_place_on, c))
return 0;
+ if (flags & DECO_PLACE_CENTER_X)
+ p.X -= (schematic->size.X - 1) / 2;
+ if (flags & DECO_PLACE_CENTER_Y)
+ p.Y -= (schematic->size.Y - 1) / 2;
+ if (flags & DECO_PLACE_CENTER_Z)
+ p.Z -= (schematic->size.Z - 1) / 2;
+
Rotation rot = (rotation == ROTATE_RAND) ?
(Rotation)pr->range(ROTATE_0, ROTATE_270) : rotation;
- schematic->blitToVManip(p, vm, rot, force_placement, m_ndef);
+ bool force_placement = (flags & DECO_FORCE_PLACEMENT);
+
+ schematic->blitToVManip(p, vm, rot, force_placement);
return 1;
}