1
0
Fork 0

Allow dropper to be facing up- or downwards

objects
Wuzzy 2017-02-14 02:15:51 +01:00
parent 73a22d3de1
commit f08e23469f
1 changed files with 86 additions and 34 deletions

View File

@ -1,29 +1,33 @@
minetest.register_node("mcl_dropper:dropper", { --[[ This mod registers 3 nodes:
description = "Dropper", - One node for the horizontal-facing dropper (mcl_dropper:dropper)
tiles = { - One node for the upwards-facing droppers (mcl_dropper:dropper_up)
"default_furnace_top.png", "default_furnace_bottom.png", - One node for the downwards-facing droppers (mcl_dropper:dropper_down)
"default_furnace_side.png", "default_furnace_side.png",
"default_furnace_side.png", "mcl_dropper_dropper_front_horizontal.png" 3 node definitions are needed because of the way the textures are defined.
}, All node definitions share a lot of code, so this is the reason why there
groups = {cracky=2,container=2}, are so many weird tables below.
]]
local setup_dropper = function(pos)
local form = "size[9,8.75]"..
"background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]"..
mcl_core.inventory_header..
"image[3,-0.2;5,0.75;mcl_dropper_fnt_dropper.png]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;main;3,0.5;3,3;]"..
"listring[current_name;main]"..
"listring[current_player;main]"
local meta = minetest.get_meta(pos)
meta:set_string("formspec", form)
local inv = meta:get_inventory()
inv:set_size("main", 9)
end
-- Shared core definition table
local dropperdef = {
is_ground_content = false, is_ground_content = false,
paramtype2 = "facedir",
sounds = mcl_sounds.node_sound_stone_defaults(), sounds = mcl_sounds.node_sound_stone_defaults(),
after_place_node = function(pos)
local form = "size[9,8.75]"..
"background[-0.19,-0.25;9.41,9.49;crafting_inventory_9_slots.png]"..
mcl_core.inventory_header..
"image[3,-0.2;5,0.75;mcl_dropper_fnt_dropper.png]"..
"list[current_player;main;0,4.5;9,3;9]"..
"list[current_player;main;0,7.74;9,1;]"..
"list[current_name;main;3,0.5;3,3;]"..
"listring[current_name;main]"..
"listring[current_player;main]"
local meta = minetest.get_meta(pos)
meta:set_string("formspec", form)
local inv = meta:get_inventory()
inv:set_size("main", 9)
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger) after_dig_node = function(pos, oldnode, oldmetadata, digger)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local meta2 = meta local meta2 = meta
@ -43,7 +47,14 @@ minetest.register_node("mcl_dropper:dropper", {
action_on = function (pos, node) action_on = function (pos, node)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) local droppos
if node.name == "mcl_dropper:dropper" then
droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2))
elseif node.name == "mcl_dropper:dropper_up" then
droppos = {x=pos.x, y=pos.y+1, z=pos.z}
elseif node.name == "mcl_dropper:dropper_down" then
droppos = {x=pos.x, y=pos.y-1, z=pos.z}
end
local dropnode = minetest.get_node(droppos) local dropnode = minetest.get_node(droppos)
-- Do not drop into solid nodes, unless they are containers -- Do not drop into solid nodes, unless they are containers
local dropnodedef = minetest.registered_nodes[dropnode.name] local dropnodedef = minetest.registered_nodes[dropnode.name]
@ -75,13 +86,54 @@ minetest.register_node("mcl_dropper:dropper", {
end end
end end
}} }}
}) }
minetest.register_craft({ -- Horizontal dropper
output = 'mcl_dropper:dropper',
recipe = { local horizontal_def = table.copy(dropperdef)
{"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, horizontal_def.description = "Dropper"
{"mcl_core:cobble", "", "mcl_core:cobble",}, horizontal_def.after_place_node = function(pos, placer, itemstack, pointed_thing)
{"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, setup_dropper(pos)
}
}) -- When placed up and down, convert node to up/down dropper
if pointed_thing.above.y < pointed_thing.under.y then
minetest.swap_node(pos, {name = "mcl_dropper:dropper_down"})
elseif pointed_thing.above.y > pointed_thing.under.y then
minetest.swap_node(pos, {name = "mcl_dropper:dropper_up"})
end
-- Else, the normal facedir logic applies
end
horizontal_def.tiles = {
"default_furnace_top.png", "default_furnace_bottom.png",
"default_furnace_side.png", "default_furnace_side.png",
"default_furnace_side.png", "mcl_dropper_dropper_front_horizontal.png"
}
horizontal_def.paramtype2 = "facedir"
horizontal_def.groups = {cracky=2,container=2}
minetest.register_node("mcl_dropper:dropper", horizontal_def)
-- Down dropper
local down_def = table.copy(dropperdef)
down_def.description = "Downwards-Facing Dropper"
down_def.after_place_node = setup_dropper
down_def.tiles = {
"default_furnace_top.png", "mcl_dropper_dropper_front_vertical.png",
"default_furnace_side.png", "default_furnace_side.png",
"default_furnace_side.png", "default_furnace_side.png"
}
down_def.groups = {cracky=2,container=2,not_in_creative_inventory=1}
down_def.drop = "mcl_dropper:dropper"
minetest.register_node("mcl_dropper:dropper_down", down_def)
-- Up dropper
-- The up dropper is almost identical to the down dropper, it only differs in textures
up_def = table.copy(down_def)
up_def.description = "Upwards-Facing Dropper"
up_def.tiles = {
"mcl_dropper_dropper_front_vertical.png", "default_furnace_bottom.png",
"default_furnace_side.png", "default_furnace_side.png",
"default_furnace_side.png", "default_furnace_side.png"
}
minetest.register_node("mcl_dropper:dropper_up", up_def)