minetest/mods/moontest/init.lua
HeroOfTheWinds e09c391650 The air/vacuum fix to end all fixes
Probably will have a bug in the next few days. :P
Fixed air and vacuum not flowing back in when liquids are removed.  Also
added an ABM to regular air to make it change to moontest air or vacuum
based on neighbors.  Liquid no longer deletes atmosphere diagonally
placed from it.
2014-05-21 13:25:12 -10:00

249 lines
7.7 KiB
Lua

-- moontest 0.6.5 by paramat
-- Licenses: code WTFPL, textures CC BY-SA
moontest = {}
local player_pos = {}
local player_pos_previous = {}
dofile(minetest.get_modpath("moontest").."/nodes.lua")
dofile(minetest.get_modpath("moontest").."/crafting.lua")
dofile(minetest.get_modpath("moontest").."/tools.lua")
-- Globalstep function
minetest.register_globalstep(function(dtime)
for _, player in ipairs(minetest.get_connected_players()) do
if FOOT and math.random() < 0.3 and player_pos_previous[player:get_player_name()] ~= nil then -- eternal footprints
local pos = player:getpos()
player_pos[player:get_player_name()] = {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.2),z=math.floor(pos.z+0.5)}
local p_ground = {x=math.floor(pos.x+0.5),y=math.floor(pos.y+0.4),z=math.floor(pos.z+0.5)}
local n_ground = minetest.get_node(p_ground).name
local p_groundpl = {x=math.floor(pos.x+0.5),y=math.floor(pos.y-0.5),z=math.floor(pos.z+0.5)}
if player_pos[player:get_player_name()].x ~= player_pos_previous[player:get_player_name()].x
or player_pos[player:get_player_name()].y < player_pos_previous[player:get_player_name()].y
or player_pos[player:get_player_name()].z ~= player_pos_previous[player:get_player_name()].z then
if n_ground == "moontest:dust" then
if math.random() < 0.5 then
minetest.add_node(p_groundpl,{name="moontest:dustprint1"})
else
minetest.add_node(p_groundpl,{name="moontest:dustprint2"})
end
end
end
player_pos_previous[player:get_player_name()] = {
x=player_pos[player:get_player_name()].x,
y=player_pos[player:get_player_name()].y,
z=player_pos[player:get_player_name()].z
}
end
if math.random() < 0.1 then
if player:get_inventory():contains_item("main", "moontest:spacesuit")
and player:get_breath() < 11 then
player:set_breath(11)
end
end
if math.random() > 0.99 then
local pos = player:getpos()
end
end
end)
-- Space apple tree
function moontest_appletree(pos)
local x = pos.x
local y = pos.y
local z = pos.z
for j = -2, -1 do
local nodename = minetest.get_node({x=x,y=y+j,z=z}).name
if nodename ~= "moontest:soil" then
return
end
end
for j = 1, 5 do
local nodename = minetest.get_node({x=x,y=y+j,z=z}).name
if nodename ~= "moontest:air" then
return
end
end
for j = -2, 4 do
if j >= 1 then
for i = -2, 2 do
for k = -2, 2 do
local nodename = minetest.get_node({x=x+i,y=y+j+1,z=z+k}).name
if math.random() > (math.abs(i) + math.abs(k)) / 16 then
if math.random(13) == 2 then
minetest.add_node({x=pos.x+i,y=pos.y+j+1,z=pos.z+k},{name="default:apple"})
else
minetest.add_node({x=pos.x+i,y=pos.y+j+1,z=pos.z+k},{name="moontest:leaves"})
end
else
minetest.add_node({x=x+i,y=y+j+1,z=z+k},{name="moontest:air"})
minetest.get_meta({x=x+i,y=y+j+1,z=z+k}):set_int("spread", 16)
end
end
end
end
minetest.add_node({x=pos.x,y=pos.y+j,z=pos.z},{name="moontest:tree"})
end
print ("[moontest] Appletree sapling grows")
end
-- Vacuum or air flows into a dug hole
minetest.register_on_dignode(function(pos, oldnode, digger)
local x = pos.x
local y = pos.y
local z = pos.z
for i = -1,1 do
for j = -1,1 do
for k = -1,1 do
if not (i == 0 and j == 0 and k == 0) then
local nodename = minetest.get_node({x=x+i,y=y+j,z=z+k}).name
if nodename == "moontest:air" then
local spread = minetest.get_meta({x=x+i,y=y+j,z=z+k}):get_int("spread")
if spread > 0 then
minetest.add_node({x=x,y=y,z=z},{name="moontest:air"})
minetest.get_meta(pos):set_int("spread", (spread - 1))
print ("[moontest] MR air flows into hole "..(spread - 1))
return
end
elseif nodename == "moontest:vacuum" then
minetest.add_node({x=x,y=y,z=z},{name="moontest:vacuum"})
print ("[moontest] Vacuum flows into hole")
return
end
end
end
end
end
end)
-- Air gets filled with vacuum or moontest:air, depending on surroudings
-- this is the hackiest code I've ever written
-- If neighbors worked as I would like it to, this wouldn't be necessary...
minetest.register_abm({
nodenames = {"moontest:air", "air"},
neighbors = {"moontest:vacuum", "moontest:air"},
interval = 2, --must be asynchronous with liquid ABM to avoid deadlock
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
local x = pos.x
local y = pos.y
local z = pos.z
--adjacent node positions
local left = {x=x-1,y=y,z=z}
local right = {x=x+1,y=y,z=z}
local up = {x=x,y=y+1,z=z}
local down = {x=x,y=y-1,z=z}
local forward = {x=x,y=y,z=z+1}
local back = {x=x,y=y,z=z-1}
--cross references those for vacuum, spread if true
if minetest.get_node(left).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
if minetest.get_node(right).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
if minetest.get_node(up).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
if minetest.get_node(down).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
if minetest.get_node(forward).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
if minetest.get_node(back).name == "moontest:vacuum" then
minetest.set_node(pos, {name="moontest:vacuum"})
end
--now cross reference if air should get filled with moontest:air
if node.name == "air" then
if minetest.get_node(left).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
if minetest.get_node(right).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
if minetest.get_node(up).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
if minetest.get_node(down).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
if minetest.get_node(forward).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
if minetest.get_node(back).name == "moontest:air" then
minetest.set_node(pos, {name="moontest:air"})
end
end
end
})
-- Hydroponic saturation
minetest.register_abm({
nodenames = {"moontest:hlsource", "moontest:hlflowing"},
neighbors = {"moontest:dust", "moontest:dustprint1", "moontest:dustprint2"},
interval = 29,
chance = 9,
action = function(pos, node, active_object_count, active_object_count_wider)
local x = pos.x
local y = pos.y
local z = pos.z
for i = -2,2 do
for j = -4,0 do -- saturates out and downwards to pos.y - 4, a 5x5 cube.
for k = -2,2 do
if not (i == 0 and j == 0 and k == 0) then
local nodename = minetest.get_node({x=x+i,y=y+j,z=z+k}).name
if nodename == "moontest:dust"
or nodename == "moontest:dustprint1"
or nodename == "moontest:dustprint2" then
minetest.add_node({x=x+i,y=y+j,z=z+k},{name="moontest:soil"})
print ("[moontest] Hydroponic liquid saturates")
end
end
end
end
end
end
})
-- Soil drying
minetest.register_abm({
nodenames = {"moontest:soil"},
interval = 31,
chance = 27,
action = function(pos, node)
local x = pos.x
local y = pos.y
local z = pos.z
for i = -2, 2 do
for j = 0, 4 do -- search above for liquid
for k = -2, 2 do
if not (i == 0 and j == 0 and k == 0) then
local nodename = minetest.get_node({x=x+i,y=y+j,z=z+k}).name
if nodename == "moontest:hlsource" or nodename == "moontest:hlflowing" then
return
end
end
end
end
end
minetest.add_node(pos,{name="moontest:dust"})
print ("[moontest] Moon soil dries")
end,
})
-- Space appletree from sapling
minetest.register_abm({
nodenames = {"moontest:sapling"},
interval = 57,
chance = 3,
action = function(pos, node, active_object_count, active_object_count_wider)
moontest_appletree(pos)
end,
})