From ebccf81758ce7b5ace7a593f9985fa97b3435798 Mon Sep 17 00:00:00 2001 From: Zefram Date: Mon, 21 Jul 2014 14:29:45 +0100 Subject: [PATCH] Add dispenser The dispenser is an automated item dropper. --- default_settings.txt | 1 + dispenser.lua | 200 +++++++++++++++++++++ init.lua | 1 + textures/pipeworks_dispenser_back.png | Bin 0 -> 2031 bytes textures/pipeworks_dispenser_bottom.png | Bin 0 -> 4508 bytes textures/pipeworks_dispenser_front_off.png | Bin 0 -> 4722 bytes textures/pipeworks_dispenser_front_on.png | Bin 0 -> 4676 bytes textures/pipeworks_dispenser_side1.png | Bin 0 -> 4519 bytes textures/pipeworks_dispenser_side2.png | Bin 0 -> 4518 bytes textures/pipeworks_dispenser_top.png | Bin 0 -> 4501 bytes 10 files changed, 202 insertions(+) create mode 100644 dispenser.lua create mode 100644 textures/pipeworks_dispenser_back.png create mode 100644 textures/pipeworks_dispenser_bottom.png create mode 100644 textures/pipeworks_dispenser_front_off.png create mode 100644 textures/pipeworks_dispenser_front_on.png create mode 100644 textures/pipeworks_dispenser_side1.png create mode 100644 textures/pipeworks_dispenser_side2.png create mode 100644 textures/pipeworks_dispenser_top.png diff --git a/default_settings.txt b/default_settings.txt index f594a16..4aa4150 100644 --- a/default_settings.txt +++ b/default_settings.txt @@ -3,6 +3,7 @@ pipeworks.enable_pipes = true pipeworks.enable_autocrafter = true pipeworks.enable_deployer = true +pipeworks.enable_dispenser = true pipeworks.enable_node_breaker = true pipeworks.enable_teleport_tube = true pipeworks.enable_pipe_devices = true diff --git a/dispenser.lua b/dispenser.lua new file mode 100644 index 0000000..de78348 --- /dev/null +++ b/dispenser.lua @@ -0,0 +1,200 @@ +minetest.register_craft({ + output = "pipeworks:dispenser_off", + recipe = { + { "default:desert_sand", "default:chest", "default:desert_sand" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } +}) + +local function delay(x) + return (function() return x end) +end + +local function dispenser_on(pos, node) + if node.name ~= "pipeworks:dispenser_off" then + return + end + + node.name = "pipeworks:dispenser_on" + minetest.swap_node(pos, node) + nodeupdate(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local invlist = inv:get_list("main") + for i, stack in ipairs(invlist) do + if stack:get_name() ~= nil and stack:get_name() ~= "" then + local dir = minetest.facedir_to_dir(node.param2) + local pitch + local yaw + if dir.z < 0 then + yaw = 0 + pitch = 0 + elseif dir.z > 0 then + yaw = math.pi + pitch = 0 + elseif dir.x < 0 then + yaw = 3*math.pi/2 + pitch = 0 + elseif dir.x > 0 then + yaw = math.pi/2 + pitch = 0 + elseif dir.y > 0 then + yaw = 0 + pitch = -math.pi/2 + else + yaw = 0 + pitch = math.pi/2 + end + local dropper_pos = {x = pos.x, y = pos.y - 1.5, z = pos.z} -- Player height + local dropper = { + get_inventory_formspec = delay(meta:get_string("formspec")), + get_look_dir = delay({x = -dir.x, y = -dir.y, z = -dir.z}), + get_look_pitch = delay(pitch), + get_look_yaw = delay(yaw), + get_player_control = delay({jump=false, right=false, left=false, LMB=false, RMB=false, sneak=true, aux1=false, down=false, up=false}), + get_player_control_bits = delay(0), + get_player_name = delay(":pipeworks:"..minetest.pos_to_string(pos)), + is_player = delay(true), + is_fake_player = true, + set_inventory_formspec = delay(), + getpos = delay(dropper_pos), + get_hp = delay(20), + get_inventory = delay(inv), + get_wielded_item = delay(stack), + get_wield_index = delay(i), + get_wield_list = delay("main"), + moveto = delay(), + punch = delay(), + remove = delay(), + right_click = delay(), + setpos = delay(), + set_hp = delay(), + set_properties = delay(), + set_wielded_item = function(self, item) inv:set_stack("main", i, item) end, + set_animation = delay(), + set_attach = delay(), + set_detach = delay(), + set_bone_position = delay(), + } + local stack2 + if minetest.registered_items[stack:get_name()] then + stack2 = minetest.registered_items[stack:get_name()].on_drop(stack, dropper, dropper_pos) or stack + end + inv:set_stack("main", i, stack2) + return + end + end +end + +local dispenser_off = function(pos, node) + if node.name == "pipeworks:dispenser_on" then + node.name = "pipeworks:dispenser_off" + minetest.swap_node(pos, node) + nodeupdate(pos) + end +end + +for _, state in ipairs({ "off", "on" }) do + local grps = { snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon=2, tubedevice=1, tubedevice_receiver=1 } + if state == "on" then grps.not_in_creative_inventory = 1 end + minetest.register_node("pipeworks:dispenser_"..state, { + description = "Dispenser", + tile_images = { + "pipeworks_dispenser_top.png", + "pipeworks_dispenser_bottom.png", + "pipeworks_dispenser_side2.png", + "pipeworks_dispenser_side1.png", + "pipeworks_dispenser_back.png", + "pipeworks_dispenser_front_"..state..".png", + }, + mesecons = { + effector = { + rules = pipeworks.rules_all, + action_on = dispenser_on, + action_off = dispenser_off, + }, + }, + tube={insert_object=function(pos,node,stack,direction) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + return inv:add_item("main",stack) + end, + can_insert=function(pos,node,stack,direction) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + return inv:room_for_item("main",stack) + end, + input_inventory="main", + connect_sides={back=1}, + can_remove = function(pos, node, stack, dir) + return stack:get_count() + end}, + is_ground_content = true, + paramtype2 = "facedir", + tubelike = 1, + groups = grps, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "label[0,0;Dispenser]".. + "list[current_name;main;4,1;3,3;]".. + "list[current_player;main;0,5;8,4;]") + meta:set_string("infotext", "Dispenser") + local inv = meta:get_inventory() + inv:set_size("main", 3*3) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + after_dig_node = pipeworks.scan_for_tube_objects, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") and meta:get_string("owner") ~= "" then + return 0 + end + return stack:get_count() + end, + }) +end diff --git a/init.lua b/init.lua index 8a6da60..265ae1d 100644 --- a/init.lua +++ b/init.lua @@ -121,6 +121,7 @@ if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") if pipeworks.enable_redefines then dofile(pipeworks.modpath.."/compat.lua") end if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end if pipeworks.enable_deployer then dofile(pipeworks.modpath.."/deployer.lua") end +if pipeworks.enable_dispenser then dofile(pipeworks.modpath.."/dispenser.lua") end if pipeworks.enable_node_breaker then dofile(pipeworks.modpath.."/node_breaker.lua") diff --git a/textures/pipeworks_dispenser_back.png b/textures/pipeworks_dispenser_back.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fade2b62fc103cda8a29a682ef5fab9281bc47 GIT binary patch literal 2031 zcmY*Zc~H}b68!6cxn>KDAPmdN-nDM?uus#vFLc9`?BA}=Sn&Tn+5=K2moje z0PyCM3tf3J6aXfv004IYz_+E_C}$G^VD?N#Dh}1v)z#9{VltVGMx)c|tgfzZZf>rr zscCF%tgWrJ*=!bzMX%RuG@A1Aa;;WdRaMp2*5+_H}Sl{%e{$z&E67nhZliN#`(NW@~X^78UZOG~X*E0szuC@A1^xeNw_NF){&6-gwL z0tSQ0bU8Yo&ld;;xjET6xU6g(HlIdOs}y)VJ~bs7orp|KL}p<#1p;1rdU|qlaza8v zTwGjAN=kNic2-taPEHO6gTZ34Nl8g46e>5@)h3%$$SUHn6>_OssnBWE3Yk>M=ZQrE zjY_H4YGl$fnWT)%k*5DVxdqZ5b$}feq4!IR9j`WnvE1PDK<8iNWfc+y6yIw>Pm~n zY^rdn(P%ar^*XIeA=ha&a+!=qr84L=d|n=rKw!}6QBhG55fN}WJUTjh^XAPPH*Wm& z>66!Dc8_Z#v+`5W$oDY|+BL3V9uJcz1OU(fe70FYlhX$P+{TlT2wc=)=v9{J4h}Fq zs7&AyeoMj>-M+y#JjHKojuQLU4)cpnGaJR9IKlApzkM~^t zGjG#dZ&4_RFmg(zId-@>34Ji~;l!UIVidp1-w@t&esT5jcjJn?ZqJ%q&YY3%3TyH4 z2=n}Ul^v=5ic0l|olx>SPwqc{SV5h@c&u18)L3-I+JajUIF&p5OYqAFSAS7Uj%^$n zjfiT(c%QR=+;(RS1a(foJ3Ozazh+}Y|Fhse((;41cBBUyeoBTcn(|&Z!8kyCz4-Ly z*>5$+4sZpaCu&*jI9P$7=XbD+-E zkL=Rh1S=x$+E^+me9}m!eOJ13i@8K3*XdOs^fWNQE6W_S@o1bFjWuQ|!bYZWvug^JUig!=q0$6PJ za!_W}v*`^ir|kFJPn?Q-Z@6oZ^~88tYJV5^1CPq{ZY_lTQn~i$M?-^aPdyyi-~IFW z@YC)WmGz70#DpJCBRkH)Y;;cKi1hlUqwkLrN{_2}g)5h4`PzLwVQX$g5A@t$Cb=h` z@jLe9-n%);LBz-B_I}}w@#vr1#0;K^{qz2CbkFlP^NJ;FbAnjJBVM*c;<@g)gPY#| zF_wN&_hb6zSL;m^zBli;F0kFtfa4|yrq^Bhs5$ifrze!o98`*J$-OzIF`fr^|MuyJ zDPdQ1TgjwTLnc$#1+SFZ!@Z8ayU8zyO}9oJjg7Lux{i*@Bp(#|PDJsDPVGM&1FPHD zJ`?*luOGcMQvLqI-d(DXXLn$Fio24Yg0=bC=O-fyRIgq|j;d!qd>#97`maff`okp# zB%A9i4~sjnFK!P(e{ymr?dC*mhfHyOmt)^LkNp>BPr4t#kA-6LX5*yzh+of9(pKIS zo#D(H9!hB~VdgFi*B9(uMfaI{G&&#kV_SYsHoC*HFk@L|W2d`M1RDQCz?G8mi+Il) zD^W#OqF>e79{+>uyz6kBSh8@9{*LPnKt!lq5rZZwfYSv9E&yQA@b#h4$WT}~E_^*476FH?4~B-r sq0nzy<4*mHP+ZDjGiCoGtb=ceg2Tf9Pmm#}FS-ao5^4*wJD#fl2QuV#Y5)KL literal 0 HcmV?d00001 diff --git a/textures/pipeworks_dispenser_bottom.png b/textures/pipeworks_dispenser_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..35416de2dc966f64de118ccdd6d211b6fc6a2dfb GIT binary patch literal 4508 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%0Dy?KRyv>0 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 FV1m~oj?e%A literal 0 HcmV?d00001 diff --git a/textures/pipeworks_dispenser_side2.png b/textures/pipeworks_dispenser_side2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f306b281707b44d5079d66e5b1a0168487e7fbc GIT binary patch literal 4518 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 Ef(t{3+W-In literal 0 HcmV?d00001 diff --git a/textures/pipeworks_dispenser_top.png b/textures/pipeworks_dispenser_top.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6f9d0e7bf56b7c262c0d383357967d9e87bbc7 GIT binary patch literal 4501 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 literal 0 HcmV?d00001