Hybrid Dog wrote:I edited the nuke mod and made a big hole with vm (it took ca. 8min) (r=120):
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()
Shire wrote:http://i1203.photobucket.com/albums/bb381/save-the_rejects/screenshot_2912227440_zps1ecf7d4c.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:Shire wrote:http://i1203.photobucket.com/albums/bb381/save-the_rejects/screenshot_2912227440_zps1ecf7d4c.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.
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.
Your project looks like it could be interesting.
Hybrid Dog wrote:PilzAdam wrote:Hybrid Dog wrote:I edited the nuke mod and made a big hole with vm (it took ca. 8min) (r=120):
8 minutes? oO
I tried it myself and it took more like 20 seconds. Here is the relevant code:
- 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()
Make sure that c_air is defined.
Also the mapblock sending takes long, you are faster when you just rejoin the server (or restart singleplayer).
this is my code:
- 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
So it's not necessary to set ignore everywhere?
Hybrid Dog wrote:It's used to preserve the items which would be dropped (I disabled it so it did nothing.):PilzAdam wrote:Hybrid Dog wrote:this is my code:
- 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
So it's not necessary to set ignore everywhere?
You do have too much code in the time critical part.
Calling get_node() in there makes it a lot slower.
What does destroy_node() do?
- 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
Maybe math.random causes the lags.
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
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=At the moment it looks like this.]http://ubuntuone.com/0qFI5ROgk3gsV8HCIe6PIN
http://ubuntuone.com/01ZtPp3Mhh4RrKaOqGnkTD[/spoiler]
[spoiler=You can only come out of a lavasee]
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[/spoiler]
Hybrid Dog wrote:[spoiler=At the moment it looks like this.]http://ubuntuone.com/0qFI5ROgk3gsV8HCIe6PIN
http://ubuntuone.com/01ZtPp3Mhh4RrKaOqGnkTD[/spoiler]
Users browsing this forum: No registered users and 3 guests