Tube capability for tool workshop
authorZefram <zefram@fysh.org>
Mon, 18 Aug 2014 16:09:37 +0000 (17:09 +0100)
committerZefram <zefram@fysh.org>
Mon, 18 Aug 2014 16:09:37 +0000 (17:09 +0100)
Tool workshop can now accept tools to repair via tube.  It has upgrade
slots.  Battery upgrade reduces its power consumption.  Tube upgrade
makes it eject fully-repaired (or unrepairable) items via tube.

technic/machines/MV/tool_workshop.lua

index 10267180ad85b8446666da70cfd0052f8a8e87a0..a1f9a2119edf2cf1bb3addd640a2dd1fdb2a7af2 100644 (file)
@@ -14,10 +14,15 @@ minetest.register_craft({
        }
 })
 
+local workshop_demand = {5000, 3500, 2000}
+
 local workshop_formspec =
        "invsize[8,9;]"..
        "list[current_name;src;3,1;1,1;]"..
        "label[0,0;"..S("%s Tool Workshop"):format("MV").."]"..
+       "list[current_name;upgrade1;1,3;1,1;]"..
+       "list[current_name;upgrade2;2,3;1,1;]"..
+       "label[1,4;"..S("Upgrade Slots").."]"..
        "list[current_player;main;0,5;8,4;]"
 
 local run = function(pos, node)
@@ -26,15 +31,16 @@ local run = function(pos, node)
        local eu_input     = meta:get_int("MV_EU_input")
        local machine_name = S("%s Tool Workshop"):format("MV")
        local machine_node = "technic:tool_workshop"
-       local demand       = 5000
 
        -- Setup meta data if it does not exist.
        if not eu_input then
-               meta:set_int("MV_EU_demand", demand)
+               meta:set_int("MV_EU_demand", workshop_demand[1])
                meta:set_int("MV_EU_input", 0)
                return
        end
 
+       local EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+
        local repairable = false
        local srcstack = inv:get_stack("src", 1)
        if not srcstack:is_empty() then
@@ -46,27 +52,32 @@ local run = function(pos, node)
                        repairable = true
                end
        end
+       technic.handle_machine_pipeworks(pos, tube_upgrade, function (pos, x_velocity, z_velocity)
+               if not repairable then
+                       technic.send_items(pos, x_velocity, z_velocity, "src")
+               end
+       end)
        if not repairable then
                meta:set_string("infotext", S("%s Idle"):format(machine_name))
                meta:set_int("MV_EU_demand", 0)
                return
        end
        
-       if eu_input < demand then
+       if eu_input < workshop_demand[EU_upgrade+1] then
                meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
-       elseif eu_input >= demand then
+       elseif eu_input >= workshop_demand[EU_upgrade+1] then
                meta:set_string("infotext", S("%s Active"):format(machine_name))
                srcstack:add_wear(-1000)
                inv:set_stack("src", 1, srcstack)
        end
-       meta:set_int("MV_EU_demand", demand)
+       meta:set_int("MV_EU_demand", workshop_demand[EU_upgrade+1])
 end
 
 minetest.register_node("technic:tool_workshop", {
        description = S("%s Tool Workshop"):format("MV"),
        tiles = {"technic_workshop_top.png", "technic_machine_bottom.png", "technic_workshop_side.png",
                 "technic_workshop_side.png", "technic_workshop_side.png", "technic_workshop_side.png"},
-       groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1},
+       groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, tubedevice=1, tubedevice_receiver=1},
        sounds = default.node_sound_wood_defaults(),
        on_construct = function(pos)
                local meta = minetest.get_meta(pos)
@@ -74,10 +85,21 @@ minetest.register_node("technic:tool_workshop", {
                meta:set_string("formspec", workshop_formspec)
                local inv = meta:get_inventory()
                inv:set_size("src", 1)
+               inv:set_size("upgrade1", 1)
+               inv:set_size("upgrade2", 1)
        end,    
        can_dig = technic.machine_can_dig,
        allow_metadata_inventory_put = technic.machine_inventory_put,
        allow_metadata_inventory_take = technic.machine_inventory_take,
+       tube = {
+               can_insert = function (pos, node, stack, direction)
+                       return minetest.get_meta(pos):get_inventory():room_for_item("src", stack)
+               end,
+               insert_object = function (pos, node, stack, direction)
+                       return minetest.get_meta(pos):get_inventory():add_item("src", stack)
+               end,
+               connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
+       },
        technic_run = run,
 })