From 8220389462e96e1ee155435c611d96611d132939 Mon Sep 17 00:00:00 2001 From: StochasticMouse Date: Sat, 5 Oct 2024 21:22:58 +0200 Subject: [PATCH] initial version, apiary is wip and most probably broken at the moment --- forestry_bees/apiary.lua | 437 ++++++++++++++++++ forestry_bees/init.lua | 118 +++++ forestry_bees/mod.conf | 3 + .../forestry_bees_forest_beehive_side.png | Bin 0 -> 369 bytes .../forestry_bees_forest_beehive_top.png | Bin 0 -> 191 bytes .../forestry_bees_meadow_beehive_side.png | Bin 0 -> 149 bytes .../forestry_bees_meadow_beehive_top.png | Bin 0 -> 417 bytes forestry_bees/textures/bees/body1.png | Bin 0 -> 137 bytes forestry_bees/textures/bees/drone.body2.png | Bin 0 -> 170 bytes forestry_bees/textures/bees/drone.outline.png | Bin 0 -> 138 bytes .../textures/bees/princess.body2.png | Bin 0 -> 195 bytes .../textures/bees/princess.outline.png | Bin 0 -> 138 bytes forestry_bees/textures/bees/queen.body2.png | Bin 0 -> 206 bytes forestry_bees/textures/bees/queen.outline.png | Bin 0 -> 138 bytes forestry_bees/textures/items/bee_combs.0.png | Bin 0 -> 192 bytes forestry_bees/textures/items/bee_combs.1.png | Bin 0 -> 200 bytes .../textures/tools/forestry_bees_scoop.png | Bin 0 -> 211 bytes modpack.conf | 3 + 18 files changed, 561 insertions(+) create mode 100644 forestry_bees/apiary.lua create mode 100644 forestry_bees/init.lua create mode 100644 forestry_bees/mod.conf create mode 100644 forestry_bees/textures/beehives/forestry_bees_forest_beehive_side.png create mode 100644 forestry_bees/textures/beehives/forestry_bees_forest_beehive_top.png create mode 100644 forestry_bees/textures/beehives/forestry_bees_meadow_beehive_side.png create mode 100644 forestry_bees/textures/beehives/forestry_bees_meadow_beehive_top.png create mode 100644 forestry_bees/textures/bees/body1.png create mode 100644 forestry_bees/textures/bees/drone.body2.png create mode 100644 forestry_bees/textures/bees/drone.outline.png create mode 100644 forestry_bees/textures/bees/princess.body2.png create mode 100644 forestry_bees/textures/bees/princess.outline.png create mode 100644 forestry_bees/textures/bees/queen.body2.png create mode 100644 forestry_bees/textures/bees/queen.outline.png create mode 100644 forestry_bees/textures/items/bee_combs.0.png create mode 100644 forestry_bees/textures/items/bee_combs.1.png create mode 100644 forestry_bees/textures/tools/forestry_bees_scoop.png create mode 100644 modpack.conf diff --git a/forestry_bees/apiary.lua b/forestry_bees/apiary.lua new file mode 100644 index 0000000..dcba3b6 --- /dev/null +++ b/forestry_bees/apiary.lua @@ -0,0 +1,437 @@ +-- support for MT game translation. +local S = default.get_translator + +-- +-- Formspecs +-- + +function forestry_bees.get_apiary_active_formspec(queen_percent) + return "size[8,8.5]".. + "list[context;monarch;2.75,0.5;1,1;]".. + "list[context;drone;2.75,2.5;1,1;]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (queen_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[context;dst;4.75,0.96;3,3;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +function forestry_bees.get_apiary_inactive_formspec() + return "size[8,8.5]".. + "list[context;monarch;2.75,0.5;1,1;]".. + "list[context;drone;2.75,2.5;1,1;]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4.75,0.96;3,3;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("monarch") and inv:is_empty("drone") and inv:is_empty("dst") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "drone" then + if minetest.get_item_group(stack:get_name(),"bee_drone") == 1 then + return stack:get_count() + else + return 0 + end + elseif listname == "monarch" then + if minetest.get_item_group(stack:get_name(),"bee_monarch") == 1 then + return stack:get_count() + else + return 0 + end + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +local function apiary_node_timer(pos,elapsed) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local monarchlist, dronelist + local timer_elapsed = meta:get_int("timer_elapsed") or 0 + meta:set_int("timer_elapsed", timer_elapsed + 1) + local update = true + local is_queen, is_princess, is_drone + while elapsed > 0 and update do + update = false + monarchlist = inv:get_list("monarch") + dronelist = inv:get_list("drone") + is_queen = minetest.get_item_group(monarchlist[1]:get_name(),"bee_queen") == 1 + is_princess = minetest.get_item_group(monarchlist[1]:get_name(),"bee_queen") == 1 + is_drone = minetest.get_item_group(dronelist[1]:get_name(),"bee_queen") == 1 + end +end + +local function furnace_node_timer(pos, elapsed) + -- + -- Initialize metadata + -- + local meta = minetest.get_meta(pos) + --local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + --local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + local inv = meta:get_inventory() + local monarchlist, dronelist + local dst_full = false + + local timer_elapsed = meta:get_int("timer_elapsed") or 0 + meta:set_int("timer_elapsed", timer_elapsed + 1) + + --local cookable, cooked + local breedable + --local fuel + + local update = true + --local items_smelt = 0 + while elapsed > 0 and update do + update = false + + monarchlist = inv:get_list("monarch") + dronelist = inv:get_list("drone") + + -- + -- Cooking + -- + + -- Check if we have breedable content + --local aftercooked + --cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + breedable = (minetest.get_item_group(monarchlist[1]:get_name(),"bee_monarch") == 1) and (minetest.get_item_group(dronelist[1]:get_name(),"bee_drone") == 1) + + local el = math.min(elapsed, fuel_totaltime - fuel_time) + if cookable then -- fuel lasts long enough, adjust el to cooking duration + el = math.min(el, cooked.time - src_time) + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + el + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + el + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = src_time - cooked.time + update = true + else + dst_full = true + end + items_smelt = items_smelt + 1 + else + -- Item could not be cooked: probably missing fuel + update = true + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local afterfuel + fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + src_time = 0 + else + -- prevent blocking of fuel inventory (for automatization mods) + local is_fuel = minetest.get_craft_result({method = "fuel", width = 1, items = {afterfuel.items[1]:to_string()}}) + if is_fuel.time == 0 then + table.insert(fuel.replacements, afterfuel.items[1]) + inv:set_stack("fuel", 1, "") + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + end + -- Put replacements in dst list or drop them on the furnace. + local replacements = fuel.replacements + if replacements[1] then + local leftover = inv:add_item("dst", replacements[1]) + if not leftover:is_empty() then + local above = vector.new(pos.x, pos.y + 1, pos.z) + local drop_pos = minetest.find_node_near(above, 1, {"air"}) or above + minetest.item_drop(replacements[1], nil, drop_pos) + end + end + update = true + fuel_totaltime = fuel.time + (fuel_totaltime - fuel_time) + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + src_time = 0 + end + fuel_time = 0 + end + + elapsed = elapsed - el + end + + if items_smelt > 0 then + -- Play cooling sound + minetest.sound_play("default_cool_lava", + { pos = pos, max_hear_distance = 16, gain = 0.07 * math.min(items_smelt, 7) }, true) + end + if fuel and fuel_totaltime > fuel.time then + fuel_totaltime = fuel.time + end + if srclist and srclist[1]:is_empty() then + src_time = 0 + end + + -- + -- Update formspec, infotext and node + -- + local formspec + local item_state + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + if dst_full then + item_state = S("100% (output full)") + else + item_state = S("@1%", item_percent) + end + else + if srclist and not srclist[1]:is_empty() then + item_state = S("Not cookable") + else + item_state = S("Empty") + end + end + + local fuel_state = S("Empty") + local active = false + local result = false + + if fuel_totaltime ~= 0 then + active = true + local fuel_percent = 100 - math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = S("@1%", fuel_percent) + formspec = default.get_furnace_active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + -- make sure timer restarts automatically + result = true + + -- Play sound every 5 seconds while the furnace is active + if timer_elapsed == 0 or (timer_elapsed + 1) % 5 == 0 then + local sound_id = minetest.sound_play("default_furnace_active", + {pos = pos, max_hear_distance = 16, gain = 0.25}) + local hash = minetest.hash_node_position(pos) + furnace_fire_sounds[hash] = furnace_fire_sounds[hash] or {} + table.insert(furnace_fire_sounds[hash], sound_id) + -- Only remember the 3 last sound handles + if #furnace_fire_sounds[hash] > 3 then + table.remove(furnace_fire_sounds[hash], 1) + end + -- Remove the sound ID automatically from table after 11 seconds + minetest.after(11, function() + if not furnace_fire_sounds[hash] then + return + end + for f=#furnace_fire_sounds[hash], 1, -1 do + if furnace_fire_sounds[hash][f] == sound_id then + table.remove(furnace_fire_sounds[hash], f) + end + end + if #furnace_fire_sounds[hash] == 0 then + furnace_fire_sounds[hash] = nil + end + end) + end + else + if fuellist and not fuellist[1]:is_empty() then + fuel_state = S("@1%", 0) + end + formspec = default.get_furnace_inactive_formspec() + swap_node(pos, "default:furnace") + -- stop timer on the inactive furnace + minetest.get_node_timer(pos):stop() + meta:set_int("timer_elapsed", 0) + + stop_furnace_sound(pos) + end + + + local infotext + if active then + infotext = S("Furnace active") + else + infotext = S("Furnace inactive") + end + infotext = infotext .. "\n" .. S("(Item: @1; Fuel: @2)", item_state, fuel_state) + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + + return result +end + +-- +-- Node definitions +-- + +local function apply_logger(def) + default.set_inventory_action_loggers(def, "apiary") + return def +end + +minetest.register_node("forestry_bees:apiary", apply_logger({ + description = S("Apiary"), + tiles = { + "forestry_bees_apiary_top.png", "forestry_bees_apiary_bottom.png", + "forestry_bees_apiary_side.png", "forestry_bees_apiary_side.png", + "forestry_bees_apiary_side.png", "forestry_bees_apiary_side.png" + }, + paramtype2 = "facedir", + groups = {choppy=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + can_dig = can_dig, + + on_timer = apiary_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('monarch', 1) + inv:set_size('drone', 1) + inv:set_size('dst', 9) + apiary_node_timer(pos, 0) + end, + + on_metadata_inventory_move = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_put = function(pos) + -- start timer function, it will sort out whether apiary can work or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_metadata_inventory_take = function(pos) + -- check whether the apiary is empty or not. + minetest.get_node_timer(pos):start(1.0) + end, + on_blast = function(pos) + local drops = {} + default.get_inventory_drops(pos, "monarch", drops) + default.get_inventory_drops(pos, "drone", drops) + default.get_inventory_drops(pos, "dst", drops) + drops[#drops+1] = "forestry_bees:apiary" + minetest.remove_node(pos) + return drops + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +})) + +--minetest.register_node("default:furnace_active", apply_logger({ + --description = S("Furnace"), + --tiles = { + --"default_furnace_top.png", "default_furnace_bottom.png", + --"default_furnace_side.png", "default_furnace_side.png", + --"default_furnace_side.png", + --{ + --image = "default_furnace_front_active.png", + --backface_culling = false, + --animation = { + --type = "vertical_frames", + --aspect_w = 16, + --aspect_h = 16, + --length = 1.5 + --}, + --} + --}, + --paramtype2 = "facedir", + --light_source = 8, + --drop = "default:furnace", + --groups = {cracky=2, not_in_creative_inventory=1}, + --legacy_facedir_simple = true, + --is_ground_content = false, + --sounds = default.node_sound_stone_defaults(), + --on_timer = furnace_node_timer, + --on_destruct = function(pos) + --stop_furnace_sound(pos) + --end, + + --can_dig = can_dig, + + --allow_metadata_inventory_put = allow_metadata_inventory_put, + --allow_metadata_inventory_move = allow_metadata_inventory_move, + --allow_metadata_inventory_take = allow_metadata_inventory_take, +--})) + +minetest.register_craft({ + output = "forestry_bees:apiary", + recipe = { + {"default:slab_wood", "default:slab_wood", "default:slab_wood"}, + {"default:wood", "", "default:wood"}, + {"default:wood", "default:wood", "default:wood"}, + } +}) \ No newline at end of file diff --git a/forestry_bees/init.lua b/forestry_bees/init.lua new file mode 100644 index 0000000..29b72ca --- /dev/null +++ b/forestry_bees/init.lua @@ -0,0 +1,118 @@ +local function Bee(beename,active_gene,inactive_gene) + local itemstack = ItemStack({name = beename}) + itemstack:get_meta():set_string("active_gene",active_gene) + itemstack:get_meta():set_string("inactive_gene",inactive_gene) + return itemstack +end + +local function makebeetexture(body1,body2,outline,color,ratio) + return body1.."^("..body1.."^[makealpha:0,0,0^[colorize:"..color..":"..ratio..")^"..body2.."^("..outline.."^[colorize:"..color..":"..ratio..")" +end + +local function printbeestats(itemstack, user, pointed_thing) + local meta = itemstack:get_meta() + local name = itemstack:get_name() + minetest.chat_send_player(user:get_player_name(), "Name:"..string.sub(string.match(name, ":.*"),2)..", Active:"..meta:get_string("active_gene")..", Inactive:"..meta:get_string("inactive_gene")) +end + +local function capitalize(s) + return s:sub(1,1):upper()..s:sub(2) +end + +local function register_bee(name, color, color_ratio) + minetest.register_craftitem("forestry_bees:"..name.."_princess", { + description = capitalize(name).." Princess", + inventory_image = makebeetexture("body1.png", + "princess.body2.png", + "princess.outline.png",color,color_ratio), + on_use = printbeestats, + groups = {bee_princess=1, bee_monarch=1}, + }) + minetest.register_craftitem("forestry_bees:"..name.."_drone", { + description = capitalize(name).." Drone", + inventory_image = makebeetexture("body1.png", + "drone.body2.png", + "drone.outline.png",color,color_ratio), + on_use = printbeestats, + groups = {bee_drone=1}, + }) + minetest.register_craftitem("forestry_bees:"..name.."_queen", { + description = capitalize(name).." Queen", + inventory_image = makebeetexture("body1.png", + "queen.body2.png", + "queen.outline.png",color,color_ratio), + on_use = printbeestats, + groups = {bee_queen=1, bee_monarch=1}, + }) +end + +--Here we register nodes +minetest.register_node("forestry_bees:forest_beehive", { + description = "Forest Beehive", + tiles = { + "forestry_bees_forest_beehive_top.png", + "forestry_bees_forest_beehive_top.png", + "forestry_bees_forest_beehive_side.png", + "forestry_bees_forest_beehive_side.png", + "forestry_bees_forest_beehive_side.png", + "forestry_bees_forest_beehive_side.png", + }, + groups = {scoopy = 1}, + diggable = true, + drop = { + max_items = 3, + items = { + {tool_groups = {"scoop_tool"}, rarity = 2, items = {Bee("forestry_bees:forest_princess","forest","forest")}}, + {tool_groups = {"scoop_tool"}, rarity = 2, items = {Bee("forestry_bees:forest_drone","forest","forest")}}, + {tool_groups = {"scoop_tool"}, rarity = 2, items = {"forestry_bees:honey_comb"}} + } + } +}) + +minetest.register_node("forestry_bees:meadow_beehive", { + description = "Meadow Beehive", + tiles = { + "forestry_bees_meadow_beehive_top.png", + "forestry_bees_meadow_beehive_top.png", + "forestry_bees_meadow_beehive_side.png", + "forestry_bees_meadow_beehive_side.png", + "forestry_bees_meadow_beehive_side.png", + "forestry_bees_meadow_beehive_side.png", + }, + groups = {scoopy = 1}, + diggable = true, + drop = { + max_items = 3, + items = { + {tool_groups = {"scoop_tool"}, rarity = 2, items = {Bee("forestry_bees:meadow_princess","meadow","meadow")}}, + {tool_groups = {"scoop_tool"}, rarity = 2, items = {Bee("forestry_bees:meadow_drone","meadow","meadow")}}, + {tool_groups = {"scoop_tool"}, rarity = 2, items = {"forestry_bees:honey_comb"}} + } + } +}) + +minetest.register_tool("forestry_bees:scoop", { + description = "Scoop", + inventory_image = "forestry_bees_scoop.png", + groups = {scoop_tool = 1}, + tool_capabilities = { + full_punch_interval = 1.5, + max_drop_level = 1, + groupcaps = { + scoopy = { + maxlevel = 1, + uses = 10, + times = { [1]=1, [2]=1, [3]=1 } + }, + }, + }, +}) + +register_bee("forest","#19d0ec","255") +register_bee("meadow","#ef131e","255") +register_bee("common","#b2b2b2","255") + +minetest.register_craftitem("forestry_bees:honey_comb", { + description = "Honey Comb", + inventory_image = "(bee_combs.0.png^[colorize:Yellow:100)^(bee_combs.1.png^[colorize:Yellow:120)" +}) \ No newline at end of file diff --git a/forestry_bees/mod.conf b/forestry_bees/mod.conf new file mode 100644 index 0000000..4497cb8 --- /dev/null +++ b/forestry_bees/mod.conf @@ -0,0 +1,3 @@ +name = forestry_bees +description = Adds bees with cross-breeding. +depends = default \ No newline at end of file diff --git a/forestry_bees/textures/beehives/forestry_bees_forest_beehive_side.png b/forestry_bees/textures/beehives/forestry_bees_forest_beehive_side.png new file mode 100644 index 0000000000000000000000000000000000000000..f53d6429157243042c15184f70442b9eb3231b3a GIT binary patch literal 369 zcmV-%0gnEOP)+RF)?9@X;4DayT zMMVrhKMFlP2|PRsNJtGgHwZ5;1uiZHBqRbE83HIM12Z!QCnp2$@7qO|5dQ!G0G3Ha zK~#8NP0mGj#6S#$;gZy7_AoPJa{tRsxBWcHx6)rLp=Hd<+O=Jd4Y+ZcD>cx%U`DGX zA`waA8QY>A2*567zTWt*lzvXMn!?O7EQT26wAqRf!31MOJqh+W9MjX8qe2G*Wav=e zNiXTjdr$-1@Kxni@u=$;T5%vJ!M`Do?Z97e9sJ zbPJ&zbsl~;#yPg4vu(ugTdc?hsxeM*6Bqkxq>xkz{ tRmY{5PA>?0nJS>E!5kbeJfn+;iD6Zo#3P2tzS}_E44$rjF6*2UngAQpC>{U+ literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/beehives/forestry_bees_meadow_beehive_top.png b/forestry_bees/textures/beehives/forestry_bees_meadow_beehive_top.png new file mode 100644 index 0000000000000000000000000000000000000000..84bf01d31e731d863b75a5913a968ead50d425f5 GIT binary patch literal 417 zcmV;S0bc%zP){uP3z{AqRaS2M`4TkuwjIH4%_94t^mB76$3BM5{i3y(1lj4lj?C<+P#01*ZOhbjvd2mx~%1&=QcDiQ{iH4&0D4~8iVpg|Xk zEDRI|0*oyT7zqO%3tgH~I89lL7p z<)M$gsEQoq$jsyyr`+H&C5vZs17f0uE^n|x0c%N#&0`d>Q6Udo7eEcH9Ri4I?x7rD zV8GVUxdN&NG@=r2xiZF*O>lihfC}FE!@20wg}(6p1N{E=5vu$H18@nY-lR8R00000 LNkvXXu0mjf>12K; literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/body1.png b/forestry_bees/textures/bees/body1.png new file mode 100644 index 0000000000000000000000000000000000000000..82f121feda36bff4ed5f455eb077f2c393520017 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW{r~^}g9i_uJ$v@{?OUK2 zkgK)$eK3&4SQ6wH%;50sMjDW#>gnPbQW2NDKuI8^jLBGnHDc~T9XGbL@N{;AZcY`Z eG)uz=%nZ#PE>0kBe&xe0+|8Kvies+no$JIaboWe_Iaz+*x$8zmTINtyO literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/drone.outline.png b/forestry_bees/textures/bees/drone.outline.png new file mode 100644 index 0000000000000000000000000000000000000000..49b4e5d336d599652117dea606ea5489ec75591c GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf>khA!5#U;DiOgM{7k{=6i iVX&25u)O~uD}!1|#LS8__7(8A5T-G@yGywog3@C*F literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/princess.body2.png b/forestry_bees/textures/bees/princess.body2.png new file mode 100644 index 0000000000000000000000000000000000000000..b53f9a11ce1d45186f4158de8e97ecc63074e605 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfsE1-gR4)78&qol`;+03UHl3;+NC literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/princess.outline.png b/forestry_bees/textures/bees/princess.outline.png new file mode 100644 index 0000000000000000000000000000000000000000..49b4e5d336d599652117dea606ea5489ec75591c GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf>khA!5#U;DiOgM{7k{=6i iVX&25u)O~uD}!1|#LS8__7(8A5T-G@yGywog3@C*F literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/queen.body2.png b/forestry_bees/textures/bees/queen.body2.png new file mode 100644 index 0000000000000000000000000000000000000000..a67c57aea620bb655bc598699180011177481605 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#VfG-N!GRclvxr7I?jsn0D+L$^?)bOe6oI>KXBl{gh}D;N`4|U zj90$=fB5(I|Mq+8f7_o?n3egjzoqk1k4(q^*{_2x@Fph!!HvC@mVWz{xfk7bs7f$Y yu#{()U(dZk(k(z%SdUXl=K%M=#TO4tGBE5<^oua~*-;L35QC?ypUXO@geCwUf=d+u literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/bees/queen.outline.png b/forestry_bees/textures/bees/queen.outline.png new file mode 100644 index 0000000000000000000000000000000000000000..49b4e5d336d599652117dea606ea5489ec75591c GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf>khA!5#U;DiOgM{7k{=6i iVX&25u)O~uD}!1|#LS8__7(8A5T-G@yGywog3@C*F literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/items/bee_combs.0.png b/forestry_bees/textures/items/bee_combs.0.png new file mode 100644 index 0000000000000000000000000000000000000000..43ca34655c40dd4e5bdbdf767d6f833d0aeb298f GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ&9<+|$zYN%n&I+J0dRC8DG1a5(q2bVtR rGCb25wUBF*lYvQ~iI2dM1_p+Z^Wy&R9gTe~DWM4f3HL;_ literal 0 HcmV?d00001 diff --git a/forestry_bees/textures/tools/forestry_bees_scoop.png b/forestry_bees/textures/tools/forestry_bees_scoop.png new file mode 100644 index 0000000000000000000000000000000000000000..bc75dba8e4de8a2c08fe9a0f8c7bc071358d2ebe GIT binary patch literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa3-AeXJ#v80(@ZqOPfkOQ8^Tz% zYSo=PcYxf^boDQe-baBdSxSQZf`K%{=E-TZfK-B~i(^PdTrvZbTR1D5fq*A}lfj+K z-Upp@Qd6HMD4KmQ>JW(btcp00i_>zopr0BSWrd;kCd literal 0 HcmV?d00001 diff --git a/modpack.conf b/modpack.conf new file mode 100644 index 0000000..4a0135c --- /dev/null +++ b/modpack.conf @@ -0,0 +1,3 @@ +name = forestry +description = Clone of the Minecraft Forestry mod. Adds bees, trees and butterflies with cross-breeding and related machines. +depends = default \ No newline at end of file