Posted: Sat Aug 10, 2013 23:50
Sam in all of his/her glory: (made by Jordach on the logoskyblock server)
The official Minetest discussion board
https://forum.minetest.net/
8 minutes? oOHybrid Dog wrote:I edited the nuke mod and made a big hole with vm (it took ca. 8min) (r=120):
Code: Select all
local vm = minetest.get_voxel_manip()
local p1, p2 = vm:read_from_map(
{x=-IRON_TNT_RANGE+pos.x, y=-IRON_TNT_RANGE+pos.y, z=-IRON_TNT_RANGE+pos.z},
{x=IRON_TNT_RANGE+pos.x, y=IRON_TNT_RANGE+pos.y, z=IRON_TNT_RANGE+pos.z}
)
local va = VoxelArea:new{MinEdge=p1, MaxEdge=p2}
local data = vm:get_data()
for x=-IRON_TNT_RANGE,IRON_TNT_RANGE do
for y=-IRON_TNT_RANGE,IRON_TNT_RANGE do
for z=-IRON_TNT_RANGE,IRON_TNT_RANGE do
if x*x+y*y+z*z <= IRON_TNT_RANGE * IRON_TNT_RANGE + IRON_TNT_RANGE then
local i = va:index(pos.x+x, pos.y+y, pos.z+z)
--activate_if_tnt(data[i], {x=pos.x+x,y=pos.y+y,z=pos.z+z}, pos, IRON_TNT_RANGE)
data[i] = c_air
end
end
end
end
vm:set_data(data)
vm:write_to_map()
vm:update_map()
It looks like you are using the building_blocks mod. There is a newer version of it out than what you have. You might want to get it.Shire wrote:http://i1203.photobucket.com/albums/bb3 ... cf7d4c.png
A "small" part to a much larger project that I hope to complete some time soon. EDIT! I've come to the conclusion that this'll take a week or so. There's going to be four towers, each comprised of seven layers and a glass roof. The seven layers will be as followed:
22 blocks
20 blocks
18 blocks
16 blocks
14 blocks
12 blocks
10 blocks
...And then each tower will be capped by triangular, obsidian glass roof. The four towers will be connected by halls that will be eighty-six blocks in length...at an unknown height of blocks. I have no idea what'll be in the center of this.
I'll look into updating and downloading that mod then as soon as possible.Inocudom wrote:It looks like you are using the building_blocks mod. There is a newer version of it out than what you have. You might want to get it.Shire wrote:http://i1203.photobucket.com/albums/bb3 ... cf7d4c.png
A "small" part to a much larger project that I hope to complete some time soon. EDIT! I've come to the conclusion that this'll take a week or so. There's going to be four towers, each comprised of seven layers and a glass roof. The seven layers will be as followed:
22 blocks
20 blocks
18 blocks
16 blocks
14 blocks
12 blocks
10 blocks
...And then each tower will be capped by triangular, obsidian glass roof. The four towers will be connected by halls that will be eighty-six blocks in length...at an unknown height of blocks. I have no idea what'll be in the center of this.
Your project looks like it could be interesting.
You do have too much code in the time critical part.Hybrid Dog wrote:this is my code:PilzAdam wrote:8 minutes? oOHybrid Dog wrote:I edited the nuke mod and made a big hole with vm (it took ca. 8min) (r=120):
I tried it myself and it took more like 20 seconds. Here is the relevant code:Make sure that c_air is defined.Code: Select all
local vm = minetest.get_voxel_manip() local p1, p2 = vm:read_from_map( {x=-IRON_TNT_RANGE+pos.x, y=-IRON_TNT_RANGE+pos.y, z=-IRON_TNT_RANGE+pos.z}, {x=IRON_TNT_RANGE+pos.x, y=IRON_TNT_RANGE+pos.y, z=IRON_TNT_RANGE+pos.z} ) local va = VoxelArea:new{MinEdge=p1, MaxEdge=p2} local data = vm:get_data() for x=-IRON_TNT_RANGE,IRON_TNT_RANGE do for y=-IRON_TNT_RANGE,IRON_TNT_RANGE do for z=-IRON_TNT_RANGE,IRON_TNT_RANGE do if x*x+y*y+z*z <= IRON_TNT_RANGE * IRON_TNT_RANGE + IRON_TNT_RANGE then local i = va:index(pos.x+x, pos.y+y, pos.z+z) --activate_if_tnt(data[i], {x=pos.x+x,y=pos.y+y,z=pos.z+z}, pos, IRON_TNT_RANGE) data[i] = c_air end end end end vm:set_data(data) vm:write_to_map() vm:update_map()
Also the mapblock sending takes long, you are faster when you just rejoin the server (or restart singleplayer).So it's not necessary to set ignore everywhere?Code: Select all
local function explode(pos, range) local t1 = os.clock() local manip = minetest.get_voxel_manip() local width = range+1 local emerged_pos1, emerged_pos2 = manip:read_from_map({x=pos.x-width, y=pos.y-width, z=pos.z-width}, {x=pos.x+width, y=pos.y+width, z=pos.z+width}) local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) local nodes = {} local ignore = minetest.get_content_id("ignore") for i = 1, get_volume(emerged_pos1, emerged_pos2) do nodes[i] = ignore end local c_air = minetest.get_content_id("air") local radius = range^2 + range for x=-range,range do for y=-range,range do for z=-range,range do local r = x^2+y^2+z^2 if r <= radius then local np={x=pos.x+x, y=pos.y+y, z=pos.z+z} local n = minetest.env:get_node(np) if n.name ~= "air" and n.name ~= "default:chest" then -- and math.random(1,2^rad) < range*8 then if math.floor(math.sqrt(r) +0.5) > range-1 then if math.random(1,5) >= 2 then destroy_node(np) if minetest.env:get_node(np).name ~= "default:chest" then nodes[area:index(np.x, np.y, np.z)] = c_air end elseif math.random(1,10) == 1 then minetest.sound_play("default_glass_footstep", {pos = np, gain = 0.5, max_hear_distance = 4}) end else destroy_node(np) if minetest.env:get_node(np).name ~= "default:chest" then nodes[area:index(np.x, np.y, np.z)] = c_air end end --[[elseif n.name == "default:chest" then local p = np while minetest.env:get_node({x=p.x, y=p.y-1, z=p.z}).name == "air" do p.y=p.y-1 end minetest.env:add_node(p, {name="default:chest"}) -- copy_meta(np, p) minetest.env:remove_node(np) --minetest.env:get_meta(minetest.env:get_meta(pos))]] end activate_if_tnt(n.name, np, pos, range) end end end end manip:set_data(nodes) manip:write_to_map() print(string.format("[nuke] exploded in: %.2fs", os.clock() - t1)) local t1 = os.clock() manip:update_map() print(string.format("[nuke] map updated in: %.2fs", os.clock() - t1)) end
math.random() shouldnt be a problem, you should rather not use minetest.get_node() at all. You could instead check the content ID of the chest.Hybrid Dog wrote:It's used to preserve the items which would be dropped (I disabled it so it did nothing.):PilzAdam wrote:You do have too much code in the time critical part.Hybrid Dog wrote: this is my code:So it's not necessary to set ignore everywhere?Code: Select all
local function explode(pos, range) local t1 = os.clock() local manip = minetest.get_voxel_manip() local width = range+1 local emerged_pos1, emerged_pos2 = manip:read_from_map({x=pos.x-width, y=pos.y-width, z=pos.z-width}, {x=pos.x+width, y=pos.y+width, z=pos.z+width}) local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) local nodes = {} local ignore = minetest.get_content_id("ignore") for i = 1, get_volume(emerged_pos1, emerged_pos2) do nodes[i] = ignore end local c_air = minetest.get_content_id("air") local radius = range^2 + range for x=-range,range do for y=-range,range do for z=-range,range do local r = x^2+y^2+z^2 if r <= radius then local np={x=pos.x+x, y=pos.y+y, z=pos.z+z} local n = minetest.env:get_node(np) if n.name ~= "air" and n.name ~= "default:chest" then -- and math.random(1,2^rad) < range*8 then if math.floor(math.sqrt(r) +0.5) > range-1 then if math.random(1,5) >= 2 then destroy_node(np) if minetest.env:get_node(np).name ~= "default:chest" then nodes[area:index(np.x, np.y, np.z)] = c_air end elseif math.random(1,10) == 1 then minetest.sound_play("default_glass_footstep", {pos = np, gain = 0.5, max_hear_distance = 4}) end else destroy_node(np) if minetest.env:get_node(np).name ~= "default:chest" then nodes[area:index(np.x, np.y, np.z)] = c_air end end --[[elseif n.name == "default:chest" then local p = np while minetest.env:get_node({x=p.x, y=p.y-1, z=p.z}).name == "air" do p.y=p.y-1 end minetest.env:add_node(p, {name="default:chest"}) -- copy_meta(np, p) minetest.env:remove_node(np) --minetest.env:get_meta(minetest.env:get_meta(pos))]] end activate_if_tnt(n.name, np, pos, range) end end end end manip:set_data(nodes) manip:write_to_map() print(string.format("[nuke] exploded in: %.2fs", os.clock() - t1)) local t1 = os.clock() manip:update_map() print(string.format("[nuke] map updated in: %.2fs", os.clock() - t1)) end
Calling get_node() in there makes it a lot slower.
What does destroy_node() do?Maybe math.random causes the lags.Code: Select all
local function describe_chest() if math.random(5) == 1 then return "You nuked. I HAVE NOT!" end if math.random(10) == 1 then return "Hehe, I'm the result of your explosion hee!" end if math.random(20) == 1 then return "Look into me, I'm fat!" end if math.random(30) == 1 then return "Please don't rob me. Else you are as evil as the other persons who took my inventoried stuff." end if math.random(300) == 1 then return "I'll follow you until I ate you. Like I did with the other objects here..." end return "Feel free to take the nuked items out of me!" end local function set_chest(p) --add a chest if the previous one is full local pos = p while minetest.env:get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" do pos.y=pos.y-1 end minetest.env:add_node(pos, {name="default:chest"}) local meta = minetest.get_meta(pos) meta:set_string("formspec",default.chest_formspec) meta:set_string("infotext", describe_chest()) local inve = meta:get_inventory() inve:set_size("main", 8*4) nuke_chestpos = pos end local function destroy_node(pos) if nuke_preserve_items then local drops = minetest.get_node_drops(minetest.env:get_node(pos).name) if nuke_drop_items then for _, item in ipairs(drops) do if item ~= "default:cobble" then minetest.env:add_item(pos, item) end end elseif nuke_puncher ~= nil then local inv = nuke_puncher:get_inventory() if inv then for _, item in ipairs(drops) do if inv:room_for_item("main", item) then inv:add_item("main", item) else if nuke_chestpos == nil then set_chest(pos) end local chestinv = minetest.get_meta(nuke_chestpos):get_inventory() if not chestinv:room_for_item("main", item) then set_chest(pos) end chestinv:add_item("main", item) end end end end end end
Is it faster if I use PseudoRandom?
Now that would be a good nether. Add a couple evels above it and put it underground and it would look like a real biomeHybrid Dog wrote:I tested the perlin noise for an edited nether mod:
http://ubuntuone.com/6UOfJ862eXWPPx8dHNIQN3
.
http://ubuntuone.com/5A6G7hcoFRJHVhFqYan63Q
This nether is better than the other one.Hybrid Dog wrote:A chunk took ca. 3s to generate.
I had to use GIMP else it would bee too dark because the calc_lighting() and update_liquids() don't work for me.
Spoiler
if you swim up to an lavafall (if update_liquids() would work)
or if you use a pick (the shift elevator could be useful).
http://ubuntuone.com/410pvtgm17nk4CTcDvauNU
diving...
http://ubuntuone.com/7MTaeACpaBqn5D8pk2AIRr
Wow, this looks awesome.Hybrid Dog wrote:
Cute.Sokomine wrote:Two sheep take a stroll at a beach, while an ostrich watches over another sheep:
http://mg.viewskew.com/mgoblin_media/me ... 470946.png