ExchangeClone/exchangeclone/shears.lua

434 lines
19 KiB
Lua

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", ""},
}
})