251 lines
8.1 KiB
Lua
251 lines
8.1 KiB
Lua
local S = minetest.get_translator(minetest.get_current_modname())
|
|
|
|
local mod_doc = minetest.get_modpath("doc")
|
|
|
|
local function sea_pickle_on_place(itemstack, placer, pointed_thing, level)
|
|
if level == nil then level=1 end
|
|
if pointed_thing.type ~= "node" or not placer then
|
|
return itemstack
|
|
end
|
|
|
|
local player_name = placer:get_player_name()
|
|
local pos_under = pointed_thing.under
|
|
local pos_above = pointed_thing.above
|
|
local node_under = minetest.get_node(pos_under)
|
|
local node_above = minetest.get_node(pos_above)
|
|
|
|
local rc = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing)
|
|
if rc then return rc end
|
|
|
|
if minetest.is_protected(pos_under, player_name) or
|
|
minetest.is_protected(pos_above, player_name) then
|
|
minetest.log("action", player_name
|
|
.. " tried to place " .. itemstack:get_name()
|
|
.. " at protected position "
|
|
.. minetest.pos_to_string(pos_under))
|
|
minetest.record_protection_violation(pos_under, player_name)
|
|
return itemstack
|
|
end
|
|
|
|
local submerged = false
|
|
if minetest.get_item_group(node_above.name, "water") ~= 0 then
|
|
submerged = true
|
|
end
|
|
-- Place
|
|
if node_under.name == "mcl_ocean:dead_brain_coral_block" then
|
|
-- Place on suitable coral block
|
|
if submerged then
|
|
node_under.name = "mcl_ocean:sea_pickle_"..level.."_dead_brain_coral_block"
|
|
else
|
|
node_under.name = "mcl_ocean:sea_pickle_" .. level .. "_off_dead_brain_coral_block"
|
|
end
|
|
minetest.set_node(pos_under, node_under)
|
|
elseif minetest.get_item_group(node_under.name, "sea_pickle") ~= 0 then
|
|
-- Grow by 1 stage
|
|
local def = minetest.registered_nodes[node_under.name]
|
|
if def and def._mcl_sea_pickle_next then
|
|
node_under.name = def._mcl_sea_pickle_next
|
|
minetest.set_node(pos_under, node_under)
|
|
else
|
|
return itemstack
|
|
end
|
|
else
|
|
return itemstack
|
|
end
|
|
if not minetest.is_creative_enabled(player_name) then
|
|
itemstack:take_item()
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
-- Sea Pickle on brain coral
|
|
|
|
local sounds_coral_plant = mcl_sounds.node_sound_leaves_defaults({footstep = mcl_sounds.node_sound_dirt_defaults().footstep})
|
|
local ontop = "dead_brain_coral_block"
|
|
local canonical = "mcl_ocean:sea_pickle_1_"..ontop
|
|
local light_strength = { 6, 9, 12, minetest.LIGHT_MAX }
|
|
|
|
for s=1,4 do
|
|
local desc, doc_desc, doc_use, doc_create, tt_help, nici, img, img_off, on_place, cookoutput
|
|
if s == 1 then
|
|
desc = S("Sea Pickle")
|
|
doc_desc = S("Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.")
|
|
doc_use = S("It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.")
|
|
tt_help = S("Glows in the water").."\n"..S("4 possible sizes").."\n"..S("Grows on dead brain coral block")
|
|
img = "mcl_ocean_sea_pickle_item.png"
|
|
cookoutput = "mcl_dyes:lime"
|
|
on_place = sea_pickle_on_place
|
|
else
|
|
doc_create = false
|
|
nici = 1
|
|
img = "mcl_ocean_"..ontop..".png^(mcl_ocean_sea_pickle_"..s.."_anim.png^[verticalframe:2:1)"
|
|
cookoutput = nil
|
|
end
|
|
img_off = "mcl_ocean_"..ontop..".png^mcl_ocean_sea_pickle_"..s.."_off.png"
|
|
local next_on, next_off
|
|
if s < 4 then
|
|
next_on = "mcl_ocean:sea_pickle_" .. tostring(s + 1) .. "_" .. ontop
|
|
next_off = "mcl_ocean:sea_pickle_" .. tostring(s + 1) .. "_off_" .. ontop
|
|
end
|
|
|
|
local function spread_sea_pickle(pos, placer)
|
|
local possible_position = {
|
|
{ x = 2, y = 0, z = 0 },
|
|
{ x = -2, y = 0, z = 0 },
|
|
{ x = 1, y = 0, z = 0 },
|
|
{ x = -1, y = 0, z = 0 },
|
|
{ x = 0, y = 0, z = 1 },
|
|
{ x = 0, y = 0, z = -1 },
|
|
{ x = 0, y = 0, z = 2 },
|
|
{ x = 0, y = 0, z = -2 },
|
|
{ x = 1, y = -1, z = 0 },
|
|
{ x = -1, y = -1, z = 0 },
|
|
{ x = 0, y = -1, z = 1 },
|
|
{ x = 0, y = -1, z = -1 },
|
|
{ x = 1, y = 0, z = 1 },
|
|
{ x = 1, y = 0, z = -1 },
|
|
{ x = -1, y = 0, z = 1 },
|
|
{ x = -1, y = 0, z = -1 },
|
|
}
|
|
|
|
for _, v in pairs(possible_position) do
|
|
sea_pickle_on_place(
|
|
ItemStack("mcl_ocean:sea_pickle"),
|
|
placer,
|
|
{type="node", under=vector.offset(pos,v.x,v.y,v.z), above=vector.offset(pos,v.x,v.y-1,v.z)},
|
|
math.random(1, 3))
|
|
end
|
|
end
|
|
|
|
local function on_bone_meal(_, placer, pointed_thing, pos, node)
|
|
if pointed_thing.type ~= "node" then return end
|
|
if 4 ~= s then
|
|
node.name = "mcl_ocean:sea_pickle_" .. (s + 1) .. "_" .. ontop
|
|
minetest.swap_node(pos, node)
|
|
end
|
|
spread_sea_pickle(pos, placer)
|
|
end
|
|
|
|
minetest.register_node("mcl_ocean:sea_pickle_"..s.."_"..ontop, {
|
|
description = desc,
|
|
_tt_help = tt_help,
|
|
_doc_items_create_entry = doc_create,
|
|
_doc_items_longdesc = doc_desc,
|
|
_doc_items_usagehelp = doc_use,
|
|
drawtype = "plantlike_rooted",
|
|
paramtype = "light",
|
|
paramtype2 = "meshoptions",
|
|
tiles = { "mcl_ocean_"..ontop..".png" },
|
|
special_tiles = {
|
|
{
|
|
image = "mcl_ocean_sea_pickle_"..s.."_anim.png",
|
|
animation = {type="vertical_frames", aspect_w=16, aspect_h=16, length=1.7},
|
|
}
|
|
},
|
|
inventory_image = img,
|
|
wield_image = img,
|
|
groups = {
|
|
dig_immediate = 3, deco_block = 1, sea_pickle = 1,
|
|
not_in_creative_inventory=nici, compostability = 65, dig_by_piston = 1, unsticky = 1
|
|
},
|
|
light_source = light_strength[s],
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 },
|
|
}
|
|
},
|
|
sounds = sounds_coral_plant,
|
|
drop = canonical .. " "..s,
|
|
node_placement_prediction = "",
|
|
node_dig_prediction = "mcl_ocean:"..ontop,
|
|
after_dig_node = function(pos)
|
|
local node = minetest.get_node(pos)
|
|
if minetest.get_item_group(node.name, "sea_pickle") == 0 then
|
|
minetest.set_node(pos, {name="mcl_ocean:"..ontop})
|
|
end
|
|
end,
|
|
on_place = on_place,
|
|
_mcl_sea_pickle_off = "mcl_ocean:sea_pickle_"..s.."_off_"..ontop,
|
|
_mcl_sea_pickle_next = next_on,
|
|
_mcl_baseitem = "mcl_ocean:sea_pickle_1_dead_brain_coral_block",
|
|
_mcl_hardness = 0,
|
|
_mcl_blast_resistance = 0,
|
|
_mcl_cooking_output = cookoutput,
|
|
_on_bone_meal = on_bone_meal,
|
|
})
|
|
|
|
minetest.register_node("mcl_ocean:sea_pickle_"..s.."_off_"..ontop, {
|
|
drawtype = "plantlike_rooted",
|
|
paramtype = "light",
|
|
paramtype2 = "meshoptions",
|
|
tiles = { "mcl_ocean_"..ontop..".png" },
|
|
special_tiles = { "mcl_ocean_sea_pickle_"..s.."_off.png", },
|
|
groups = { dig_immediate = 3, deco_block = 1, sea_pickle=2, not_in_creative_inventory=1 },
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{ -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 },
|
|
{ -0.15, 0.5, -0.15, 0.15, 0.5+2/16+(2/16)*s, 0.15 },
|
|
}
|
|
},
|
|
inventory_image = img_off,
|
|
wield_image = img_off,
|
|
sounds = sounds_coral_plant,
|
|
drop = canonical .. " "..s,
|
|
node_placement_prediction = "",
|
|
node_dig_prediction = "mcl_ocean:"..ontop,
|
|
after_dig_node = function(pos)
|
|
local node = minetest.get_node(pos)
|
|
if minetest.get_item_group(node.name, "sea_pickle") == 0 then
|
|
minetest.set_node(pos, {name="mcl_ocean:"..ontop})
|
|
end
|
|
end,
|
|
_mcl_sea_pickle_on = "mcl_ocean:sea_pickle_"..s.."_"..ontop,
|
|
_mcl_sea_pickle_next = next_off,
|
|
_mcl_baseitem = "mcl_ocean:sea_pickle_1_dead_brain_coral_block",
|
|
_mcl_hardness = 0,
|
|
_mcl_blast_resistance = 0,
|
|
})
|
|
|
|
if mod_doc then
|
|
if s == 1 then
|
|
doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_1_off_"..ontop)
|
|
else
|
|
doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_off_"..ontop)
|
|
doc.add_entry_alias("nodes", "mcl_ocean:sea_pickle_1_dead_brain_coral_block", "nodes", "mcl_ocean:sea_pickle_"..s.."_"..ontop)
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.register_abm({
|
|
label = "Sea pickle update",
|
|
nodenames = { "group:sea_pickle" },
|
|
interval = 17,
|
|
chance = 5,
|
|
catch_up = false,
|
|
action = function(pos, node)
|
|
-- Check if it's lit
|
|
local state = minetest.get_item_group(node.name, "sea_pickle")
|
|
-- Check for water
|
|
local checknode = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
|
|
local def = minetest.registered_nodes[node.name]
|
|
if minetest.get_item_group(checknode.name, "water") ~= 0 then
|
|
-- Sea pickle is unlit
|
|
if state == 2 then
|
|
node.name = def._mcl_sea_pickle_on
|
|
minetest.set_node(pos, node)
|
|
return
|
|
end
|
|
else
|
|
-- Sea pickle is lit
|
|
if state == 1 then
|
|
node.name = def._mcl_sea_pickle_off
|
|
minetest.set_node(pos, node)
|
|
return
|
|
end
|
|
end
|
|
end,
|
|
})
|