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:Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- 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:Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- 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:Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- 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?Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
- 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]
Sokomine wrote:Two sheep take a stroll at a beach, while an ostrich watches over another sheep:
http://mg.viewskew.com/mgoblin_media/media_entries/338/screenshot_2475470946.png
paramat wrote:I prefer your version to the real thing. How did you do those blue windows? I thought semi-transparency was glitchy?
sdzen wrote:http://i3.minus.com/i4zLfMW5Y9iKE.png
I haven't posted a screenshot in some time, so I might as well now :-)
Inocudom wrote:sdzen wrote:http://i3.minus.com/i4zLfMW5Y9iKE.png
I haven't posted a screenshot in some time, so I might as well now :-)
What is that building supposed to be? Whatever it is, it looks very interesting.
That player skin could be a nice addition to Zeg9's skins mod.
mauvebic wrote:i used colouredglass, it's only glitchy when placed on/in water so i avoid using it for platforms atm.
Users browsing this forum: Bing [Bot] and 107 guests