From aeee941b2c33968790819fac18c7d4c198222a77 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 31 May 2018 05:45:57 +0200 Subject: [PATCH] Breeding sheep now mixes wool colors like dyes --- mods/ENTITIES/mobs_mc/sheep.lua | 39 ++++++++++++++++++++++++++++----- mods/ITEMS/mcl_dye/init.lua | 22 +++++++++++++++---- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index fa4197370..9f6d95e85 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -207,15 +207,44 @@ mobs:register_mob("mobs_mc:sheep", { if mobs:capture_mob(self, clicker, 0, 5, 70, false, nil) then return end end, on_breed = function(parent1, parent2) + -- Breed sheep and choose a fur color for the child. local pos = parent1.object:get_pos() local child = mobs:spawn_child(pos, parent1.name) if child then local ent_c = child:get_luaentity() - local p = math.random(1, 2) - if p == 1 then - ent_c.base_texture = sheep_texture(parent1.color) - else - ent_c.base_texture = sheep_texture(parent2.color) + local color1 = parent1.color + local color2 = parent2.color + + local dye1 = mcl_dye.unicolor_to_dye(color1) + local dye2 = mcl_dye.unicolor_to_dye(color2) + local output + -- Check if parent colors could be mixed as dyes + if dye1 and dye2 then + output = minetest.get_craft_result({items = {dye1, dye2}, method="normal"}) + end + local mixed = false + if output and not output.item:is_empty() then + -- Try to mix dyes and use that as new fur color + local new_dye = output.item:get_name() + local groups = minetest.registered_items[new_dye].groups + for k, v in pairs(groups) do + if string.sub(k, 1, 9) == "unicolor_" then + ent_c.base_texture = sheep_texture(k) + mixed = true + break + end + end + end + + -- Colors not mixable + if not mixed then + -- Choose color randomly from one of the parents + local p = math.random(1, 2) + if p == 1 then + ent_c.base_texture = sheep_texture(color1) + else + ent_c.base_texture = sheep_texture(color2) + end end child:set_properties({textures = ent_c.base_texture}) ent_c.initial_color_set = true diff --git a/mods/ITEMS/mcl_dye/init.lua b/mods/ITEMS/mcl_dye/init.lua index 1c78cbaed..5d0f871e0 100644 --- a/mods/ITEMS/mcl_dye/init.lua +++ b/mods/ITEMS/mcl_dye/init.lua @@ -13,11 +13,11 @@ -- recipe = {':item_no_color', 'group:basecolor_yellow'}, -- }) --- Other mods can use these for looping through available colors mcl_dye = {} -local dye = {} -dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} -dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +-- Other mods can use these for looping through available colors +mcl_dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} +mcl_dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} -- Base color groups: -- - basecolor_white @@ -82,6 +82,20 @@ dyelocal.dyes = { {"pink", "Pink Dye", {dye=1, craftitem=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, } +dyelocal.unicolor_to_dye_id = {} +for d=1, #dyelocal.dyes do + for k, _ in pairs(dyelocal.dyes[d][3]) do + if string.sub(k, 1, 9) == "unicolor_" then + dyelocal.unicolor_to_dye_id[k] = dyelocal.dyes[d][1] + end + end +end + +-- Takes an unicolor group name (e.g. “unicolor_white”) and returns a corresponding dye name (if it exists), nil otherwise. +mcl_dye.unicolor_to_dye = function(unicolor_group) + return "mcl_dye:" .. dyelocal.unicolor_to_dye_id[unicolor_group] +end + -- Define items for _, row in ipairs(dyelocal.dyes) do local name = row[1]