function exchangeclone.shear_action(itemstack, player, center) if not (itemstack and player and center) then return end if exchangeclone.check_cooldown(player, "shears") then return end local start_node = minetest.get_node(center) local leaves = minetest.get_item_group(start_node.name, "leaves") > 0 local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1) local vector1, vector2 = exchangeclone.process_range(player, leaves and "large_radius" or "basic_radius", charge) if not (vector1 and vector2) then return end local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) exchangeclone.play_sound(player, "exchangeclone_destruct") local grouped = leaves and {"group:leaves"} or {"group:shearsy", "group:shearsy_cobweb"} local nodes = minetest.find_nodes_in_area(pos1, pos2, grouped) for i, pos in pairs(nodes) do local node = minetest.get_node(pos) if leaves or (not leaves and node.name ~= "mcl_flowers:double_grass_top") then if minetest.is_protected(pos, player:get_player_name()) then minetest.record_protection_violation(pos, player:get_player_name()) else local drops = minetest.get_node_drops(node.name, itemstack:get_name()) exchangeclone.drop_items_on_player(pos, drops, player) -- Annoying manual override if node.name:sub(1,18) == "mcl_ocean:seagrass" then minetest.set_node(pos, {name="mcl_core:sand"}) end end end end exchangeclone.remove_nodes(nodes) exchangeclone.start_cooldown(player, "shears", (charge+1)/7) end local shears_rightclick = function(itemstack, player, pointed_thing) -- Use pointed node's on_rightclick function first, if present local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) if click_test ~= false then return click_test end if player:get_player_control().aux1 then return exchangeclone.charge_update(itemstack, player) end if (pointed_thing.type == "node") and not player:get_player_control().sneak then local node = minetest.get_node(pointed_thing.under) local on_shears_place = minetest.registered_items[node.name]._on_shears_place if on_shears_place then return on_shears_place(itemstack, player, pointed_thing) end if node.name == "mcl_farming:pumpkin" and (pointed_thing.above.y ~= pointed_thing.under.y) then minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pointed_thing.above}, true) local dir = vector.subtract(pointed_thing.under, pointed_thing.above) local param2 = minetest.dir_to_facedir(dir) minetest.set_node(pointed_thing.under, {name="mcl_farming:pumpkin_face", param2 = param2}) minetest.add_item(pointed_thing.above, "mcl_farming:pumpkin_seeds 4") elseif minetest.get_item_group(node.name, "shearsy") > 0 or minetest.get_item_group(node.name, "shearsy_cobweb") > 0 then exchangeclone.shear_action(itemstack, player, pointed_thing.under) end end return itemstack end minetest.register_tool("exchangeclone:dark_matter_shears", { description = "Dark Matter Shears", wield_image = "exchangeclone_dark_matter_shears.png", inventory_image = "exchangeclone_dark_matter_shears.png", stack_max = 1, groups = { tool=1, shears=1, dig_speed_class=5, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, tool_capabilities = { full_punch_interval = 0.25, max_drop_level=1, damage_groups = { fleshy = 1, }, }, on_place = shears_rightclick, on_secondary_use = shears_rightclick, sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { shearsy = { speed = 14, level = 5, uses = 0 }, shearsy_wool = { speed = 14, level = 5, uses = 0 }, shearsy_cobweb = { speed = 14, level = 5, uses = 0 } }, wear_represents = "exchangeclone_charge_level" }) exchangeclone.set_charge_type("exchangeclone:dark_matter_shears", "dark_matter") minetest.register_tool("exchangeclone:red_matter_shears", { description = "Red Matter Shears", wield_image = "exchangeclone_red_matter_shears.png", inventory_image = "exchangeclone_red_matter_shears.png", stack_max = 1, groups = { tool=1, shears=1, dig_speed_class=6, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, tool_capabilities = { full_punch_interval = 0.25, max_drop_level=1, damage_groups = { fleshy = 1, }, }, on_place = shears_rightclick, on_secondary_use = shears_rightclick, sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { shearsy = { speed = 16, level = 6, uses = 0 }, shearsy_wool = { speed = 16, level = 6, uses = 0 }, shearsy_cobweb = { speed = 16, level = 6, uses = 0 } }, wear_represents = "exchangeclone_charge_level" }) exchangeclone.set_charge_type("exchangeclone:red_matter_shears", "red_matter") local special_shears = { ["exchangeclone:dark_matter_shears"] = true, ["exchangeclone:red_matter_shears"] = true, ["exchangeclone:red_katar"] = true } local colors = { -- group = { wool, textures } unicolor_white = { "mcl_wool:white", "#FFFFFF00" }, unicolor_dark_orange = { "mcl_wool:brown", "#502A00D0" }, unicolor_grey = { "mcl_wool:silver", "#5B5B5BD0" }, unicolor_darkgrey = { "mcl_wool:grey", "#303030D0" }, unicolor_blue = { "mcl_wool:blue", "#0000CCD0" }, unicolor_dark_green = { "mcl_wool:green", "#005000D0" }, unicolor_green = { "mcl_wool:lime", "#50CC00D0" }, unicolor_violet = { "mcl_wool:purple" , "#5000CCD0" }, unicolor_light_red = { "mcl_wool:pink", "#FF5050D0" }, unicolor_yellow = { "mcl_wool:yellow", "#CCCC00D0" }, unicolor_orange = { "mcl_wool:orange", "#CC5000D0" }, unicolor_red = { "mcl_wool:red", "#CC0000D0" }, unicolor_cyan = { "mcl_wool:cyan", "#00CCCCD0" }, unicolor_red_violet = { "mcl_wool:magenta", "#CC0050D0" }, unicolor_black = { "mcl_wool:black", "#000000D0" }, unicolor_light_blue = { "mcl_wool:light_blue", "#5050FFD0" }, } local gotten_texture = { "blank.png", "mobs_mc_sheep.png" } local old_sheep_function = minetest.registered_entities["mobs_mc:sheep"].on_rightclick minetest.registered_entities["mobs_mc:sheep"].on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() local item_name = item:get_name() if special_shears[item_name] and not self.gotten and not self.child then local pos = self.object:get_pos() local chance = 30 --percent if item_name == "exchangeclone:red_matter_shears" or item_name == "exchangeclone:red_katar" then chance = 60 end if math.random(1, 100) <= chance then local new_sheep = minetest.add_entity(pos, "mobs_mc:sheep"):get_luaentity() --clone the sheep for attribute, value in pairs(self) do if attribute ~= "object" then new_sheep[attribute] = value end end new_sheep.object:set_properties({ nametag = self.nametag, textures = self.base_texture }) end self.gotten = true minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) pos = clicker:get_pos() --drop directly on player if not self.color then self.color = "unicolor_white" end local max_wool = 8 if item_name == "exchangeclone:red_matter_shears" or item_name == "exchangeclone:red_katar" then max_wool = 12 end minetest.add_item(pos, ItemStack(colors[self.color][1].." "..math.random(1,max_wool))) --normally 3 self.base_texture = gotten_texture self.object:set_properties({ textures = self.base_texture, }) self.drops = { {name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2,}, } return else old_sheep_function(self, clicker) end end local old_mooshroom_function = minetest.registered_entities["mobs_mc:mooshroom"].on_rightclick minetest.registered_entities["mobs_mc:mooshroom"].on_rightclick = function(self, clicker)if self:feed_tame(clicker, 1, true, false) then return end if mcl_mobs:protect(self, clicker) then return end if self.child then return end local item = clicker:get_wielded_item() local item_name = item:get_name() -- Use shears to get mushrooms and turn mooshroom into cow if special_shears[item_name] then local pos = self.object:get_pos() local player_pos = clicker:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) local amount = 8 if item_name == "exchangeclone:red_matter_shears" or item_name == "exchangeclone:red_katar" then amount = 12 end if self.base_texture[1] == "mobs_mc_mooshroom_brown.png" then minetest.add_item(player_pos, "mcl_mushrooms:mushroom_brown "..amount) else minetest.add_item(player_pos, "mcl_mushrooms:mushroom_red "..amount) end local chance = 30 --percent if item_name == "exchangeclone:red_matter_shears" or item_name == "exchangeclone:red_katar" then chance = 60 end if math.random(1, 100) <= chance then local new_mooshroom = minetest.add_entity(pos, "mobs_mc:mooshroom"):get_luaentity() --clone the mooshroom for attribute, value in pairs(self) do if attribute ~= "object" then new_mooshroom[attribute] = value end end new_mooshroom.object:set_properties({ nametag = self.nametag, textures = self.base_texture }) end local oldyaw = self.object:get_yaw() self.object:remove() local cow = minetest.add_entity(pos, "mobs_mc:cow") cow:set_yaw(oldyaw) else old_mooshroom_function(self, clicker) end end local old_honey_harvest = minetest.registered_items["mcl_beehives:bee_nest_5"].on_rightclick for _, itemstring in pairs({"mcl_beehives:bee_nest_5", "mcl_beehives:beehive_5"}) do minetest.registered_items[itemstring].on_rightclick = function(pos, node, player, itemstack, pointed_thing) local held_name = player:get_wielded_item():get_name() local shears = special_shears[held_name] local beehive local campfire_area = vector.offset(pos, 0, -5, 0) local campfire = minetest.find_nodes_in_area(pos, campfire_area, "group:lit_campfire") if node.name == "mcl_beehives:beehive_5" then beehive = "mcl_beehives:beehive" elseif node.name == "mcl_beehives:bee_nest_5" then beehive = "mcl_beehives:bee_nest" end if shears then minetest.add_item(pos, "mcl_honey:honeycomb 3") node.name = beehive minetest.set_node(pos, node) if not campfire[1] then mcl_util.deal_damage(player, 3) end --significantly less damage else old_honey_harvest(pos, node, player, itemstack, pointed_thing) end end end local old_dispenser_function = minetest.registered_items["mcl_dispensers:dispenser"].mesecons.effector.action_on local new_dispenser_function = function(pos, node) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local droppos, dropdir if node.name == "mcl_dispensers:dispenser" then dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) droppos = vector.add(pos, dropdir) elseif node.name == "mcl_dispensers:dispenser_up" then droppos = {x=pos.x, y=pos.y+1, z=pos.z} elseif node.name == "mcl_dispensers:dispenser_down" then droppos = {x=pos.x, y=pos.y-1, z=pos.z} end local stacks = {} for i=1,inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then table.insert(stacks, {stack = stack, stackpos = i}) end end if #stacks >= 1 then local r = math.random(1, #stacks) local stack = stacks[r].stack local dropitem = ItemStack(stack) dropitem:set_count(1) local stack_id = stacks[r].stackpos local stackdef = stack:get_definition() if not stackdef then return end local iname = stack:get_name() if special_shears[iname] then for _, obj in pairs(minetest.get_objects_inside_radius(droppos, 1)) do local entity = obj:get_luaentity() if entity and not entity.child and not entity.gotten then local entname = entity.name local entity_pos = obj:get_pos() local used = false local texture if entname == "mobs_mc:sheep" then local max_wool = 8 if iname == "exchangeclone:red_matter_shears" or iname == "exchangeclone:red_katar" then max_wool = 12 end minetest.add_item(entity_pos, entity.drops[2].name.." "..math.random(1,max_wool)) --normally 3 if not entity.color then entity.color = "unicolor_white" end local chance = 30 --percent if iname == "exchangeclone:red_matter_shears" or iname == "exchangeclone:red_katar" then chance = 60 end if math.random(1, 100) <= chance then local new_sheep = minetest.add_entity(entity_pos, "mobs_mc:sheep"):get_luaentity() --clone the sheep for attribute, value in pairs(entity) do if attribute ~= "object" then new_sheep[attribute] = value end end new_sheep.object:set_properties({ nametag = entity.nametag, textures = entity.base_texture }) end entity.base_texture = { "blank.png", "mobs_mc_sheep.png" } texture = entity.base_texture entity.drops = { { name = "mcl_mobitems:mutton", chance = 1, min = 1, max = 2 }, } used = true elseif entname == "mobs_mc:snowman" then texture = { "mobs_mc_snowman.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png", } used = true elseif entname == "mobs_mc:mooshroom" then local amount = 8 if iname == "exchangeclone:red_matter_shears" or iname == "exchangeclone:red_katar" then amount = 12 end if entity.base_texture[1] == "mobs_mc_mooshroom_brown.png" then minetest.add_item(droppos, "mcl_mushrooms:mushroom_brown "..amount) else minetest.add_item(droppos, "mcl_mushrooms:mushroom_red "..amount) end local chance = 30 --percent if iname == "exchangeclone:red_matter_shears" or iname == "exchangeclone:red_katar" then chance = 60 end if math.random(1, 100) <= chance then local new_mooshroom = minetest.add_entity(entity_pos, "mobs_mc:mooshroom"):get_luaentity() --clone the mooshroom for attribute, value in pairs(entity) do if attribute ~= "object" then new_mooshroom[attribute] = value end end new_mooshroom.object:set_properties({ nametag = entity.nametag, textures = entity.base_texture }) end obj = mcl_util.replace_mob(obj, "mobs_mc:cow") entity = obj:get_luaentity() used = true end if used then obj:set_properties({ textures = texture }) entity.gotten = true minetest.sound_play("mcl_tools_shears_cut", { pos = entity_pos }, true) inv:set_stack("main", stack_id, stack) break end end end return end end old_dispenser_function(pos, node) end for _, itemstring in pairs({"mcl_dispensers:dispenser", "mcl_dispensers:dispenser_up", "mcl_dispensers:dispenser_down"}) do minetest.registered_items[itemstring].mesecons.effector.action_on = new_dispenser_function end local snowman_gotten_texture = { "mobs_mc_snowman.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png", } local old_snowman_function = minetest.registered_entities["mobs_mc:snowman"].on_rightclick minetest.registered_entities["mobs_mc:snowman"].on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() local item_name = item:get_name() if self.gotten ~= true and special_shears[item_name] then -- Remove pumpkin self.gotten = true self.object:set_properties({ textures = snowman_gotten_texture, }) local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) if minetest.registered_items["mcl_farming:pumpkin_face"] then minetest.add_item({x=pos.x, y=pos.y+1.4, z=pos.z}, "mcl_farming:pumpkin_face") end else old_snowman_function(self, clicker) end end minetest.register_craft({ output = "exchangeclone:dark_matter_shears", recipe = { {"", "exchangeclone:dark_matter"}, {exchangeclone.itemstrings.diamond, ""}, } }) minetest.register_craft({ output = "exchangeclone:red_matter_shears", recipe = { {"", "exchangeclone:red_matter"}, {"exchangeclone:dark_matter_shears", ""}, } })