--Bees
------
--Author	Bas080
--Version	2.2
--License	WTFPL

--VARIABLES
  local bees = {}
  local formspecs = {}

--FUNCTIONS
  function formspecs.hive_wild(pos, grafting)
    local spos = pos.x .. ',' .. pos.y .. ',' ..pos.z
    local formspec =
      'size[8,9]'..
      'list[nodemeta:'.. spos .. ';combs;1.5,3;5,1;]'..
      'list[current_player;main;0,5;8,4;]'
    if grafting then
      formspec = formspec..'list[nodemeta:'.. spos .. ';queen;3.5,1;1,1;]'
    end
    return formspec
  end

  function formspecs.hive_artificial(pos)
    local spos = pos.x..','..pos.y..','..pos.z
    local formspec =
      'size[8,9]'..
      'list[nodemeta:'..spos..';queen;3.5,1;1,1;]'..
      'list[nodemeta:'..spos..';frames;0,3;8,1;]'..
      'list[current_player;main;0,5;8,4;]'
    return formspec
  end

  function bees.polinate_flower(pos, flower)
    local spawn_pos = { x=pos.x+math.random(-3,3) , y=pos.y+math.random(-3,3) , z=pos.z+math.random(-3,3) }
    local floor_pos = { x=spawn_pos.x , y=spawn_pos.y-1 , z=spawn_pos.z }
    local spawn = minetest.get_node(spawn_pos).name
    local floor = minetest.get_node(floor_pos).name
    if floor == 'default:dirt_with_grass' and spawn == 'air' then
      minetest.set_node(spawn_pos, {name=flower})
    end
  end

--NODES
  minetest.register_node('bees:extractor', {
    description = 'honey extractor',
    tiles = {"bees_extractor.png", "bees_extractor.png", "bees_extractor.png", "bees_extractor.png", "bees_extractor.png", "bees_extractor_front.png"},
    paramtype2 = "facedir",
    groups = {choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1},
    on_construct = function(pos, node)
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      local pos = pos.x..','..pos.y..','..pos.z
      inv:set_size('frames_filled'  ,1)
      inv:set_size('frames_emptied' ,1)
      inv:set_size('bottles_empty'  ,1)
      inv:set_size('bottles_full' ,1)
      inv:set_size('wax',1)
      meta:set_string('formspec',
        'size[8,9]'..
        --input
        'list[nodemeta:'..pos..';frames_filled;2,1;1,1;]'..
        'list[nodemeta:'..pos..';bottles_empty;2,3;1,1;]'..
        --output
        'list[nodemeta:'..pos..';frames_emptied;5,0.5;1,1;]'..
        'list[nodemeta:'..pos..';wax;5,2;1,1;]'..
        'list[nodemeta:'..pos..';bottles_full;5,3.5;1,1;]'..
        --player inventory
        'list[current_player;main;0,5;8,4;]'
      )
    end,
    on_timer = function(pos, node)
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      if not inv:contains_item('frames_filled','bees:frame_full') or not inv:contains_item('bottles_empty','vessels:glass_bottle') then
        return
      end
      if inv:room_for_item('frames_emptied', 'bees:frame_empty') 
      and inv:room_for_item('wax','bees:wax') 
      and inv:room_for_item('bottles_full', 'bees:bottle_honey') then
        --add to output
        inv:add_item('frames_emptied', 'bees:frame_empty')
        inv:add_item('wax', 'bees:wax')
        inv:add_item('bottles_full', 'bees:bottle_honey')
        --remove from input
        inv:remove_item('bottles_empty','vessels:glass_bottle')
        inv:remove_item('frames_filled','bees:frame_full')
        local p = {x=pos.x+math.random()-0.5, y=pos.y+math.random()-0.5, z=pos.z+math.random()-0.5}
        --wax flying all over the place
        minetest.add_particle({
          pos = {x=pos.x, y=pos.y, z=pos.z},
          vel = {x=math.random(-4,4),y=math.random(8),z=math.random(-4,4)},
          acc = {x=0,y=-6,z=0},
          expirationtime = 2,
          size = math.random(1,3),
          collisiondetection = false,
          texture = 'bees_wax_particle.png',
        })
        local timer = minetest.get_node_timer(pos)
        timer:start(5)
      else
        local timer = minetest.get_node_timer(pos)
        timer:start(1) -- Try again in 1 second
      end
    end,
    tube = {
      insert_object = function(pos, node, stack, direction)
        local meta = minetest.get_meta(pos)
        local inv = meta:get_inventory()
        local timer = minetest.get_node_timer(pos)
        if stack:get_name() == "bees:frame_full" then
          if inv:is_empty("frames_filled") then
            timer:start(5)
          end
          return inv:add_item("frames_filled",stack)
        elseif stack:get_name() == "vessels:glass_bottle" then
          if inv:is_empty("bottles_empty") then
            timer:start(5)
          end
          return inv:add_item("bottles_empty",stack)
        end
        return stack
      end,
      can_insert = function(pos,node,stack,direction)
        local meta = minetest.get_meta(pos)
        local inv = meta:get_inventory()
        if stack:get_name() == "bees:frame_full" then
          return inv:room_for_item("frames_filled",stack)
        elseif stack:get_name() == "vessels:glass_bottle" then
          return inv:room_for_item("bottles_empty",stack)
        end
        return false
      end,
      input_inventory = {"frames_emptied", "bottles_full", "wax"},
      connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}
    },
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
      local timer = minetest.get_node_timer(pos)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      if inv:get_stack(listname, 1):get_count() == stack:get_count() then -- inv was empty -> start the timer
          timer:start(5) --create a honey bottle and empty frame and wax every 5 seconds
      end
    end,
    allow_metadata_inventory_put = function(pos, listname, index, stack, player)
      if (listname == 'bottles_empty' and stack:get_name() == 'vessels:glass_bottle') or (listname == 'frames_filled' and stack:get_name() == 'bees:frame_full') then
        return stack:get_count()
      else
        return 0
      end  
    end,
    allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
      return 0
    end,
  })

  minetest.register_node('bees:bees', {
    description = 'flying bees',
    drawtype = 'plantlike',
    paramtype = 'light',
    groups = { not_in_creative_inventory=1 },
    tiles = {
      {
        name='bees_strip.png', 
        animation={type='vertical_frames', aspect_w=16,aspect_h=16, length=2.0}
      }
    },
    damage_per_second = 1,
    walkable = false,
    buildable_to = true,
    pointable = false,
    on_punch = function(pos, node, puncher)
      local health = puncher:get_hp()
      puncher:set_hp(health-2)
    end,
  })

  minetest.register_node('bees:hive_wild', {
    description = 'wild bee hive',
    tiles = {'bees_hive_wild.png','bees_hive_wild.png','bees_hive_wild.png', 'bees_hive_wild.png', 'bees_hive_wild_bottom.png'}, --Neuromancer's base texture
    drawtype = 'nodebox',
    paramtype = 'light',
    paramtype2 = 'wallmounted',
    drop = {
      max_items = 6,
      items = {
        { items = {'bees:honey_comb'}, rarity = 5}
      }
    },
    groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,attached_node=1},
    node_box = { --VanessaE's wild hive nodebox contribution
      type = 'fixed',
      fixed = {
        {-0.250000,-0.500000,-0.250000,0.250000,0.375000,0.250000}, --NodeBox 2
        {-0.312500,-0.375000,-0.312500,0.312500,0.250000,0.312500}, --NodeBox 4
        {-0.375000,-0.250000,-0.375000,0.375000,0.125000,0.375000}, --NodeBox 5
        {-0.062500,-0.500000,-0.062500,0.062500,0.500000,0.062500}, --NodeBox 6
      }
    },
    on_timer = function(pos)
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      local timer= minetest.get_node_timer(pos)
      local rad  = 10
      local minp = {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}
      local maxp = {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}
      local flowers = minetest.find_nodes_in_area(minp, maxp, 'group:flower')
      if #flowers == 0 then 
        inv:set_stack('queen', 1, '')
        meta:set_string('infotext', 'this colony died, not enough flowers in area')
        return 
      end --not any flowers nearby The queen dies!
      if #flowers < 3 then return end --requires 2 or more flowers before can make honey
      local flower = flowers[math.random(#flowers)] 
      bees.polinate_flower(flower, minetest.get_node(flower).name)
      local stacks = inv:get_list('combs')
      for k, v in pairs(stacks) do
        if inv:get_stack('combs', k):is_empty() then --then replace that with a full one and reset pro..
          inv:set_stack('combs',k,'bees:honey_comb')
          timer:start(1000/#flowers)
          return
        end
      end
      --what to do if all combs are filled
    end,
    on_construct = function(pos)
      minetest.get_node(pos).param2 = 0
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      local timer = minetest.get_node_timer(pos)
      meta:set_int('agressive', 1)
      timer:start(100+math.random(100))
      inv:set_size('queen', 1)
      inv:set_size('combs', 5)
      inv:set_stack('queen', 1, 'bees:queen')
      for i=1,math.random(3) do
        inv:set_stack('combs', i, 'bees:honey_comb')
      end
    end,
    on_punch = function(pos, node, puncher)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      if inv:contains_item('queen','bees:queen') then
        local health = puncher:get_hp()
        puncher:set_hp(health-4)
      end
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, taker)
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      local timer= minetest.get_node_timer(pos)
      if listname == 'combs' and inv:contains_item('queen', 'bees:queen') then
        local health = taker:get_hp()
        timer:start(10)
        taker:set_hp(health-2)
      end
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, taker) --restart the colony by adding a queen
      local timer = minetest.get_node_timer(pos)
      if not timer:is_started() then
        timer:start(10)
      end
    end,
    allow_metadata_inventory_put = function(pos, listname, index, stack, player)
      if listname == 'queen' and stack:get_name() == 'bees:queen' then
        return 1
      else
        return 0
      end
    end,
    on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
      minetest.show_formspec(
        clicker:get_player_name(),
        'bees:hive_artificial',
        formspecs.hive_wild(pos, (itemstack:get_name() == 'bees:grafting_tool'))
      )
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      if meta:get_int('agressive') == 1 and inv:contains_item('queen', 'bees:queen') then
        local health = clicker:get_hp()
        clicker:set_hp(health-4)
      else
        meta:set_int('agressive', 1)
      end
    end,
    can_dig = function(pos,player)
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      if inv:is_empty('queen') and inv:is_empty('combs') then
        return true
      else
        return false
      end
    end,
    after_dig_node = function(pos, oldnode, oldmetadata, user)
      local wielded if user:get_wielded_item() ~= nil then wielded = user:get_wielded_item() else return end
      if 'bees:grafting_tool' == wielded:get_name() then 
        local inv = user:get_inventory()
        if inv then
          inv:add_item('main', ItemStack('bees:queen'))
        end
      end
    end
  })

  minetest.register_node('bees:hive_artificial', {
    description = 'bee hive',
    tiles = {'default_wood.png','default_wood.png','default_wood.png', 'default_wood.png','default_wood.png','bees_hive_artificial.png'},
    drawtype = 'nodebox',
    paramtype = 'light',
    paramtype2 = 'facedir',
    groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1},
    sounds = default.node_sound_wood_defaults(),
    node_box = {
      type = 'fixed',
      fixed = {
        {-4/8, 2/8, -4/8, 4/8, 3/8, 4/8},
        {-3/8, -4/8, -2/8, 3/8, 2/8, 3/8},
        {-3/8, 0/8, -3/8, 3/8, 2/8, -2/8},
        {-3/8, -4/8, -3/8, 3/8, -1/8, -2/8},
        {-3/8, -1/8, -3/8, -1/8, 0/8, -2/8},
        {1/8, -1/8, -3/8, 3/8, 0/8, -2/8},
      }
    },
    on_construct = function(pos)
      local timer = minetest.get_node_timer(pos)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      meta:set_int('agressive', 1)
      inv:set_size('queen', 1)
      inv:set_size('frames', 8)
      meta:set_string('infotext','requires queen bee to function')
    end,
    on_rightclick = function(pos, node, clicker, itemstack)
      minetest.show_formspec(
        clicker:get_player_name(),
        'bees:hive_artificial',
        formspecs.hive_artificial(pos)
      )
      local meta = minetest.get_meta(pos)
      local inv  = meta:get_inventory()
      if meta:get_int('agressive') == 1 and inv:contains_item('queen', 'bees:queen') then
        local health = clicker:get_hp()
        clicker:set_hp(health-4)
      else
        meta:set_int('agressive', 1)
      end
    end,
    on_timer = function(pos,elapsed)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      local timer = minetest.get_node_timer(pos)
      if inv:contains_item('queen', 'bees:queen') then
        if inv:contains_item('frames', 'bees:frame_empty') then
          timer:start(30)
          local rad  = 10
          local minp = {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}
          local maxp = {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}
          local flowers = minetest.find_nodes_in_area(minp, maxp, 'group:flower')
          local progress = meta:get_int('progress')
          progress = progress + #flowers
          meta:set_int('progress', progress)
          if progress > 1000 then
            local flower = flowers[math.random(#flowers)] 
            bees.polinate_flower(flower, minetest.get_node(flower).name)
            local stacks = inv:get_list('frames')
            for k, v in pairs(stacks) do
              if inv:get_stack('frames', k):get_name() == 'bees:frame_empty' then
                meta:set_int('progress', 0)
                inv:set_stack('frames',k,'bees:frame_full')
                return
              end
            end
          else
            meta:set_string('infotext', 'progress: '..progress..'+'..#flowers..'/1000')
          end
        else
          meta:set_string('infotext', 'does not have empty frame(s)')
          timer:stop()
        end
      end
    end,
    on_metadata_inventory_take = function(pos, listname, index, stack, player)
      if listname == 'queen' then
        local timer = minetest.get_node_timer(pos)
        local meta = minetest.get_meta(pos)
        meta:set_string('infotext','requires queen bee to function')
        timer:stop()
      end
    end,
    allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
      local inv = minetest.get_meta(pos):get_inventory()
      if from_list == to_list then 
        if inv:get_stack(to_list, to_index):is_empty() then
          return 1
        else
          return 0
        end
      else
        return 0
      end
    end,
    on_metadata_inventory_put = function(pos, listname, index, stack, player)
      local meta = minetest.get_meta(pos)
      local inv = meta:get_inventory()
      local timer = minetest.get_node_timer(pos)
      if listname == 'queen' or listname == 'frames' then
        meta:set_string('queen', stack:get_name())
        meta:set_string('infotext','queen is inserted, now for the empty frames');
        if inv:contains_item('frames', 'bees:frame_empty') then
          timer:start(30)
          meta:set_string('infotext','bees are aclimating');
        end
      end
    end,
    allow_metadata_inventory_put = function(pos, listname, index, stack, player)
      if not minetest.get_meta(pos):get_inventory():get_stack(listname, index):is_empty() then return 0 end
      if listname == 'queen' then
        if stack:get_name():match('bees:queen*') then
          return 1
        end
      elseif listname == 'frames' then
        if stack:get_name() == ('bees:frame_empty') then
          return 1
        end
      end
      return 0
    end,
  })

--ABMS
  minetest.register_abm({ --particles
    nodenames = {'bees:hive_artificial', 'bees:hive_wild', 'bees:hive_industrial'},
    interval  = 10,
    chance    = 4,
    action = function(pos)
      minetest.add_particle({
        pos = {x=pos.x, y=pos.y, z=pos.z},
        vel = {x=(math.random()-0.5)*5,y=(math.random()-0.5)*5,z=(math.random()-0.5)*5},
        acc = {x=math.random()-0.5,y=math.random()-0.5,z=math.random()-0.5},
        expirationtime = math.random(2.5),
        size = math.random(3),
        collisiondetection = true,
        texture = 'bees_particle_bee.png',
      })
    end,
  })

  minetest.register_abm({ --spawn abm. This should be changed to a more realistic type of spawning
    nodenames = {'group:leaves'},
    neighbors = {''},
    interval = 1600,
    chance = 20,
    action = function(pos, node, _, _)
      local p = {x=pos.x, y=pos.y-1, z=pos.z}
      if minetest.get_node(p).walkable == false then return end
      if (minetest.find_node_near(p, 5, 'group:flora') ~= nil and minetest.find_node_near(p, 40, 'bees:hive_wild') == nil) then
        minetest.add_node(p, {name='bees:hive_wild'})
      end
    end,
  })

  minetest.register_abm({ --spawning bees around bee hive
    nodenames = {'bees:hive_wild', 'bees:hive_artificial', 'bees:hive_industrial'},
    neighbors = {'group:flowers', 'group:leaves'},
    interval = 30,
    chance = 4,
    action = function(pos, node, _, _)
      local p = {x=pos.x+math.random(-5,5), y=pos.y-math.random(0,3), z=pos.z+math.random(-5,5)}
      if minetest.get_node(p).name == 'air' then
        minetest.add_node(p, {name='bees:bees'})
      end
    end,
  })

  minetest.register_abm({ --remove bees
    nodenames = {'bees:bees'},
    interval = 30,
    chance = 5,
    action = function(pos, node, _, _)
      minetest.remove_node(pos)
    end,
  })

--ITEMS
  minetest.register_craftitem('bees:frame_empty', {
    description = 'empty hive frame',
    inventory_image = 'bees_frame_empty.png',
    stack_max = 24,
  })

  minetest.register_craftitem('bees:frame_full', {
    description = 'filled hive frame',
    inventory_image = 'bees_frame_full.png',
    stack_max = 12,
  })

  minetest.register_craftitem('bees:bottle_honey', {
    description = 'honey bottle',
    inventory_image = 'bees_bottle_honey.png',
    stack_max = 12,
    on_use = minetest.item_eat(3, "vessels:glass_bottle"),
  })
  
  minetest.register_craftitem('bees:wax', {
    description = 'bees wax',
    inventory_image = 'bees_wax.png',
    stack_max = 48,
  })

  minetest.register_craftitem('bees:honey_comb', {
    description = 'honey comb',
    inventory_image = 'bees_comb.png',
    on_use = minetest.item_eat(2),
    stack_max = 8,
  })

  minetest.register_craftitem('bees:queen', {
    description = 'Queen Bee',
    inventory_image = 'bees_particle_bee.png',
    stack_max = 1,
  })

--CRAFTS
  minetest.register_craft({
    output = 'bees:extractor',
    recipe = {
      {'','default:steel_ingot',''},
      {'default:steel_ingot','default:stick','default:steel_ingot'},
      {'default:mese_crystal','default:steel_ingot','default:mese_crystal'},
    }
  })

  minetest.register_craft({
    output = 'bees:smoker',
    recipe = {
      {'default:steel_ingot', 'wool:red', ''},
      {'', 'default:torch', ''},
      {'', 'default:steel_ingot',''},
    }
  })

  minetest.register_craft({
    output = 'bees:hive_artificial',
    recipe = {
      {'group:wood','group:wood','group:wood'},
      {'group:wood','default:stick','group:wood'},
      {'group:wood','default:stick','group:wood'},
    }
  })

  minetest.register_craft({
    output = 'bees:grafting_tool',
    recipe = {
      {'', '', 'default:steel_ingot'},
      {'', 'default:stick', ''},
      {'', '', ''},
    }
  })
  
  minetest.register_craft({
    output = 'bees:frame_empty',
    recipe = {
      {'group:wood',  'group:wood',  'group:wood'},
      {'default:stick', 'default:stick', 'default:stick'},
      {'default:stick', 'default:stick', 'default:stick'},
    }
  })

  if minetest.get_modpath('bushes_classic') then
    minetest.register_craft({
      type = 'cooking',
      cooktime = 5,
      recipe = 'bees:bottle_honey',
      output = 'bushes:sugar',
    })
  end

--TOOLS
  minetest.register_tool('bees:smoker', {
    description = 'smoker',
    inventory_image = 'bees_smoker.png',
    tool_capabilities = {
      full_punch_interval = 3.0,
      max_drop_level=0,
      damage_groups = {fleshy=2},
    },
    on_use = function(tool, user, node)
      if node then
        local pos = node.under
        if pos then
          for i=1,6 do
            minetest.add_particle({
              pos = {x=pos.x+math.random()-0.5, y=pos.y, z=pos.z+math.random()-0.5},
              vel = {x=0,y=0.5+math.random(),z=0},
              acc = {x=0,y=0,z=0},
              expirationtime = 2+math.random(2.5),
              size = math.random(3),
              collisiondetection = false,
              texture = 'bees_smoke_particle.png',
            })
          end
          --tool:add_wear(2)
          local meta = minetest.get_meta(pos)
          meta:set_int('agressive', 0)
          return nil
        end
      end
    end,
  })

  minetest.register_tool('bees:grafting_tool', {
    description = 'grafting tool',
    inventory_image = 'bees_grafting_tool.png',
    tool_capabilities = {
      full_punch_interval = 3.0,
      max_drop_level=0,
      damage_groups = {fleshy=2},
    },
  })

--COMPATIBILTY --remove after all has been updated
  --ALIASES
    minetest.register_alias('bees:honey_extractor', 'bees:extractor')
  --BACKWARDS COMPATIBILITY WITH OLDER VERSION  
    minetest.register_alias('bees:honey_bottle', 'bees:bottle_honey')
    minetest.register_abm({
      nodenames = {'bees:hive', 'bees:hive_artificial_inhabited'},
      interval = 0,
      chance = 1,
      action = function(pos, node)
        if node.name == 'bees:hive' then
          minetest.set_node(pos, { name = 'bees:hive_wild' })
          local meta = minetest.get_meta(pos)
          local inv  = meta:get_inventory()
          inv:set_stack('queen', 1, 'bees:queen')
        end
        if node.name == 'bees:hive_artificial_inhabited' then
          minetest.set_node(pos, { name = 'bees:hive_artificial' })
          local meta = minetest.get_meta(pos)
          local inv  = meta:get_inventory()
          inv:set_stack('queen', 1, 'bees:queen')
          local timer = minetest.get_node_timer(pos)
          timer:start(60)
        end
      end,
    })

  --PIPEWORKS
    if minetest.get_modpath("pipeworks") then
      minetest.register_node('bees:hive_industrial', {
        description = 'industrial bee hive',
        tiles = { 'bees_hive_industrial.png'},
        paramtype2 = 'facedir',
        groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1},
        sounds = default.node_sound_wood_defaults(),
        tube = {
          insert_object = function(pos, node, stack, direction)
            local meta = minetest.get_meta(pos)
            local inv = meta:get_inventory()
            if stack:get_name() ~= "bees:frame_empty" or stack:get_count() > 1 then
              return stack
            end
            for i = 1, 8 do
              if inv:get_stack("frames", i):is_empty() then
                inv:set_stack("frames", i, stack)
                local timer = minetest.get_node_timer(pos)
                timer:start(30)
                meta:set_string('infotext','bees are aclimating')
                return ItemStack("")
              end
            end
            return stack
          end,
          can_insert = function(pos,node,stack,direction)
            local meta = minetest.get_meta(pos)
            local inv = meta:get_inventory()
            if stack:get_name() ~= "bees:frame_empty" or stack:get_count() > 1 then
              return false
            end
            for i = 1, 8 do
              if inv:get_stack("frames", i):is_empty() then
                return true
              end
            end
            return false
          end,
          can_remove = function(pos,node,stack,direction)
            if stack:get_name() == "bees:frame_full" then
              return 1
            else
              return 0
            end
          end,
          input_inventory = "frames",
          connect_sides = {left=1, right=1, back=1, front=1, bottom=1, top=1}
        },
        on_construct = function(pos)
          local timer = minetest.get_node_timer(pos)
          local meta = minetest.get_meta(pos)
          local inv = meta:get_inventory()
          meta:set_int('agressive', 1)
          inv:set_size('queen', 1)
          inv:set_size('frames', 8)
          meta:set_string('infotext','requires queen bee to function')
        end,
        on_rightclick = function(pos, node, clicker, itemstack)
          minetest.show_formspec(
            clicker:get_player_name(),
            'bees:hive_artificial',
            formspecs.hive_artificial(pos)
          )
          local meta = minetest.get_meta(pos)
          local inv  = meta:get_inventory()
          if meta:get_int('agressive') == 1 and inv:contains_item('queen', 'bees:queen') then
            local health = clicker:get_hp()
            clicker:set_hp(health-4)
          else
            meta:set_int('agressive', 1)
          end
        end,
        on_timer = function(pos,elapsed)
          local meta = minetest.get_meta(pos)
          local inv = meta:get_inventory()
          local timer = minetest.get_node_timer(pos)
          if inv:contains_item('queen', 'bees:queen') then
            if inv:contains_item('frames', 'bees:frame_empty') then
              timer:start(30)
              local rad  = 10
              local minp = {x=pos.x-rad, y=pos.y-rad, z=pos.z-rad}
              local maxp = {x=pos.x+rad, y=pos.y+rad, z=pos.z+rad}
              local flowers = minetest.find_nodes_in_area(minp, maxp, 'group:flower')
              local progress = meta:get_int('progress')
              progress = progress + #flowers
              meta:set_int('progress', progress)
              if progress > 1000 then
                local flower = flowers[math.random(#flowers)] 
                bees.polinate_flower(flower, minetest.get_node(flower).name)
                local stacks = inv:get_list('frames')
                for k, v in pairs(stacks) do
                  if inv:get_stack('frames', k):get_name() == 'bees:frame_empty' then
                    meta:set_int('progress', 0)
                    inv:set_stack('frames',k,'bees:frame_full')
                    return
                  end
                end
              else
                meta:set_string('infotext', 'progress: '..progress..'+'..#flowers..'/1000')
              end
            else
              meta:set_string('infotext', 'does not have empty frame(s)')
              timer:stop()
            end
          end
        end,
        on_metadata_inventory_take = function(pos, listname, index, stack, player)
          if listname == 'queen' then
            local timer = minetest.get_node_timer(pos)
            local meta = minetest.get_meta(pos)
            meta:set_string('infotext','requires queen bee to function')
            timer:stop()
          end
        end,
        allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
          local inv = minetest.get_meta(pos):get_inventory()
          if from_list == to_list then 
            if inv:get_stack(to_list, to_index):is_empty() then
              return 1
            else
              return 0
            end
          else
            return 0
          end
        end,
        on_metadata_inventory_put = function(pos, listname, index, stack, player)
          local meta = minetest.get_meta(pos)
          local inv = meta:get_inventory()
          local timer = minetest.get_node_timer(pos)
          if listname == 'queen' or listname == 'frames' then
            meta:set_string('queen', stack:get_name())
            meta:set_string('infotext','queen is inserted, now for the empty frames');
            if inv:contains_item('frames', 'bees:frame_empty') then
              timer:start(30)
              meta:set_string('infotext','bees are aclimating');
            end
          end
        end,
        allow_metadata_inventory_put = function(pos, listname, index, stack, player)
          if not minetest.get_meta(pos):get_inventory():get_stack(listname, index):is_empty() then return 0 end
          if listname == 'queen' then
            if stack:get_name():match('bees:queen*') then
              return 1
            end
          elseif listname == 'frames' then
            if stack:get_name() == ('bees:frame_empty') then
              return 1
            end
          end
          return 0
        end,
      })
      minetest.register_craft({
        output = 'bees:hive_industrial',
        recipe = {
          {'default:steel_ingot','homedecor:plastic_sheeting','default:steel_ingot'},
          {'pipeworks:tube_1','bees:hive_artificial','pipeworks:tube_1'},
          {'default:steel_ingot','homedecor:plastic_sheeting','default:steel_ingot'},
        }
      })
    end

print('[Mod]Bees Loaded!')
