bool DecoSchematic::getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2) { ManualMapVoxelManipulator *vm = new ManualMapVoxelManipulator(map); v3s16 bp1 = getNodeBlockPos(p1); v3s16 bp2 = getNodeBlockPos(p2); vm->initialEmerge(bp1, bp2); size = p2 - p1 + 1; slice_probs = new u8[size.Y]; for (s16 y = 0; y != size.Y; y++) slice_probs[y] = MTSCHEM_PROB_ALWAYS; schematic = new MapNode[size.X * size.Y * size.Z]; u32 i = 0; for (s16 z = p1.Z; z <= p2.Z; z++) for (s16 y = p1.Y; y <= p2.Y; y++) { u32 vi = vm->m_area.index(p1.X, y, z); for (s16 x = p1.X; x <= p2.X; x++, i++, vi++) { schematic[i] = vm->m_data[vi]; schematic[i].param1 = MTSCHEM_PROB_ALWAYS; } } delete vm; return true; }
int LuaVoxelManip::l_write_to_map(lua_State *L) { LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; vm->blitBackAll(&o->modified_blocks); return 0; }
int LuaVoxelManip::l_read_from_map(lua_State *L) { LuaVoxelManip *o = checkobject(L, 1); ManualMapVoxelManipulator *vm = o->vm; v3s16 bp1 = getNodeBlockPos(read_v3s16(L, 2)); v3s16 bp2 = getNodeBlockPos(read_v3s16(L, 3)); sortBoxVerticies(bp1, bp2); vm->initialEmerge(bp1, bp2); push_v3s16(L, vm->m_area.MinEdge); push_v3s16(L, vm->m_area.MaxEdge); return 2; }
void DecoSchematic::placeStructure(Map *map, v3s16 p, bool force_placement) { assert(schematic != NULL); ManualMapVoxelManipulator *vm = new ManualMapVoxelManipulator(map); Rotation rot = (rotation == ROTATE_RAND) ? (Rotation)myrand_range(ROTATE_0, ROTATE_270) : rotation; v3s16 s = (rot == ROTATE_90 || rot == ROTATE_270) ? v3s16(size.Z, size.Y, size.X) : size; if (flags & DECO_PLACE_CENTER_X) p.X -= (s.X + 1) / 2; if (flags & DECO_PLACE_CENTER_Y) p.Y -= (s.Y + 1) / 2; if (flags & DECO_PLACE_CENTER_Z) p.Z -= (s.Z + 1) / 2; v3s16 bp1 = getNodeBlockPos(p); v3s16 bp2 = getNodeBlockPos(p + s - v3s16(1,1,1)); vm->initialEmerge(bp1, bp2); blitToVManip(p, vm, rot, force_placement); std::map<v3s16, MapBlock *> lighting_modified_blocks; std::map<v3s16, MapBlock *> modified_blocks; vm->blitBackAll(&modified_blocks); // TODO: Optimize this by using Mapgen::calcLighting() instead lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end()); map->updateLighting(lighting_modified_blocks, modified_blocks, 100); MapEditEvent event; event.type = MEET_OTHER; for (std::map<v3s16, MapBlock *>::iterator it = modified_blocks.begin(); it != modified_blocks.end(); ++it) event.modified_blocks.insert(it->first); map->dispatchEvent(&event); }
void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree, INodeDefManager *ndef, int seed) { MapNode treenode(ndef->getId("mapgen_tree")); MapNode leavesnode(ndef->getId("mapgen_leaves")); MapNode applenode(ndef->getId("mapgen_apple")); s16 trunk_h = rand() % 8 + 6 ; v3s16 p1 = p0; VoxelArea leaves_a(v3s16(-3,-2,-3), v3s16(3,3,3)); if(is_apple_tree){trunk_h = 5;} for(s16 trunk=0; trunk<=trunk_h -1 ; trunk++) { if(vmanip.m_area.contains(p1)) if(vmanip.getNodeNoExNoEmerge(p1).getContent() == CONTENT_AIR) vmanip.m_data[vmanip.m_area.index(p1)] = treenode; p1.Y++; } for(s16 z= -3; z<= 3; z++) for(s16 y= -2; y<= 3; y++) for(s16 x= -3; x<= 3; x++) { u32 vi = vmanip.m_area.index(v3s16(p0.X + x, p0.Y + y + trunk_h -1, p0.Z + z)); if (vmanip.m_area.contains(vi) == false) {continue;} if (rand() % 30 > 22) {continue;} if ( (std::abs(x) + std::abs(z) < 5) && (std::abs(x) + std::abs(y) < 5) && (std::abs(z) + std::abs(y) < 5) ) { if(vmanip.m_data[vi].getContent() != CONTENT_AIR && vmanip.m_data[vi].getContent() != CONTENT_IGNORE ) {continue;} bool is_apple = is_apple_tree && rand() % 50 <= 10; vmanip.m_data[vi] = is_apple ? applenode : leavesnode; } } }