forked from VoxeLibre/VoxeLibre
959 lines
25 KiB
Lua
959 lines
25 KiB
Lua
--
|
|
-- On Die
|
|
--
|
|
--if minetest.setting_get("keepInventory") == false then
|
|
minetest.register_on_dieplayer(function(player)
|
|
local inv = player:get_inventory()
|
|
local pos = player:getpos()
|
|
for i,stack in ipairs(inv:get_list("main")) do
|
|
local x = math.random(0, 9)/3
|
|
local z = math.random(0, 9)/3
|
|
pos.x = pos.x + x
|
|
pos.z = pos.z + z
|
|
minetest.add_item(pos, stack)
|
|
stack:clear()
|
|
inv:set_stack("main", i, stack)
|
|
pos.x = pos.x - x
|
|
pos.z = pos.z - z
|
|
end
|
|
end)
|
|
--end
|
|
|
|
--
|
|
-- Lavacooling
|
|
--
|
|
|
|
default.cool_lava_source = function(pos)
|
|
minetest.set_node(pos, {name="default:obsidian"})
|
|
end
|
|
|
|
default.cool_lava_flowing = function(pos)
|
|
minetest.set_node(pos, {name="default:stone"})
|
|
end
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"default:lava_flowing"},
|
|
neighbors = {"group:water"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
default.cool_lava_flowing(pos, node, active_object_count, active_object_count_wider)
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"default:lava_source"},
|
|
neighbors = {"group:water"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
default.cool_lava_source(pos, node, active_object_count, active_object_count_wider)
|
|
end,
|
|
})
|
|
|
|
--
|
|
-- Papyrus and cactus growing
|
|
--
|
|
|
|
-- Functions
|
|
grow_cactus = function(pos, node)
|
|
pos.y = pos.y-1
|
|
local name = minetest.get_node(pos).name
|
|
if minetest.get_item_group(name, "sand") ~= 0 then
|
|
pos.y = pos.y+1
|
|
local height = 0
|
|
while minetest.get_node(pos).name == "default:cactus" and height < 4 do
|
|
height = height+1
|
|
pos.y = pos.y+1
|
|
end
|
|
if height < 3 then
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.set_node(pos, {name="default:cactus"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
grow_reeds = function(pos, node)
|
|
pos.y = pos.y-1
|
|
local name = minetest.get_node(pos).name
|
|
if minetest.get_node_group(name, "soil_sugarcane") ~= 0 then
|
|
if minetest.find_node_near(pos, 3, {"group:water"}) == nil then
|
|
return
|
|
end
|
|
pos.y = pos.y+1
|
|
local height = 0
|
|
while minetest.get_node(pos).name == "default:reeds" and height < 3 do
|
|
height = height+1
|
|
pos.y = pos.y+1
|
|
end
|
|
if height < 3 then
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.set_node(pos, {name="default:reeds"})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-- ABMs
|
|
|
|
|
|
local function drop_attached_node(p)
|
|
local nn = minetest.get_node(p).name
|
|
minetest.remove_node(p)
|
|
for _, item in pairs(minetest.get_node_drops(nn, "")) do
|
|
local pos = {
|
|
x = p.x + math.random()/2 - 0.25,
|
|
y = p.y + math.random()/2 - 0.25,
|
|
z = p.z + math.random()/2 - 0.25,
|
|
}
|
|
minetest.add_item(pos, item)
|
|
end
|
|
end
|
|
|
|
-- Remove attached nodes next to flowing water
|
|
minetest.register_abm({
|
|
nodenames = {"group:dig_by_water"},
|
|
neighbors = {"group:water"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
for xp=-1,1 do
|
|
for zp=-1,1 do
|
|
local p = {x=pos.x+xp, y=pos.y, z=pos.z+zp}
|
|
local n = minetest.get_node(p)
|
|
if (n.name=="default:water_flowing") then
|
|
drop_attached_node(pos)
|
|
minetest.dig_node(pos)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
for yp=-1,1 do
|
|
local p = {x=pos.x, y=pos.y+yp, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
if (n.name=="default:water_flowing") then
|
|
drop_attached_node(pos)
|
|
minetest.dig_node(pos)
|
|
break
|
|
end
|
|
end
|
|
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"default:cactus"},
|
|
neighbors = {"group:sand"},
|
|
interval = 25,
|
|
chance = 10,
|
|
action = function(pos)
|
|
grow_cactus(pos)
|
|
end,
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"default:reeds"},
|
|
neighbors = {"default:dirt", "default:dirt_with_grass"},
|
|
interval = 25,
|
|
chance = 10,
|
|
action = function(pos)
|
|
grow_reeds(pos)
|
|
end,
|
|
})
|
|
|
|
--
|
|
-- Papyrus and cactus drop
|
|
--
|
|
|
|
local timber_nodenames={"default:reeds", "default:cactus"}
|
|
|
|
minetest.register_on_dignode(function(pos, node)
|
|
local i=1
|
|
while timber_nodenames[i]~=nil do
|
|
if node.name==timber_nodenames[i] then
|
|
np={x=pos.x, y=pos.y+1, z=pos.z}
|
|
while minetest.get_node(np).name==timber_nodenames[i] do
|
|
minetest.remove_node(np)
|
|
minetest.add_item(np, timber_nodenames[i])
|
|
np={x=np.x, y=np.y+1, z=np.z}
|
|
end
|
|
end
|
|
i=i+1
|
|
end
|
|
end)
|
|
|
|
--
|
|
-- Flint and Steel
|
|
--
|
|
|
|
function get_nodedef_field(nodename, fieldname)
|
|
if not minetest.registered_nodes[nodename] then
|
|
return nil
|
|
end
|
|
return minetest.registered_nodes[nodename][fieldname]
|
|
end
|
|
|
|
function set_fire(pointed_thing)
|
|
local n = minetest.get_node(pointed_thing.above)
|
|
if n.name ~= "" and n.name == "air" and not minetest.is_protected(pointed_thing.above, "fire") then
|
|
minetest.add_node(pointed_thing.above, {name="fire:basic_flame"})
|
|
end
|
|
end
|
|
|
|
--
|
|
-- Fire Particles
|
|
--
|
|
|
|
function add_fire(pos)
|
|
local null = {x=0, y=0, z=0}
|
|
pos.y = pos.y+0.19
|
|
minetest.add_particle(pos, null, null, 1.1,
|
|
1.5, true, "default_fire_particle"..tostring(math.random(1,2)) ..".png")
|
|
pos.y = pos.y +0.01
|
|
minetest.add_particle(pos, null, null, 0.8,
|
|
1.5, true, "default_fire_particle"..tostring(math.random(1,2)) ..".png")
|
|
end
|
|
|
|
--
|
|
-- Bone Meal
|
|
--
|
|
|
|
local n
|
|
local n2
|
|
local pos
|
|
|
|
function apple_leave()
|
|
if math.random(0, 10) == 3 then
|
|
return {name = "default:apple"}
|
|
else
|
|
return {name = "default:leaves"}
|
|
end
|
|
end
|
|
|
|
function air_leave()
|
|
if math.random(0, 50) == 3 then
|
|
return {name = "air"}
|
|
else
|
|
return {name = "default:leaves"}
|
|
end
|
|
end
|
|
|
|
function generate_tree(pos, trunk, leaves, typearbre)
|
|
pos.y = pos.y-1
|
|
local nodename = minetest.get_node(pos).name
|
|
|
|
pos.y = pos.y+1
|
|
if not minetest.get_node_light(pos) then
|
|
return
|
|
end
|
|
if typearbre == nil or typearbre == 1 then
|
|
node = {name = ""}
|
|
for dy=1,4 do
|
|
pos.y = pos.y+dy
|
|
if minetest.get_node(pos).name ~= "air" then
|
|
return
|
|
end
|
|
pos.y = pos.y-dy
|
|
end
|
|
node = {name = trunk}
|
|
for dy=0,4 do
|
|
pos.y = pos.y+dy
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, node)
|
|
end
|
|
pos.y = pos.y-dy
|
|
end
|
|
|
|
node = {name = leaves}
|
|
pos.y = pos.y+3
|
|
local rarity = 0
|
|
if math.random(0, 10) == 3 then
|
|
rarity = 1
|
|
end
|
|
for dx=-2,2 do
|
|
for dz=-2,2 do
|
|
for dy=0,3 do
|
|
pos.x = pos.x+dx
|
|
pos.y = pos.y+dy
|
|
pos.z = pos.z+dz
|
|
|
|
if dx == 0 and dz == 0 and dy==3 then
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
minetest.add_node(pos, node)
|
|
if rarity == 1 then
|
|
minetest.add_node(pos, apple_leave())
|
|
else
|
|
minetest.add_node(pos, air_leave())
|
|
end
|
|
end
|
|
elseif dx == 0 and dz == 0 and dy==4 then
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
minetest.add_node(pos, node)
|
|
if rarity == 1 then
|
|
minetest.add_node(pos, apple_leave())
|
|
else
|
|
minetest.add_node(pos, air_leave())
|
|
end
|
|
end
|
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, node)
|
|
if rarity == 1 then
|
|
minetest.add_node(pos, apple_leave())
|
|
else
|
|
minetest.add_node(pos, air_leave())
|
|
end
|
|
end
|
|
else
|
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
minetest.add_node(pos, node)
|
|
if rarity == 1 then
|
|
minetest.add_node(pos, apple_leave())
|
|
else
|
|
minetest.add_node(pos, air_leave())
|
|
end
|
|
end
|
|
end
|
|
end
|
|
pos.x = pos.x-dx
|
|
pos.y = pos.y-dy
|
|
pos.z = pos.z-dz
|
|
end
|
|
end
|
|
end
|
|
elseif typearbre == 2 then
|
|
node = {name = ""}
|
|
|
|
-- can place big tree ?
|
|
local tree_size = math.random(15, 25)
|
|
for dy=1,4 do
|
|
pos.y = pos.y+dy
|
|
if minetest.get_node(pos).name ~= "air" then
|
|
return
|
|
end
|
|
pos.y = pos.y-dy
|
|
end
|
|
|
|
--Cheak for placing big tree
|
|
pos.y = pos.y-1
|
|
for dz=0,1 do
|
|
pos.z = pos.z + dz
|
|
--> 0
|
|
if minetest.get_node(pos).name == "default:dirt_with_grass"
|
|
or minetest.get_node(pos).name == "default:dirt" then else
|
|
return
|
|
end
|
|
pos.x = pos.x+1
|
|
--> 1
|
|
if minetest.get_node(pos).name == "default:dirt_with_grass"
|
|
or minetest.get_node(pos).name == "default:dirt" then else
|
|
return
|
|
end
|
|
pos.x = pos.x-1
|
|
pos.z = pos.z - dz
|
|
end
|
|
pos.y = pos.y+1
|
|
|
|
|
|
-- Make tree with vine
|
|
node = {name = trunk}
|
|
for dy=0,tree_size do
|
|
pos.y = pos.y+dy
|
|
|
|
for dz=-1,2 do
|
|
if dz == -1 then
|
|
pos.z = pos.z + dz
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 4})
|
|
end
|
|
pos.x = pos.x+1
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 4})
|
|
end
|
|
pos.x = pos.x-1
|
|
pos.z = pos.z - dz
|
|
elseif dz == 2 then
|
|
pos.z = pos.z + dz
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air"then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 5})
|
|
end
|
|
pos.x = pos.x+1
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 5})
|
|
end
|
|
pos.x = pos.x-1
|
|
pos.z = pos.z - dz
|
|
else
|
|
pos.z = pos.z + dz
|
|
pos.x = pos.x-1
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 2})
|
|
end
|
|
pos.x = pos.x+1
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = trunk, param2=2})
|
|
end
|
|
pos.x = pos.x+1
|
|
if minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = trunk, param2=2})
|
|
end
|
|
pos.x = pos.x+1
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, {name = "default:vine", param2 = 3})
|
|
end
|
|
pos.x = pos.x-2
|
|
pos.z = pos.z - dz
|
|
end
|
|
end
|
|
|
|
pos.y = pos.y-dy
|
|
end
|
|
|
|
-- make leaves
|
|
node = {name = leaves}
|
|
pos.y = pos.y+tree_size-4
|
|
for dx=-5,5 do
|
|
for dz=-5,5 do
|
|
for dy=0,3 do
|
|
pos.x = pos.x+dx
|
|
pos.y = pos.y+dy
|
|
pos.z = pos.z+dz
|
|
|
|
if dx == 0 and dz == 0 and dy==3 then
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 2) == 1 then
|
|
minetest.add_node(pos, node)
|
|
end
|
|
elseif dx == 0 and dz == 0 and dy==4 then
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 5) == 1 then
|
|
minetest.add_node(pos, node)
|
|
minetest.add_node(pos, air_leave())
|
|
end
|
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" then
|
|
minetest.add_node(pos, node)
|
|
end
|
|
else
|
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "default:vine" and math.random(1, 3) == 1 then
|
|
minetest.add_node(pos, node)
|
|
end
|
|
else
|
|
if math.random(1, 5) == 1 and minetest.get_node(pos).name == "air" then
|
|
minetest.add_node(pos, node)
|
|
end
|
|
end
|
|
end
|
|
pos.x = pos.x-dx
|
|
pos.y = pos.y-dy
|
|
pos.z = pos.z-dz
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local plant_tab = {}
|
|
local rnd_max = 5
|
|
minetest.after(0.5, function()
|
|
plant_tab[0] = "air"
|
|
plant_tab[1] = "default:grass"
|
|
plant_tab[2] = "default:grass"
|
|
plant_tab[3] = "default:grass"
|
|
plant_tab[4] = "default:grass"
|
|
plant_tab[5] = "default:grass"
|
|
|
|
if minetest.get_modpath("flowers") ~= nil then
|
|
rnd_max = 16
|
|
plant_tab[6] = "flowers:dandelion_yellow"
|
|
plant_tab[7] = "flowers:rose"
|
|
plant_tab[8] = "flowers:oxeye_daisy"
|
|
plant_tab[9] = "flowers:tulip_orange"
|
|
plant_tab[10] = "flowers:tulip_red"
|
|
plant_tab[11] = "flowers:tulip_white"
|
|
plant_tab[12] = "flowers:tulip_pink"
|
|
plant_tab[13] = "flowers:allium"
|
|
plant_tab[14] = "flowers:paeonia"
|
|
plant_tab[15] = "flowers:houstonia"
|
|
plant_tab[16] = "flowers:blue_orchid"
|
|
end
|
|
|
|
end)
|
|
|
|
function duengen(pointed_thing)
|
|
pos = pointed_thing.under
|
|
n = minetest.get_node(pos)
|
|
if n.name == "" then return false end
|
|
local stage = ""
|
|
if n.name == "default:sapling" then
|
|
minetest.add_node(pos, {name="air"})
|
|
generate_tree(pos, "default:tree", "default:leaves", 1)
|
|
return true
|
|
elseif string.find(n.name, "farming:wheat_") ~= nil then
|
|
stage = string.sub(n.name, 15)
|
|
if stage == "3" then
|
|
minetest.add_node(pos, {name="farming:wheat"})
|
|
elseif math.random(1,5) < 3 then
|
|
minetest.add_node(pos, {name="farming:wheat"})
|
|
else
|
|
minetest.add_node(pos, {name="farming:wheat_"..math.random(2,3)})
|
|
end
|
|
return true
|
|
elseif string.find(n.name, "farming:potato_") ~= nil then
|
|
stage = tonumber(string.sub(n.name, 16))
|
|
if stage == 1 then
|
|
minetest.add_node(pos, {name="farming:potato_"..math.random(stage,2)})
|
|
else
|
|
minetest.add_node(pos, {name="farming:potato"})
|
|
end
|
|
return true
|
|
elseif string.find(n.name, "farming:carrot_") ~= nil then
|
|
stage = tonumber(string.sub(n.name, 16))
|
|
if stage == 1 then
|
|
minetest.add_node(pos, {name="farming:carrot_"..math.random(stage,2)})
|
|
else
|
|
minetest.add_node(pos, {name="farming:carrot"})
|
|
end
|
|
return true
|
|
elseif string.find(n.name, "farming:pumpkin_") ~= nil then
|
|
stage = tonumber(string.sub(n.name, 17))
|
|
if stage == 1 then
|
|
minetest.add_node(pos, {name="farming:pumpkin_"..math.random(stage,2)})
|
|
else
|
|
minetest.add_node(pos, {name="farming:pumpkintige_unconnect"})
|
|
end
|
|
return true
|
|
elseif string.find(n.name, "farming:melontige_") ~= nil then
|
|
stage = tonumber(string.sub(n.name, 18))
|
|
if stage == 1 then
|
|
minetest.add_node(pos, {name="farming:melontige_"..math.random(stage,2)})
|
|
else
|
|
minetest.add_node(pos, {name="farming:melontige_unconnect"})
|
|
end
|
|
return true
|
|
elseif n.name ~= "" and n.name == "default:junglesapling" then
|
|
minetest.add_node(pos, {name="air"})
|
|
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
|
return true
|
|
elseif n.name ~="" and n.name == "default:reeds" then
|
|
grow_reeds(pos)
|
|
return true
|
|
elseif n.name ~="" and n.name == "default:cactus" then
|
|
grow_cactus(pos)
|
|
return true
|
|
elseif n.name == "default:dirt_with_grass" then
|
|
for i = -2, 3, 1 do
|
|
for j = -3, 2, 1 do
|
|
pos = pointed_thing.above
|
|
pos = {x=pos.x+i, y=pos.y, z=pos.z+j}
|
|
n = minetest.get_node(pos)
|
|
n2 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
|
|
|
if n.name ~= "" and n.name == "air" and n2.name == "default:dirt_with_grass" then
|
|
if math.random(0,5) > 3 then
|
|
minetest.add_node(pos, {name=plant_tab[math.random(0, rnd_max)]})
|
|
else
|
|
minetest.add_node(pos, {name=plant_tab[math.random(0, 5)]})
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
|
|
------------------------------
|
|
-- Try generate grass dirt ---
|
|
------------------------------
|
|
-- turn dirt to dirt with grass
|
|
minetest.register_abm({
|
|
nodenames = {"default:dirt"},
|
|
neighbors = {"air"},
|
|
interval = 30,
|
|
chance = 20,
|
|
action = function(pos)
|
|
if pos == nil then
|
|
return
|
|
end
|
|
local can_change = 0
|
|
for i=1,4 do
|
|
local p = {x=pos.x, y=pos.y+i, z=pos.z}
|
|
local n = minetest.get_node(p)
|
|
-- On verifie si il y a de l'air
|
|
if (n.name=="air") then
|
|
can_change = can_change + 1
|
|
end
|
|
end
|
|
if can_change > 3 then
|
|
local light = minetest.get_node_light(pos)
|
|
if light or light > 10 then
|
|
minetest.add_node(pos, {name="default:dirt_with_grass"})
|
|
end
|
|
|
|
end
|
|
end,
|
|
})
|
|
|
|
|
|
|
|
--------------------------
|
|
-- Try generate tree ---
|
|
--------------------------
|
|
-- TODO: Acacia, dark oak, spruce, birch
|
|
|
|
-- Normal tree
|
|
minetest.register_abm({
|
|
nodenames = {"default:sapling"},
|
|
neighbors = {"group:soil_sapling"},
|
|
interval = 30,
|
|
chance = 15,
|
|
action = function(pos)
|
|
local light = minetest.get_node_light(pos)
|
|
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
|
local soiltype = mietest.get_item_group(soilnode.name, "soil_sapling")
|
|
if soiltype >= 1 and light and light >= 9 then
|
|
minetest.add_node(pos, {name="air"})
|
|
generate_tree(pos, "default:tree", "default:leaves", 1)
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Jungle Tree
|
|
minetest.register_abm({
|
|
nodenames = {"default:junglesapling"},
|
|
neighbors = {"group:soil_sapling"},
|
|
interval = 30,
|
|
chance = 15,
|
|
action = function(pos)
|
|
local light = minetest.get_node_light(pos)
|
|
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
|
local soiltype = mietest.get_item_group(soilnode.name, "soil_sapling")
|
|
if soiltype == 2 and light and light >= 9 then
|
|
minetest.add_node(pos, {name="air"})
|
|
generate_tree(pos, "default:jungletree", "default:jungleleaves", 2)
|
|
end
|
|
end,
|
|
})
|
|
|
|
---------------------
|
|
-- Vine generating --
|
|
---------------------
|
|
minetest.register_abm({
|
|
nodenames = {"default:vine"},
|
|
interval = 80,
|
|
chance = 5,
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
local newpos = {x=pos.x, y=pos.y-1, z=pos.z}
|
|
local n = minetest.get_node(newpos)
|
|
if n.name == "air" then
|
|
walldir = node.param2
|
|
minetest.add_node(newpos, {name = "default:vine", param2 = walldir})
|
|
end
|
|
end
|
|
})
|
|
|
|
|
|
--
|
|
-- Snowballs
|
|
--
|
|
|
|
snowball_GRAVITY=9
|
|
snowball_VELOCITY=19
|
|
|
|
--Shoot snowball.
|
|
snow_shoot_snowball=function (item, player, pointed_thing)
|
|
local playerpos=player:getpos()
|
|
local obj=minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, "default:snowball_entity")
|
|
local dir=player:get_look_dir()
|
|
obj:setvelocity({x=dir.x*snowball_VELOCITY, y=dir.y*snowball_VELOCITY, z=dir.z*snowball_VELOCITY})
|
|
obj:setacceleration({x=dir.x*-3, y=-snowball_GRAVITY, z=dir.z*-3})
|
|
item:take_item()
|
|
return item
|
|
end
|
|
|
|
--The snowball Entity
|
|
snowball_ENTITY={
|
|
physical = false,
|
|
timer=0,
|
|
textures = {"default_snowball.png"},
|
|
lastpos={},
|
|
collisionbox = {0,0,0,0,0,0},
|
|
}
|
|
|
|
--Snowball_entity.on_step()--> called when snowball is moving.
|
|
snowball_ENTITY.on_step = function(self, dtime)
|
|
self.timer=self.timer+dtime
|
|
local pos = self.object:getpos()
|
|
local node = minetest.get_node(pos)
|
|
|
|
--Become item when hitting a node.
|
|
if self.lastpos.x~=nil then --If there is no lastpos for some reason.
|
|
if node.name ~= "air" then
|
|
self.object:remove()
|
|
end
|
|
end
|
|
self.lastpos={x=pos.x, y=pos.y, z=pos.z} -- Set lastpos-->Node will be added at last pos outside the node
|
|
end
|
|
|
|
minetest.register_entity("default:snowball_entity", snowball_ENTITY)
|
|
|
|
-- Global environment step function
|
|
function on_step(dtime)
|
|
-- print("on_step")
|
|
end
|
|
minetest.register_globalstep(on_step)
|
|
|
|
function on_placenode(p, node)
|
|
--print("on_placenode")
|
|
end
|
|
minetest.register_on_placenode(on_placenode)
|
|
|
|
function on_dignode(p, node)
|
|
--print("on_dignode")
|
|
end
|
|
minetest.register_on_dignode(on_dignode)
|
|
|
|
function on_punchnode(p, node)
|
|
end
|
|
minetest.register_on_punchnode(on_punchnode)
|
|
|
|
-- END
|
|
|
|
-- Support old code
|
|
function default.spawn_falling_node(p, nodename)
|
|
spawn_falling_node(p, nodename)
|
|
end
|
|
|
|
-- Horrible crap to support old code
|
|
-- Don't use this and never do what this does, it's completely wrong!
|
|
-- (More specifically, the client and the C++ code doesn't get the group)
|
|
function default.register_falling_node(nodename, texture)
|
|
minetest.log("error", debug.traceback())
|
|
minetest.log('error', "WARNING: default.register_falling_node is deprecated")
|
|
if minetest.registered_nodes[nodename] then
|
|
minetest.registered_nodes[nodename].groups.falling_node = 1
|
|
end
|
|
end
|
|
|
|
--Sounds
|
|
|
|
|
|
--
|
|
-- Sounds
|
|
--
|
|
|
|
function default.node_sound_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="", gain=1.0}
|
|
table.dug = table.dug or
|
|
{name="default_dug_node", gain=0.25}
|
|
table.place = table.place or
|
|
{name="default_place_node_hard", gain=1.0}
|
|
return table
|
|
end
|
|
|
|
function default.node_sound_stone_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_hard_footstep", gain=0.5}
|
|
table.dug = table.dug or
|
|
{name="default_hard_footstep", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
-- TODO: Maybe add custom metal sounds
|
|
default.node_sound_metal_defaults = default.node_sound_stone_defaults
|
|
|
|
function default.node_sound_dirt_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_dirt_footstep", gain=1.0}
|
|
table.dug = table.dug or
|
|
{name="default_dirt_footstep", gain=1.5}
|
|
table.place = table.place or
|
|
{name="default_place_node", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
function default.node_sound_sand_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_sand_footstep", gain=0.5}
|
|
table.dug = table.dug or
|
|
{name="default_sand_footstep", gain=1.0}
|
|
table.place = table.place or
|
|
{name="default_place_node", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
function default.node_sound_wood_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_wood_footstep", gain=0.5}
|
|
table.dug = table.dug or
|
|
{name="default_wood_footstep", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
function default.node_sound_leaves_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_grass_footstep", gain=0.35}
|
|
table.dug = table.dug or
|
|
{name="default_grass_footstep", gain=0.85}
|
|
table.dig = table.dig or
|
|
{name="default_dig_crumbly", gain=0.4}
|
|
table.place = table.place or
|
|
{name="default_place_node", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
function default.node_sound_glass_defaults(table)
|
|
table = table or {}
|
|
table.footstep = table.footstep or
|
|
{name="default_glass_footstep", gain=0.5}
|
|
table.dug = table.dug or
|
|
{name="default_break_glass", gain=1.0}
|
|
default.node_sound_defaults(table)
|
|
return table
|
|
end
|
|
|
|
-- Leaf Decay
|
|
|
|
-- To enable leaf decay for a node, add it to the "leafdecay" group.
|
|
--
|
|
-- The rating of the group determines how far from a node in the group "tree"
|
|
-- the node can be without decaying.
|
|
--
|
|
-- If param2 of the node is ~= 0, the node will always be preserved. Thus, if
|
|
-- the player places a node of that kind, you will want to set param2=1 or so.
|
|
--
|
|
-- If the node is in the leafdecay_drop group then the it will always be dropped
|
|
-- as an item
|
|
|
|
default.leafdecay_trunk_cache = {}
|
|
default.leafdecay_enable_cache = true
|
|
-- Spread the load of finding trunks
|
|
default.leafdecay_trunk_find_allow_accumulator = 0
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
local finds_per_second = 5000
|
|
default.leafdecay_trunk_find_allow_accumulator =
|
|
math.floor(dtime * finds_per_second)
|
|
end)
|
|
|
|
minetest.register_abm({
|
|
nodenames = {"group:leafdecay"},
|
|
neighbors = {"air", "group:liquid"},
|
|
-- A low interval and a high inverse chance spreads the load
|
|
interval = 2,
|
|
chance = 5,
|
|
|
|
action = function(p0, node, _, _)
|
|
--print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")")
|
|
local do_preserve = false
|
|
local d = minetest.registered_nodes[node.name].groups.leafdecay
|
|
if not d or d == 0 then
|
|
--print("not groups.leafdecay")
|
|
return
|
|
end
|
|
local n0 = minetest.get_node(p0)
|
|
if n0.param2 ~= 0 then
|
|
--print("param2 ~= 0")
|
|
return
|
|
end
|
|
local p0_hash = nil
|
|
if default.leafdecay_enable_cache then
|
|
p0_hash = minetest.hash_node_position(p0)
|
|
local trunkp = default.leafdecay_trunk_cache[p0_hash]
|
|
if trunkp then
|
|
local n = minetest.get_node(trunkp)
|
|
local reg = minetest.registered_nodes[n.name]
|
|
-- Assume ignore is a trunk, to make the thing work at the border of the active area
|
|
if n.name == "ignore" or (reg and reg.groups.tree and reg.groups.tree ~= 0) then
|
|
--print("cached trunk still exists")
|
|
return
|
|
end
|
|
--print("cached trunk is invalid")
|
|
-- Cache is invalid
|
|
table.remove(default.leafdecay_trunk_cache, p0_hash)
|
|
end
|
|
end
|
|
if default.leafdecay_trunk_find_allow_accumulator <= 0 then
|
|
return
|
|
end
|
|
default.leafdecay_trunk_find_allow_accumulator =
|
|
default.leafdecay_trunk_find_allow_accumulator - 1
|
|
-- Assume ignore is a trunk, to make the thing work at the border of the active area
|
|
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
|
|
if p1 then
|
|
do_preserve = true
|
|
if default.leafdecay_enable_cache then
|
|
--print("caching trunk")
|
|
-- Cache the trunk
|
|
default.leafdecay_trunk_cache[p0_hash] = p1
|
|
end
|
|
end
|
|
if not do_preserve then
|
|
-- Drop stuff other than the node itself
|
|
local itemstacks = minetest.get_node_drops(n0.name)
|
|
for _, itemname in ipairs(itemstacks) do
|
|
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
|
|
itemname ~= n0.name then
|
|
local p_drop = {
|
|
x = p0.x - 0.5 + math.random(),
|
|
y = p0.y - 0.5 + math.random(),
|
|
z = p0.z - 0.5 + math.random(),
|
|
}
|
|
minetest.add_item(p_drop, itemname)
|
|
end
|
|
end
|
|
-- Remove node
|
|
minetest.remove_node(p0)
|
|
nodeupdate(p0)
|
|
end
|
|
end
|
|
})
|
|
|
|
------------------------
|
|
-- Create Color Glass --
|
|
------------------------
|
|
function AddGlass(desc, recipeitem, color)
|
|
|
|
minetest.register_node("default:glass_"..color, {
|
|
description = desc,
|
|
drawtype = "glasslike",
|
|
is_ground_content = false,
|
|
tile_images = {"xpanes_pane_glass_"..color..".png"},
|
|
inventory_image = minetest.inventorycube("xpanes_pane_glass_"..color..".png"),
|
|
paramtype = "light",
|
|
use_texture_alpha = true,
|
|
stack_max = 64,
|
|
groups = {cracky=3,oddly_breakable_by_hand=3},
|
|
sounds = default.node_sound_glass_defaults(),
|
|
drop = "",
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'default:glass_'..color..' 8',
|
|
recipe = {
|
|
{'default:glass','default:glass','default:glass'},
|
|
{'default:glass','group:dye,'..recipeitem,'default:glass'},
|
|
{'default:glass','default:glass','default:glass'},
|
|
}
|
|
})
|
|
end
|
|
|
|
|