diff options
Diffstat (limited to 'bees')
31 files changed, 858 insertions, 0 deletions
| diff --git a/bees/depends.txt b/bees/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/bees/depends.txt @@ -0,0 +1 @@ +default diff --git a/bees/images/craft_bees_extractor.png b/bees/images/craft_bees_extractor.pngBinary files differ new file mode 100644 index 0000000..5f93f88 --- /dev/null +++ b/bees/images/craft_bees_extractor.png diff --git a/bees/images/craft_bees_frame.png b/bees/images/craft_bees_frame.pngBinary files differ new file mode 100644 index 0000000..0a955f6 --- /dev/null +++ b/bees/images/craft_bees_frame.png diff --git a/bees/images/craft_bees_grafting_tool.png b/bees/images/craft_bees_grafting_tool.pngBinary files differ new file mode 100644 index 0000000..98bbec0 --- /dev/null +++ b/bees/images/craft_bees_grafting_tool.png diff --git a/bees/images/craft_bees_hive.png b/bees/images/craft_bees_hive.pngBinary files differ new file mode 100644 index 0000000..782a0e8 --- /dev/null +++ b/bees/images/craft_bees_hive.png diff --git a/bees/images/craft_bees_smoker.png b/bees/images/craft_bees_smoker.pngBinary files differ new file mode 100644 index 0000000..70b1104 --- /dev/null +++ b/bees/images/craft_bees_smoker.png diff --git a/bees/images/screen_0.png b/bees/images/screen_0.pngBinary files differ new file mode 100644 index 0000000..b9c9373 --- /dev/null +++ b/bees/images/screen_0.png diff --git a/bees/init.lua b/bees/init.lua new file mode 100644 index 0000000..2c22f19 --- /dev/null +++ b/bees/init.lua @@ -0,0 +1,804 @@ +--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'}, +    } +  }) + +--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!') diff --git a/bees/readme.txt b/bees/readme.txt new file mode 100644 index 0000000..4d69d43 --- /dev/null +++ b/bees/readme.txt @@ -0,0 +1,53 @@ +BEES MOD V2.2 +------------- + +FEATURES +-------- +3.0 +- Pipeworks compatibility (Industrial beehive) +- Get honey comb from full frame + +2.2.1 +- removed steel dependency temporarily +- fixed the craft for the extractor (and added alias for) + +2.2 +- craft for extractor +- extractor texture update +- a craft for the smoker + +2.1 +- bees polinate flowers nearby, causing them to multiply +- add formspec to wild and artificial hive when using grafting tool +- smoke, flying wax and bee particles +- smokers to calm down the bees before opening the hive +- a centrifuge to extract the honey and from the filled frames +- grab eatable honeycomb from wild hives +- craft a grafting tool to extract queen bees from wild hives +- craft artificial hives and frames + +1.0 +- spawn wild bee hives on tree leaves +- use the queen bee to populate artificial hives +- plant flowers near hives to increase their productivity +- spawning bee colonies + +FUTURE +------ +- more realistic spawning of wild bee hives + +CONTRIBUTORS +------------ +- bas080 +- VanessaE (wild bee hive nodebox) +- Neuromancer (textures for wild bee hive and inspiration for other textures) +- Novatux (enabled pipeworks compatibility) + +FORUM +----- +https://forum.minetest.net/viewtopic.php?pid=102905 + +LICENSE +------- +- codes is WTFPL +- textures are CC BY-SA diff --git a/bees/sounds/bees.1.ogg b/bees/sounds/bees.1.oggBinary files differ new file mode 100644 index 0000000..62adbfe --- /dev/null +++ b/bees/sounds/bees.1.ogg diff --git a/bees/sounds/bees.2.ogg b/bees/sounds/bees.2.oggBinary files differ new file mode 100644 index 0000000..4bab2a9 --- /dev/null +++ b/bees/sounds/bees.2.ogg diff --git a/bees/sounds/bees.3.ogg b/bees/sounds/bees.3.oggBinary files differ new file mode 100644 index 0000000..f90d882 --- /dev/null +++ b/bees/sounds/bees.3.ogg diff --git a/bees/textures/bees_bottle_honey.png b/bees/textures/bees_bottle_honey.pngBinary files differ new file mode 100644 index 0000000..d2690b4 --- /dev/null +++ b/bees/textures/bees_bottle_honey.png diff --git a/bees/textures/bees_comb.png b/bees/textures/bees_comb.pngBinary files differ new file mode 100644 index 0000000..e11e5a6 --- /dev/null +++ b/bees/textures/bees_comb.png diff --git a/bees/textures/bees_extractor.png b/bees/textures/bees_extractor.pngBinary files differ new file mode 100644 index 0000000..00551aa --- /dev/null +++ b/bees/textures/bees_extractor.png diff --git a/bees/textures/bees_extractor_front.png b/bees/textures/bees_extractor_front.pngBinary files differ new file mode 100644 index 0000000..c2d2be9 --- /dev/null +++ b/bees/textures/bees_extractor_front.png diff --git a/bees/textures/bees_frame_empty.png b/bees/textures/bees_frame_empty.pngBinary files differ new file mode 100644 index 0000000..3ac446a --- /dev/null +++ b/bees/textures/bees_frame_empty.png diff --git a/bees/textures/bees_frame_full.png b/bees/textures/bees_frame_full.pngBinary files differ new file mode 100644 index 0000000..bb9fbe0 --- /dev/null +++ b/bees/textures/bees_frame_full.png diff --git a/bees/textures/bees_grafting_tool.png b/bees/textures/bees_grafting_tool.pngBinary files differ new file mode 100644 index 0000000..c0da709 --- /dev/null +++ b/bees/textures/bees_grafting_tool.png diff --git a/bees/textures/bees_hive_artificial.png b/bees/textures/bees_hive_artificial.pngBinary files differ new file mode 100644 index 0000000..782b7d8 --- /dev/null +++ b/bees/textures/bees_hive_artificial.png diff --git a/bees/textures/bees_hive_industrial.png b/bees/textures/bees_hive_industrial.pngBinary files differ new file mode 100644 index 0000000..de82d09 --- /dev/null +++ b/bees/textures/bees_hive_industrial.png diff --git a/bees/textures/bees_hive_wild.png b/bees/textures/bees_hive_wild.pngBinary files differ new file mode 100644 index 0000000..961a416 --- /dev/null +++ b/bees/textures/bees_hive_wild.png diff --git a/bees/textures/bees_hive_wild_bottom.png b/bees/textures/bees_hive_wild_bottom.pngBinary files differ new file mode 100644 index 0000000..08efeaa --- /dev/null +++ b/bees/textures/bees_hive_wild_bottom.png diff --git a/bees/textures/bees_hive_wild_s.png b/bees/textures/bees_hive_wild_s.pngBinary files differ new file mode 100644 index 0000000..cb062af --- /dev/null +++ b/bees/textures/bees_hive_wild_s.png diff --git a/bees/textures/bees_particle_bee.png b/bees/textures/bees_particle_bee.pngBinary files differ new file mode 100644 index 0000000..f58c4dc --- /dev/null +++ b/bees/textures/bees_particle_bee.png diff --git a/bees/textures/bees_particle_bee_r.png b/bees/textures/bees_particle_bee_r.pngBinary files differ new file mode 100644 index 0000000..42a36ff --- /dev/null +++ b/bees/textures/bees_particle_bee_r.png diff --git a/bees/textures/bees_smoke_particle.png b/bees/textures/bees_smoke_particle.pngBinary files differ new file mode 100644 index 0000000..59e77a0 --- /dev/null +++ b/bees/textures/bees_smoke_particle.png diff --git a/bees/textures/bees_smoker.png b/bees/textures/bees_smoker.pngBinary files differ new file mode 100644 index 0000000..b2886a3 --- /dev/null +++ b/bees/textures/bees_smoker.png diff --git a/bees/textures/bees_strip.png b/bees/textures/bees_strip.pngBinary files differ new file mode 100644 index 0000000..1afe28e --- /dev/null +++ b/bees/textures/bees_strip.png diff --git a/bees/textures/bees_wax.png b/bees/textures/bees_wax.pngBinary files differ new file mode 100644 index 0000000..4891e06 --- /dev/null +++ b/bees/textures/bees_wax.png diff --git a/bees/textures/bees_wax_particle.png b/bees/textures/bees_wax_particle.pngBinary files differ new file mode 100644 index 0000000..974fb09 --- /dev/null +++ b/bees/textures/bees_wax_particle.png | 
