forked from VoxeLibre/VoxeLibre
335 lines
11 KiB
Lua
335 lines
11 KiB
Lua
-- Other nodes
|
|
local S = minetest.get_translator(minetest.get_current_modname())
|
|
|
|
local mod_screwdriver = minetest.get_modpath("screwdriver")
|
|
|
|
local on_rotate
|
|
if mod_screwdriver then
|
|
on_rotate = screwdriver.rotate_3way
|
|
end
|
|
|
|
local alldirs = {
|
|
vector.new(0, 0, 1),
|
|
vector.new(1, 0, 0),
|
|
vector.new(0, 0, -1),
|
|
vector.new(-1, 0, 0),
|
|
vector.new(0, -1, 0),
|
|
vector.new(0, 1, 0),
|
|
}
|
|
|
|
minetest.register_node("mcl_core:bone_block", {
|
|
description = S("Bone Block"),
|
|
tiles = {"mcl_core_bone_block_top.png", "mcl_core_bone_block_top.png", "mcl_core_bone_block_side.png"},
|
|
is_ground_content = false,
|
|
paramtype2 = "facedir",
|
|
on_place = mcl_util.rotate_axis,
|
|
groups = {pickaxey = 1, building_block = 1, material_stone = 1},
|
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
|
on_rotate = on_rotate,
|
|
_mcl_blast_resistance = 2,
|
|
_mcl_hardness = 2,
|
|
})
|
|
|
|
minetest.register_node("mcl_core:slimeblock", {
|
|
description = S("Slime Block"),
|
|
drawtype = "nodebox",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.25, -0.25, -0.25, 0.25, 0.25, 0.25},
|
|
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
|
|
}
|
|
},
|
|
selection_box = {
|
|
type = "regular",
|
|
},
|
|
tiles = {"mcl_core_slime.png"},
|
|
use_texture_alpha = "blend",
|
|
-- According to Minecraft Wiki, bouncing off a slime block from a height off 255 blocks should result in a bounce height of 50 blocks
|
|
-- bouncy=44 makes the player bounce up to 49.6. This value was chosen by experiment.
|
|
-- bouncy=80 was chosen because it is higher than 66 (bounciness of bed)
|
|
groups = {dig_immediate = 3, bouncy = 80, fall_damage_add_percent = -100, deco_block = 1},
|
|
sounds = {
|
|
dug = {name = "slimenodes_dug", gain = 0.6},
|
|
place = {name = "slimenodes_place", gain = 0.6},
|
|
footstep = {name = "slimenodes_step", gain = 0.3},
|
|
},
|
|
_mcl_blast_resistance = 0,
|
|
_mcl_hardness = 0,
|
|
mvps_sticky = function(pos, node, piston_pos)
|
|
local connected = {}
|
|
for n, v in ipairs(alldirs) do
|
|
local neighbor_pos = vector.add(pos, v)
|
|
local neighbor_node = minetest.get_node(neighbor_pos)
|
|
if neighbor_node then
|
|
if neighbor_node.name == "ignore" then
|
|
minetest.get_voxel_manip():read_from_map(neighbor_pos, neighbor_pos)
|
|
neighbor_node = minetest.get_node(neighbor_pos)
|
|
end
|
|
local name = neighbor_node.name
|
|
if name ~= "air" and name ~= "ignore" and name ~= "mcl_honey:honey_block" and not mesecon.mvps_unsticky[name] then
|
|
local piston, piston_side, piston_up, piston_down = false, false, false, false
|
|
if name == "mesecons_pistons:piston_sticky_off" or name == "mesecons_pistons:piston_normal_off" then
|
|
piston, piston_side = true, true
|
|
elseif name == "mesecons_pistons:piston_up_sticky_off" or name == "mesecons_pistons:piston_up_normal_off" then
|
|
piston, piston_up = true, true
|
|
elseif name == "mesecons_pistons:piston_down_sticky_off" or name == "mesecons_pistons:piston_down_normal_off" then
|
|
piston, piston_down = true, true
|
|
end
|
|
if not
|
|
((piston_side and (n - 1 == neighbor_node.param2)) or (piston_up and (n == 5)) or (piston_down and (n == 6))) then
|
|
if piston and piston_pos then
|
|
if piston_pos.x == neighbor_pos.x and piston_pos.y == neighbor_pos.y and piston_pos.z == neighbor_pos.z then
|
|
-- Loopback to the same piston! Preventing unwanted behavior:
|
|
return {}, true
|
|
end
|
|
end
|
|
table.insert(connected, neighbor_pos)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return connected, false
|
|
end,
|
|
|
|
})
|
|
|
|
minetest.register_node("mcl_core:cobweb", {
|
|
description = S("Cobweb"),
|
|
drawtype = "plantlike",
|
|
paramtype2 = "degrotate",
|
|
visual_scale = 1.1,
|
|
tiles = {"mcl_core_web.png"},
|
|
inventory_image = "mcl_core_web.png",
|
|
paramtype = "light",
|
|
liquid_viscosity = 14,
|
|
liquidtype = "source",
|
|
liquid_alternative_flowing = "mcl_core:cobweb",
|
|
liquid_alternative_source = "mcl_core:cobweb",
|
|
liquid_renewable = false,
|
|
liquid_range = 0,
|
|
walkable = false,
|
|
groups = {swordy_cobweb = 1, shearsy_cobweb = 1, fake_liquid = 1, disable_jump = 1, deco_block = 1, dig_by_piston = 1,
|
|
dig_by_water = 1, destroy_by_lava_flow = 1,},
|
|
drop = "mcl_mobitems:string",
|
|
_mcl_shears_drop = true,
|
|
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
|
_mcl_blast_resistance = 4,
|
|
_mcl_hardness = 4,
|
|
})
|
|
|
|
|
|
minetest.register_node("mcl_core:deadbush", {
|
|
description = S("Dead Bush"),
|
|
drawtype = "plantlike",
|
|
waving = 1,
|
|
visual_scale = 1.0,
|
|
tiles = {"default_dry_shrub.png"},
|
|
inventory_image = "default_dry_shrub.png",
|
|
wield_image = "default_dry_shrub.png",
|
|
paramtype = "light",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
buildable_to = true,
|
|
groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_piston = 1,
|
|
dig_by_water = 1, destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100},
|
|
drop = {
|
|
max_items = 1,
|
|
items = {
|
|
{
|
|
items = {"mcl_core:stick 2"},
|
|
rarity = 2,
|
|
},
|
|
{
|
|
items = {"mcl_core:stick 1"},
|
|
rarity = 2,
|
|
},
|
|
}
|
|
},
|
|
_mcl_shears_drop = true,
|
|
sounds = mcl_sounds.node_sound_leaves_defaults(),
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = {-5 / 16, -8 / 16, -5 / 16, 5 / 16, 1 / 16, 5 / 16},
|
|
},
|
|
_mcl_blast_resistance = 0,
|
|
_mcl_hardness = 0,
|
|
})
|
|
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "mcl_core:deadbush",
|
|
burntime = 5,
|
|
})
|
|
|
|
minetest.register_node("mcl_core:barrier", {
|
|
description = S("Barrier"),
|
|
drawtype = "airlike",
|
|
paramtype = "light",
|
|
inventory_image = "mcl_core_barrier.png",
|
|
wield_image = "mcl_core_barrier.png",
|
|
tiles = {"blank.png"},
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {creative_breakable = 1, not_in_creative_inventory = 1, not_solid = 1},
|
|
on_blast = function(pos, intensity) end,
|
|
drop = "",
|
|
_mcl_blast_resistance = 36000008,
|
|
_mcl_hardness = -1,
|
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
|
if placer == nil then
|
|
return
|
|
end
|
|
minetest.add_particle({
|
|
pos = pos,
|
|
expirationtime = 1,
|
|
size = 8,
|
|
texture = "mcl_core_barrier.png",
|
|
glow = 14,
|
|
playername = placer:get_player_name()
|
|
})
|
|
end,
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if pointed_thing.type ~= "node" then
|
|
return itemstack
|
|
end
|
|
|
|
-- Use pointed node's on_rightclick function first, if present
|
|
local new_stack = mcl_util.call_on_rightclick(itemstack, placer, pointed_thing)
|
|
if new_stack then
|
|
return new_stack
|
|
end
|
|
|
|
local name = placer:get_player_name()
|
|
local privs = minetest.get_player_privs(name)
|
|
if not privs.maphack then
|
|
minetest.chat_send_player(name, "Placement denied. You need the “maphack” privilege to place barriers.")
|
|
return itemstack
|
|
end
|
|
local new_itemstack = minetest.item_place(itemstack, placer, pointed_thing)
|
|
return new_itemstack
|
|
end,
|
|
})
|
|
|
|
-- Same as barrier, but non-pointable. This node is only to be used internally to separate realms.
|
|
-- It must NOT be used for anything else.
|
|
-- This node only exists because Minetest does not have support for “dimensions” yet and needs to
|
|
-- be removed when support for this is implemented.
|
|
minetest.register_node("mcl_core:realm_barrier", {
|
|
description = S("Realm Barrier"),
|
|
drawtype = "airlike",
|
|
paramtype = "light",
|
|
inventory_image = "mcl_core_barrier.png^[colorize:#FF00FF:127^[transformFX",
|
|
wield_image = "mcl_core_barrier.png^[colorize:#FF00FF:127^[transformFX",
|
|
tiles = {"blank.png"},
|
|
-- To avoid players getting stuck forever between realms
|
|
damage_per_second = 8,
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
pointable = false,
|
|
groups = {not_in_creative_inventory = 1, not_solid = 1},
|
|
on_blast = function(pos, intensity) end,
|
|
drop = "",
|
|
_mcl_blast_resistance = 36000008,
|
|
_mcl_hardness = -1,
|
|
-- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of.
|
|
node_placement_prediction = "",
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if placer then
|
|
minetest.chat_send_player(placer:get_player_name(),
|
|
minetest.colorize(mcl_colors.RED, "You can't just place a realm barrier by hand!"))
|
|
end
|
|
return
|
|
end,
|
|
})
|
|
|
|
|
|
--- Light blocks
|
|
--- TODO: make node only pointable when wielding it
|
|
|
|
local light_block_pattern = "^mcl_core:light_(%d+)$"
|
|
|
|
|
|
for i = 0, 14 do --minetest.LIGHT_MAX
|
|
minetest.register_node("mcl_core:light_" .. i, {
|
|
description = S("Light"),
|
|
drawtype = "airlike",
|
|
paramtype = "light",
|
|
walkable = false,
|
|
light_source = i,
|
|
drop = "",
|
|
buildable_to = true,
|
|
node_placement_prediction = "",
|
|
inventory_image = "mcl_core_light_" .. i .. ".png",
|
|
wield_image = "mcl_core_light_" .. i .. ".png",
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {creative_breakable = 1, not_solid = 1, light_block = i + 1},
|
|
on_blast = function(pos, intensity) end,
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
-- user:get_player_control() returns {} for non players, so we don't need user:is_player()
|
|
if pointed_thing.type == "node" and string.match(minetest.get_node(pointed_thing.under).name, light_block_pattern) and not user:get_player_control().sneak then
|
|
minetest.dig_node(pointed_thing.under)
|
|
return
|
|
end
|
|
itemstack:set_name("mcl_core:light_" .. ((i == 14) and 0 or i + 1))
|
|
return itemstack
|
|
end,
|
|
on_place = mcl_util.bypass_buildable_to(function(node_name)
|
|
return string.match(node_name, light_block_pattern)
|
|
end),
|
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
|
if not placer then
|
|
return
|
|
end
|
|
minetest.add_particle({
|
|
pos = pos,
|
|
expirationtime = 1,
|
|
size = 8,
|
|
texture = "mcl_core_light_" .. i .. ".png",
|
|
glow = 14,
|
|
playername = placer:get_player_name()
|
|
})
|
|
end,
|
|
_mcl_blast_resistance = 36000008,
|
|
_mcl_hardness = -1,
|
|
})
|
|
end
|
|
|
|
|
|
|
|
|
|
-- The void below the bedrock. Void damage is handled in mcl_playerplus.
|
|
-- The void does not exist as a block in Minecraft but we register it as a
|
|
-- block here to make things easier for us.
|
|
minetest.register_node("mcl_core:void", {
|
|
description = S("Void"),
|
|
drawtype = "airlike",
|
|
paramtype = "light",
|
|
pointable = false,
|
|
walkable = false,
|
|
floodable = false,
|
|
buildable_to = false,
|
|
inventory_image = "mcl_core_void.png",
|
|
wield_image = "mcl_core_void.png",
|
|
sunlight_propagates = true,
|
|
is_ground_content = false,
|
|
groups = {not_in_creative_inventory = 1},
|
|
on_blast = function(pos, intensity) end,
|
|
-- Prevent placement to protect player from screwing up the world, because the node is not pointable and hard to get rid of.
|
|
node_placement_prediction = "",
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if placer then
|
|
minetest.chat_send_player(placer:get_player_name(),
|
|
minetest.colorize(mcl_colors.RED, "You can't just place the void by hand!"))
|
|
end
|
|
return
|
|
end,
|
|
drop = "",
|
|
-- Infinite blast resistance; it should never be destroyed by explosions
|
|
_mcl_blast_resistance = -1,
|
|
_mcl_hardness = -1,
|
|
})
|