VoxeLibre/mods/ITEMS/mcl_sponges/init.lua

212 lines
6.7 KiB
Lua
Raw Normal View History

local S = minetest.get_translator(minetest.get_current_modname())
2017-03-03 00:49:30 +01:00
local absorb = function(pos)
local change = false
-- Count number of absorbed river water vs other nodes
-- to determine the wet sponge type.
local river_water = 0
local non_river_water = 0
2017-03-03 00:49:30 +01:00
local p, n
for i=-3,3 do
for j=-3,3 do
for k=-3,3 do
p = {x=pos.x+i, y=pos.y+j, z=pos.z+k}
n = minetest.get_node(p)
if minetest.get_item_group(n.name, "water") ~= 0 then
minetest.add_node(p, {name="air"})
change = true
if n.name == "mclx_core:river_water_source" or n.name == "mclx_core:river_water_flowing" then
river_water = river_water + 1
else
non_river_water = non_river_water + 1
end
2017-03-03 00:49:30 +01:00
end
end
end
end
-- The dominant water type wins. In case of a tie, normal water wins.
-- This slight bias is intentional.
local sponge_type
if river_water > non_river_water then
sponge_type = "mcl_sponges:sponge_wet_river_water"
else
sponge_type = "mcl_sponges:sponge_wet"
end
return change, sponge_type
2017-03-03 00:49:30 +01:00
end
2017-02-16 20:45:28 +01:00
minetest.register_node("mcl_sponges:sponge", {
description = S("Sponge"),
2020-02-19 04:54:17 +01:00
_tt_help = S("Removes water on contact"),
_doc_items_longdesc = S("Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge."),
2017-02-16 20:45:28 +01:00
drawtype = "normal",
is_ground_content = false,
tiles = {"mcl_sponges_sponge.png"},
walkable = true,
pointable = true,
diggable = true,
buildable_to = false,
stack_max = 64,
sounds = mcl_sounds.node_sound_dirt_defaults(),
groups = {handy=1, hoey=1, building_block=1},
2017-03-03 00:19:13 +01:00
on_place = function(itemstack, placer, pointed_thing)
2017-02-16 20:45:28 +01:00
local pn = placer:get_player_name()
if pointed_thing.type ~= "node" then
return itemstack
end
-- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under)
if placer and not placer:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
2017-02-16 20:45:28 +01:00
if minetest.is_protected(pointed_thing.above, pn) then
return itemstack
end
2017-03-03 00:49:30 +01:00
2017-03-03 00:19:13 +01:00
local pos = pointed_thing.above
2017-03-03 00:49:30 +01:00
local on_water = false
if minetest.get_item_group(minetest.get_node(pos).name, "water") ~= 0 then
2017-02-16 20:45:28 +01:00
on_water = true
end
2017-03-03 00:49:30 +01:00
local water_found = minetest.find_node_near(pos, 1, "group:water")
if water_found then
2017-03-03 00:49:30 +01:00
on_water = true
2017-02-16 20:45:28 +01:00
end
2017-03-03 00:49:30 +01:00
if on_water then
-- Absorb water
2017-03-03 00:51:22 +01:00
-- FIXME: pos is not always the right placement position because of pointed_thing
local absorbed, wet_sponge = absorb(pos)
if absorbed then
minetest.item_place_node(ItemStack(wet_sponge), placer, pointed_thing)
2020-07-10 16:08:40 +02:00
if not minetest.is_creative_enabled(placer:get_player_name()) then
2017-03-03 00:49:30 +01:00
itemstack:take_item()
2017-02-16 20:45:28 +01:00
end
2017-03-03 00:49:30 +01:00
return itemstack
2017-02-16 20:45:28 +01:00
end
2017-03-03 00:19:13 +01:00
end
2017-03-03 00:49:30 +01:00
return minetest.item_place_node(itemstack, placer, pointed_thing)
end,
_mcl_blast_resistance = 0.6,
_mcl_hardness = 0.6,
2017-02-16 20:45:28 +01:00
})
2021-04-07 09:56:00 +02:00
function place_wet_sponge(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
-- Use pointed node's on_rightclick function first, if present
local node = minetest.get_node(pointed_thing.under)
if placer and not placer:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
end
end
local name = placer:get_player_name()
if minetest.is_protected(pointed_thing.above, name) then
return itemstack
end
if mcl_worlds.pos_to_dimension(pointed_thing.above) == "nether" then
minetest.item_place_node(ItemStack("mcl_sponges:sponge"), placer, pointed_thing)
local pos = pointed_thing.above
for n = 1, 5 do
minetest.add_particlespawner({
amount = 5,
time = 0.1,
minpos = vector.offset(pos, -0.5, 0.6, -0.5),
maxpos = vector.offset(pos, 0.5, 0.6, 0.5),
minvel = vector.new(0, 0.1, 0),
maxvel = vector.new(0, 1, 0),
minexptime = 0.1,
maxexptime = 1,
minsize = 2,
maxsize = 5,
collisiondetection = false,
vertical = false,
texture = "mcl_particles_sponge" .. n .. ".png",
})
end
2021-04-07 09:56:00 +02:00
if not minetest.is_creative_enabled(name) then
itemstack:take_item()
end
return itemstack
end
return minetest.item_place_node(itemstack, placer, pointed_thing)
end
2017-02-16 20:45:28 +01:00
minetest.register_node("mcl_sponges:sponge_wet", {
description = S("Waterlogged Sponge"),
2020-02-19 04:54:17 +01:00
_tt_help = S("Can be dried in furnace"),
_doc_items_longdesc = S("A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket."),
2017-02-16 20:45:28 +01:00
drawtype = "normal",
is_ground_content = false,
tiles = {"mcl_sponges_sponge_wet.png"},
walkable = true,
pointable = true,
diggable = true,
buildable_to = false,
stack_max = 64,
sounds = mcl_sounds.node_sound_dirt_defaults(),
groups = {handy=1, hoey=1, waterlogged = 1, building_block=1},
2021-04-07 09:56:00 +02:00
on_place = place_wet_sponge,
_mcl_blast_resistance = 0.6,
_mcl_hardness = 0.6,
2017-02-16 20:45:28 +01:00
})
2017-11-30 17:46:47 +01:00
if minetest.get_modpath("mclx_core") then
minetest.register_node("mcl_sponges:sponge_wet_river_water", {
description = S("Riverwaterlogged Sponge"),
2020-02-19 04:54:17 +01:00
_tt_help = S("Can be dried in furnace"),
_doc_items_longdesc = S("This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.") .. "\n" .. S("A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water."),
2017-11-30 17:46:47 +01:00
drawtype = "normal",
is_ground_content = false,
tiles = {"mcl_sponges_sponge_wet_river_water.png"},
walkable = true,
pointable = true,
diggable = true,
buildable_to = false,
stack_max = 64,
sounds = mcl_sounds.node_sound_dirt_defaults(),
groups = {handy=1, waterlogged = 1, building_block=1},
2021-04-07 09:56:00 +02:00
on_place = place_wet_sponge,
_mcl_blast_resistance = 0.6,
2017-11-30 17:46:47 +01:00
_mcl_hardness = 0.6,
})
minetest.register_craft({
type = "cooking",
output = "mcl_sponges:sponge",
recipe = "mcl_sponges:sponge_wet_river_water",
cooktime = 10,
})
end
2017-02-16 20:45:28 +01:00
minetest.register_craft({
type = "cooking",
output = "mcl_sponges:sponge",
recipe = "mcl_sponges:sponge_wet",
cooktime = 10,
})
2017-03-03 00:49:30 +01:00
minetest.register_abm({
label = "Sponge water absorbtion",
nodenames = { "mcl_sponges:sponge" },
neighbors = { "group:water" },
interval = 1,
chance = 1,
action = function(pos)
local absorbed, wet_sponge = absorb(pos)
if absorbed then
minetest.add_node(pos, {name = wet_sponge})
2017-03-03 00:49:30 +01:00
end
end,
})