--Bees mod by bas080 --[[TODO Smoker Grafting Tool Spreading bee colonies Make flowers reproduce when near a hive Add formspec to twild hive when using grafting tool Make hive drop to ground ]] local sound = {} local particles = {} local bees = {} local formspecs = {} --FUNCTIONS function formspecs.hive_wild(pos) local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]".. "list[nodemeta:".. spos .. ";main;0,0;8,4;]".. "list[current_player;main;0,5;8,4;]" 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;0,0;1,1;]".. "list[nodemeta:"..spos..";frame;0,1;1,8;]".. "list[current_player;main;0,5;8,4;]" print(formspec) return formspec end --NODES minetest.register_node("bees:bees", { description = "Flying Bees", drawtype = "plantlike", paramtype = "light", 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, on_construct = function(pos) spawn_bees(pos) end, on_destruct = function(pos) remove_bees(pos) end, }) minetest.register_node("bees:hive_wild", { description = "Wild Bee Hive", tile_images = {"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'} }, { items = {'bees:honey_comb'}, rarity = 2}, { items = {'bees:honey_comb'}, rarity = 5}, { items = {'bees:queen'}, rarity = 10 } } }, 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_construct = function(pos) spawn_bees(pos) minetest.get_node(pos).param2 = 0 end, on_punch = function(pos, node, puncher) local health = puncher:get_hp() puncher:set_hp(health-2) end, on_rightclick = function(pos, node, clicker, itemstack) minetest.show_formspec( clicker:get_player_name(), "bees:hive_artificial", formspecs.hive_artificial(pos) ) 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) meta:set_string('infotext','Requires the Queen bee') meta:set_string('queen', 'love it!') end, on_rightclick = function(pos, node, clicker, itemstack) minetest.show_formspec( clicker:get_player_name(), "bees:hive_artificial", formspecs.hive_artificial(pos) ) end, on_timer = function(pos,elapsed) local meta = minetest.get_meta(pos) local queen = meta:get_meta('queen') if queen == 'none' then return else --if has queen end 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 flower_in_area = minetest.find_nodes_in_area(minp, maxp, "group:flower") local flower_number = 0 for i in ipairs(flower_in_area) do flower_number = flower_number + 1 end local honey = meta:get_int("honey") honey = honey + flower_number/10 if honey < 100 then meta:set_string('infotext',honey.."%"); meta:set_int("honey", honey) local tmr = minetest.get_node_timer(pos) tmr:start(60) else meta:set_string('infotext',"100% - Time to harvest"); meta:set_int("honey", 100) end end, on_metadata_inventory_put = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local queen = meta:get_string('queen') meta:set_string(stack:get_name()) if listname == "queen" then meta:set_string('queen', stack) inv:remove_item("drop", stack) inv:add_item("main", stack) end end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) return true end, }) --abms minetest.register_abm({ nodenames = {'bees:hive_wild'}, interval = 200, chance = 10, action = function(pos, node) print(pos) local leaves = minetest.find_node_near(p, 5, "group:leaves") --itterate over leaves --check if bottom node is air and check if not to near other bee hives/ end }) --[[ minetest.register_abm({ --for particles and sounds nodenames = {"bees:hive", "bees:bees", "bees:hive_artificial_inhabited"}, interval = 1, chance = 6, action = function(pos, node, _, _) if math.random()<0.5 then local img = "bees_particle_bee.png" else local img = "bees_particle_bee_r.png" end sound["x"..pos.x.."y"..pos.y.."z"..pos.z] = minetest.sound_play({name="bees"},{pos=pos, max_hear_distance=8, gain=0.6}) local p = {x=pos.x, y=pos.y+math.random()-0.5, z=pos.z} end, }) minetest.add_particle( p, {x=(math.random()-0.5)*5,y=(math.random()-0.5)*5,z=(math.random()-0.5)*5}, {x=math.random()-0.5,y=math.random()-0.5,z=math.random()-0.5}, math.random(2,5), math.random(3), true, "bees_particle_bee.png" ) minetest.add_particle( pos, velocity, acceleration, expirationtime, size, collisiondetection, texture, playername ) ]] function spawn_bees(pos) --[[local id = minetest.pos_to_string(pos) if particles[id] ~= nil then return end particles[id] = minetest.add_particlespawner( 2, 0, {x=pos.x-0.5,y=pos.y-0.5,z=pos.z-0.5}, {x=pos.x+0.5,y=pos.y+0.5,z=pos.z+0.5}, {x=-2.5,y=-2.5,z=-2.5}, {x=2.5,y=2.5,z=2.5}, {x=-0.5,y=-0.5,z=-0.5}, {x=0.5,y=0.5,z=0.5}, 2, 5, 1, 3, true, "bees_particle_bee.png" ) ]] end function remove_bees(pos) --[[local id = particles[minetest.pos_to_string(pos)] if id == nil then return end minetest.delete_particlespawner(id) ]] end minetest.register_abm({ --spawn abm nodenames = {"bees:hive_wild"}, neighbors = {""}, interval = 1800, chance = 500, 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, 20, "bees:hive") == nil) then minetest.add_node(p, {name="bees:hive"}) end end, }) minetest.register_abm({ --spawning bees around bee hive nodenames = {"bees:hive"}, interval = 10, chance = 2, 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 = 60, chance = 4, action = function(pos, node, _, _) minetest.remove_node(pos) end, }) --items minetest.register_craftitem("bees:honey_comb", { description = "Honey Comb", inventory_image = "bees_comb.png", on_use = minetest.item_eat(3), }) minetest.register_craftitem("bees:honey_bottle", { description = "Honey Bottle", inventory_image = "bees_honey_bottle.png", on_use = minetest.item_eat(6), }) minetest.register_craftitem("bees:queen", { description = "Queen Bee", inventory_image = "bees_particle_bee.png", on_use = function(itemstack, user, pointed_thing) if pointed_thing.under == nil then return end local node = minetest.get_node(pointed_thing.under) local name = minetest.get_node(pointed_thing.under).name if name == "bees:hive_artificial" then local facing = node.param2 minetest.set_node(pointed_thing.under, {name = "bees:hive_artificial_inhabited", param2=facing}) itemstack:take_item() return itemstack end end, }) --crafts minetest.register_craft({ output = 'bees:honey_bottle', recipe = { {'bees:honey_comb'}, {'vessels:glass_bottle'}, } }) 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_tool("bees:grafting_tool", { description = "Grafting Tool", inventory_image = "bees_grafting_tool.png", tool_capabilities = { full_punch_interval = 3.0, max_drop_level=0, groupcaps={ choppy = {times={[2]=3.00, [3]=2.00}, uses=10, maxlevel=1}, }, damage_groups = {fleshy=2}, }, }) minetest.register_craft({ output = 'bees:grafting_tool', recipe = { {'', '', 'default:steel_ingot'}, {'', 'default:stick', ''}, {'', '', ''}, } }) print("[Mod]Bees Loaded!")