From c639113d6d73f0dc842bc4524bba5190fd364aa2 Mon Sep 17 00:00:00 2001 From: ThePython <87204246+ThePython10110@users.noreply.github.com> Date: Fri, 26 Jan 2024 08:52:38 -0800 Subject: [PATCH] Most tools updated, updated hardness --- exchangeclone/alchemical_chests.lua | 8 +- exchangeclone/axes.lua | 110 ++++++++++-------- exchangeclone/craftitems.lua | 4 +- exchangeclone/hammers.lua | 7 +- exchangeclone/hoes.lua | 147 +++++++++++------------- exchangeclone/pickaxes.lua | 2 +- exchangeclone/red_matter_multitools.lua | 20 ++-- exchangeclone/shears.lua | 84 ++++++-------- exchangeclone/shovels.lua | 139 +++++++++++----------- exchangeclone/swords.lua | 13 +-- exchangeclone/transmutation_table.lua | 4 +- zzzz_exchangeclone_init/init.lua | 3 + zzzz_exchangeclone_init/lib.lua | 77 +++++++------ 13 files changed, 306 insertions(+), 312 deletions(-) diff --git a/exchangeclone/alchemical_chests.lua b/exchangeclone/alchemical_chests.lua index 890b51e..3a17d9b 100644 --- a/exchangeclone/alchemical_chests.lua +++ b/exchangeclone/alchemical_chests.lua @@ -38,8 +38,8 @@ local pipeworks_connect = exchangeclone.pipeworks and "^pipeworks_tube_connectio minetest.register_node("exchangeclone:alchemical_chest", { description = S("Alchemical Chest"), groups = {container = 2, alchemical_chest = 1, cracky = 2, pickaxey = 2, tubedevice = 1, tubedevice_receiver = 1}, - _mcl_hardness = 3, - _mcl_blast_resistance = 6, + _mcl_hardness = 10, + _mcl_blast_resistance = 15, paramtype2 = "4dir", tiles = { "exchangeclone_alchemical_chest_top.png"..pipeworks_connect, @@ -158,8 +158,8 @@ for color, color_data in pairs(exchangeclone.colors) do minetest.register_node(advanced_itemstring, { description = S("@1 Advanced Alchemical Chest", color_data.name).."\n"..S("Shift+right-click with an alchemical bag to change the color."), - _mcl_hardness = 3, - _mcl_blast_resistance = 6, + _mcl_hardness = 10, + _mcl_blast_resistance = 15, groups = {container = 1, advanced_alchemical_chest = 1, cracky = 2, pickaxey = 2}, paramtype2 = "4dir", tiles = { diff --git a/exchangeclone/axes.lua b/exchangeclone/axes.lua index f7066e6..d90bed2 100644 --- a/exchangeclone/axes.lua +++ b/exchangeclone/axes.lua @@ -1,45 +1,54 @@ local S = minetest.get_translator() -exchangeclone.axe_action = { - start_action = function(player, center, range, itemstack) - if exchangeclone.check_cooldown(player, "axe") then return end - local data = {} - if exchangeclone.mcl then - data.strip = not player:get_player_control().sneak +function exchangeclone.axe_action(itemstack, player, center) + if exchangeclone.check_cooldown(player, "axe") then return end + local strip + local start_node = minetest.get_node(center) + local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1) + local start_def = minetest.registered_items[start_node.name] + local stripped_variant = start_def._mcl_stripped_variant + if exchangeclone.mcl then + if charge == 1 then + strip = true + else + strip = not player:get_player_control().sneak end - if range > 0 or not data.strip then - exchangeclone.play_ability_sound(player) - end - data.itemstack = itemstack - data.remove_positions = {} - return data - end, - action = function(player, pos, node, data) - local node_def = minetest.registered_items[node.name] - if (node_def.groups.tree or node_def.groups.leaves) then - if minetest.is_protected(pos, player:get_player_name()) then - minetest.record_protection_violation(pos, player:get_player_name()) - else - if data.strip then - if node_def._mcl_stripped_variant ~= nil then - minetest.swap_node(pos, {name=node_def._mcl_stripped_variant, param2=node.param2}) - end - else - local drops = minetest.get_node_drops(node.name, data.itemstack:get_name()) - exchangeclone.drop_items_on_player(pos, drops, player) - table.insert(data.remove_positions, pos) + if strip and not stripped_variant then return end + end + minetest.log("strip = "..dump(strip)) + local nodes + local groups_to_search = strip and {start_node.name} or {"group:tree", "group:leaves"} + local range_type = strip and "basic_radius" or "large_radius" + if charge > 1 then + local vector1, vector2 = exchangeclone.process_range(player, range_type, charge) + local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) + exchangeclone.play_ability_sound(player) + nodes = minetest.find_nodes_in_area(pos1, pos2, groups_to_search) + else + nodes = {center} + end + for _, pos in pairs(nodes) do + local node = minetest.get_node(pos) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + else + if strip then + if node.param2 == start_node.param2 then + minetest.swap_node(pos, {name=stripped_variant, param2=node.param2}) end + else + local drops = minetest.get_node_drops(node.name, itemstack:get_name()) + exchangeclone.drop_items_on_player(pos, drops, player) end end - return data - end, - end_action = function(player, center, range, data) - exchangeclone.remove_nodes(data.remove_positions) - if range > 0 or not data.strip then - exchangeclone.start_cooldown(player, "axe", range/6) - end end -} + if not strip then + exchangeclone.remove_nodes(nodes) + end + if charge > 1 or not strip then + exchangeclone.start_cooldown(player, "axe", charge/3) + end +end local function axe_on_place(itemstack, player, pointed_thing) local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) @@ -48,18 +57,15 @@ local function axe_on_place(itemstack, player, pointed_thing) end if player:get_player_control().aux1 then - if itemstack:get_name():find("dark") then - return exchangeclone.charge_update(itemstack, player, 3) - else - return exchangeclone.charge_update(itemstack, player, 4) + return exchangeclone.charge_update(itemstack, player) + end + + if pointed_thing.type == "node" then + if minetest.get_item_group(minetest.get_node(pointed_thing.under), "tree" > 0) then + exchangeclone.axe_action(itemstack, player, pointed_thing.under) end end - local range = itemstack:get_meta():get_int("exchangeclone_tool_charge") - - local center = player:get_pos() - if pointed_thing.type == "node" then center = pointed_thing.under end - exchangeclone.node_radius_action(player, center, range, exchangeclone.axe_action, itemstack) return itemstack end @@ -71,9 +77,9 @@ minetest.register_tool("exchangeclone:dark_matter_axe", { wield_scale = exchangeclone.wield_scale, tool_capabilities = { -- 1/1.2 - full_punch_interval = 0.5, + full_punch_interval = 1, max_drop_level=6, - damage_groups = {fleshy=16}, + damage_groups = {fleshy=9}, punch_attack_uses = 0, groupcaps={ choppy = {times={[1]=1.5, [2]=0.75, [3]=0.38}, uses=0, maxlevel=4}, @@ -84,10 +90,12 @@ minetest.register_tool("exchangeclone:dark_matter_axe", { on_secondary_use = axe_on_place, _mcl_toollike_wield = true, _mcl_diggroups = { - axey = { speed = 16, level = 5, uses = 0 } + axey = { speed = 14, level = 5, uses = 0 } }, }) +exchangeclone.set_charge_type("exchangeclone:dark_matter_axe", "dark_matter") + minetest.register_tool("exchangeclone:red_matter_axe", { description = S("Red Matter Axe"), wield_image = "exchangeclone_red_matter_axe.png", @@ -96,9 +104,9 @@ minetest.register_tool("exchangeclone:red_matter_axe", { wield_scale = exchangeclone.wield_scale, tool_capabilities = { -- 1/1.2 - full_punch_interval = 0.4, + full_punch_interval = 1, max_drop_level=7, - damage_groups = {fleshy=19}, + damage_groups = {fleshy=10}, punch_attack_uses = 0, groupcaps={ choppy = {times={[1]=1, [2]=0.5, [3]=0.25}, uses=0, maxlevel=5}, @@ -109,10 +117,12 @@ minetest.register_tool("exchangeclone:red_matter_axe", { on_secondary_use = axe_on_place, _mcl_toollike_wield = true, _mcl_diggroups = { - axey = { speed = 20, level = 6, uses = 0 } + axey = { speed = 16, level = 6, uses = 0 } }, }) +exchangeclone.set_charge_type("exchangeclone:red_matter_axe", "red_matter") + minetest.register_craft({ output = "exchangeclone:dark_matter_axe", recipe = { diff --git a/exchangeclone/craftitems.lua b/exchangeclone/craftitems.lua index 72815ef..95e7bbf 100644 --- a/exchangeclone/craftitems.lua +++ b/exchangeclone/craftitems.lua @@ -68,7 +68,7 @@ minetest.register_node("exchangeclone:dark_matter_block", { sounds = exchangeclone.sound_mod.node_sound_stone_defaults(), groups = {pickaxey=5, material_stone=1, cracky = 3, level = get_level(4)}, --ridiculous workaround _mcl_blast_resistance = 1500, - _mcl_hardness = 75, + _mcl_hardness = 12, }) minetest.register_node("exchangeclone:red_matter_block", { @@ -79,7 +79,7 @@ minetest.register_node("exchangeclone:red_matter_block", { sounds = exchangeclone.sound_mod.node_sound_stone_defaults(), groups = {pickaxey=6, material_stone=1, cracky = 3, level = get_level(5)}, _mcl_blast_resistance = 1500, - _mcl_hardness = 100, + _mcl_hardness = 37, }) if exchangeclone.mcl then minetest.register_craft({ diff --git a/exchangeclone/hammers.lua b/exchangeclone/hammers.lua index 5de387a..0a42d93 100644 --- a/exchangeclone/hammers.lua +++ b/exchangeclone/hammers.lua @@ -3,7 +3,7 @@ local S = minetest.get_translator() function exchangeclone.hammer_action(itemstack, player, center) if not (itemstack and player and center) then return end if exchangeclone.check_cooldown(player, "hammer") then return end - local charge = itemstack:get_meta():get_int("exchangeclone_tool_charge") or 0 + local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1) local vector1, vector2 = exchangeclone.process_range(player, "hammer", charge) if not (vector1 and vector2) then return end @@ -46,12 +46,9 @@ local function hammer_on_place(itemstack, player, pointed_thing) return itemstack end - local range = itemstack:get_meta():get_int("exchangeclone_tool_charge") - local center = player:get_pos() if pointed_thing.type == "node" then - center = pointed_thing.under + exchangeclone.hammer_action(itemstack, player, pointed_thing.under) end - exchangeclone.hammer_action(itemstack, player, center) end minetest.register_tool("exchangeclone:dark_matter_hammer", { diff --git a/exchangeclone/hoes.lua b/exchangeclone/hoes.lua index 8ca6a06..50ba111 100644 --- a/exchangeclone/hoes.lua +++ b/exchangeclone/hoes.lua @@ -1,11 +1,9 @@ local S = minetest.get_translator() local function create_soil(itemstack, player, pointed_thing) - if not pointed_thing.under then return end - if not pointed_thing.under.x then return end local pos = pointed_thing.under local name = minetest.get_node(pos).name - local above_name = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name + local above_name = minetest.get_node(vector.offset(pos,0,1,0)).name if minetest.is_protected(pointed_thing.under, player:get_player_name()) then minetest.record_protection_violation(pointed_thing.under, player:get_player_name()) @@ -39,27 +37,33 @@ else end end -exchangeclone.hoe_action = { - start_action = function(player, center, range, itemstack) - if exchangeclone.check_cooldown(player, "hoe") then return end - local data = {} - if range > 0 then - exchangeclone.play_ability_sound(player) - end - data.itemstack = itemstack - return data - end, - action = function(player, pos, node, data) - local new_pointed_thing = {type = "node", under = pos, above = {x=pos.x,y=pos.y+1,z=pos.z}} - hoe_function(data.itemstack, player, new_pointed_thing) - return data - end, - end_action = function(player, center, range, data) - if range > 0 then - exchangeclone.start_cooldown(player, "hoe", range/4) +function exchangeclone.hoe_action(itemstack, player, center) + if not (itemstack and player and center) then return end + if exchangeclone.check_cooldown(player, "hoe") then return end + local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1) + local nodes + if charge > 1 then + local vector1, vector2 = exchangeclone.process_range(player, "flat", charge) + if not (vector1 and vector2) then return end + local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) + nodes = minetest.find_nodes_in_area(pos1, pos2, {"group:cultivatable"}) + exchangeclone.play_ability_sound(player) + else + nodes = {center} + end + for _, pos in pairs(nodes) do + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + else + local new_pointed_thing = {type = "node", under = pos, above = vector.offset(pos,0,1,0)} + hoe_function(itemstack, player, new_pointed_thing) end end -} + + if charge > 0 then + exchangeclone.start_cooldown(player, "hoe", charge/4) + end +end local hoe_on_place = function(itemstack, player, pointed_thing) local click_test = exchangeclone.check_on_rightclick(itemstack, player, pointed_thing) @@ -68,31 +72,30 @@ local hoe_on_place = function(itemstack, player, pointed_thing) end if player:get_player_control().aux1 then - if itemstack:get_name():find("dark") then - return exchangeclone.charge_update(itemstack, player, 3) - else - return exchangeclone.charge_update(itemstack, player, 4) - end + return exchangeclone.charge_update(itemstack, player) end if player:get_player_control().sneak then - local current_name = itemstack:get_name() - if string.sub(current_name, -4, -1) == "_3x3" then - itemstack:set_name(string.sub(current_name, 1, -5)) + local meta = itemstack:get_meta() + local current_mode = meta:get_string("exchangeclone_multidig_mode") + if current_mode == "3x3" then + meta:set_string("exchangeclone_multidig_mode", "1x1") minetest.chat_send_player(player:get_player_name(), S("Single node mode")) else - itemstack:set_name(current_name.."_3x3") + meta:set_string("exchangeclone_multidig_mode", "3x3") minetest.chat_send_player(player:get_player_name(), S("3x3 mode")) end return itemstack end - - local range = itemstack:get_meta():get_int("exchangeclone_tool_charge") - local center = player:get_pos() if pointed_thing.type == "node" then - center = pointed_thing.under + local node_name = minetest.get_node(pointed_thing.under).name + local def = minetest.registered_nodes[node_name] + if minetest.get_item_group(node_name, "cultivatable") > 0 + or (minetest.get_item_group(node_name, "soil") > 0 and + (def.soil and def.soil.wet and def.soil.dry)) then + exchangeclone.hoe_action(itemstack, player, pointed_thing.under) + end end - exchangeclone.node_radius_action(player, center, range, exchangeclone.hoe_action, itemstack) end if exchangeclone.mcl then @@ -109,7 +112,7 @@ for name, def in pairs(minetest.registered_nodes) do end end -local hoe_def = { +minetest.register_tool("exchangeclone:dark_matter_hoe", { description = S("Dark Matter Hammer").."\n"..S("Single node mode"), wield_image = "exchangeclone_dark_matter_hoe.png", inventory_image = "exchangeclone_dark_matter_hoe.png", @@ -119,57 +122,47 @@ local hoe_def = { groups = { tool=1, hoe=1, enchantability=0, dark_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, tool_capabilities = { full_punch_interval = 0.25, - damage_groups = { fleshy = 7, }, + damage_groups = { fleshy = 1, }, groupcaps={ exchangeclone_dirt = {times={[1]=0.25, [2]=0.25, [3]=0.25}, uses=0, maxlevel=4}, }, }, _mcl_toollike_wield = true, _mcl_diggroups = { - exchangeclone_dirt = { speed = 12, level = 7, uses = 0 }, - hoey = { speed = 12, level = 7, uses = 0 } + exchangeclone_dirt = { speed = 14, level = 7, uses = 0 }, + hoey = { speed = 14, level = 7, uses = 0 } }, -} +}) -minetest.register_tool("exchangeclone:dark_matter_hoe", table.copy(hoe_def)) +exchangeclone.register_multidig_tool("exchangeclone:dark_matter_hoe", {"group:exchangeclone_dirt"}) +minetest.register_alias("exchangeclone:dark_matter_hoe_3x3", "exchangeclone:dark_matter_hoe") +exchangeclone.set_charge_type("exchangeclone:dark_matter_hoe", "dark_matter") -local hoe_3x3_def = table.copy(hoe_def) -hoe_3x3_def.description = S("Dark Matter Hammer").."\n"..S("3x3 mode") -hoe_3x3_def.groups.not_in_creative_inventory = 1 -hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.4, [2]=0.4, [3]=0.4} -hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 8, level = 7, uses = 0 } - -minetest.register_tool("exchangeclone:dark_matter_hoe_3x3", table.copy(hoe_3x3_def)) - -exchangeclone.register_alias("exchangeclone:dark_matter_hoe", "exchangeclone:dark_matter_hoe_3x3") - -hoe_def.description = S("Red Matter Hammer").."\n"..S("Single node mode") -hoe_def.wield_image = "exchangeclone_red_matter_hoe.png" -hoe_def.inventory_image = "exchangeclone_red_matter_hoe.png" -hoe_def.groups = { tool=1, hoe=1, enchantability=0, red_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1} -hoe_def.tool_capabilities = { - full_punch_interval = 0.25, - damage_groups = { fleshy = 8, }, - groupcaps={ - exchangeclone_dirt = {times={[1]=0.15, [2]=0.15, [3]=0.15}, uses=0, maxlevel=4}, +minetest.register_tool("exchangeclone:red_matter_hoe", { + description = S("Red Matter Hammer").."\n"..S("Single node mode"), + wield_image = "exchangeclone_red_matter_hoe.png", + inventory_image = "exchangeclone_red_matter_hoe.png", + wield_scale = exchangeclone.wield_scale, + on_place = hoe_on_place, + on_secondary_use = hoe_on_place, + groups = { tool=1, hoe=1, enchantability=0, red_matter_hoe = 1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, + tool_capabilities = { + full_punch_interval = 0.25, + damage_groups = { fleshy = 1, }, + groupcaps={ + exchangeclone_dirt = {times={[1]=0.25, [2]=0.25, [3]=0.25}, uses=0, maxlevel=4}, + }, }, -} -hoe_def._mcl_diggroups = { - exchangeclone_dirt = { speed = 13, level = 8, uses = 0 }, - hoey = { speed = 13, level = 8, uses = 0 } -} + _mcl_toollike_wield = true, + _mcl_diggroups = { + exchangeclone_dirt = { speed = 16, level = 8, uses = 0 }, + hoey = { speed = 16, level = 8, uses = 0 } + }, +}) -minetest.register_tool("exchangeclone:red_matter_hoe", table.copy(hoe_def)) - -hoe_3x3_def = table.copy(hoe_def) -hoe_3x3_def.description = S("Red Matter Hammer").."\n"..S("3x3 mode") -hoe_3x3_def.groups.not_in_creative_inventory = 1 -hoe_3x3_def.tool_capabilities.groupcaps.exchangeclone_dirt.times = {[1]=0.25, [2]=0.25, [3]=0.25} -hoe_3x3_def._mcl_diggroups.exchangeclone_dirt = { speed = 9, level = 8, uses = 0 } - -minetest.register_tool("exchangeclone:red_matter_hoe_3x3", table.copy(hoe_3x3_def)) - -exchangeclone.register_alias("exchangeclone:red_matter_hoe", "exchangeclone:red_matter_hoe_3x3") +exchangeclone.register_multidig_tool("exchangeclone:red_matter_hoe", {"group:exchangeclone_dirt"}) +minetest.register_alias("exchangeclone:red_matter_hoe_3x3", "exchangeclone:red_matter_hoe") +exchangeclone.set_charge_type("exchangeclone:red_matter_hoe", "red_matter") minetest.register_craft({ output = "exchangeclone:dark_matter_hoe", diff --git a/exchangeclone/pickaxes.lua b/exchangeclone/pickaxes.lua index d0ce04c..e0fd9fa 100644 --- a/exchangeclone/pickaxes.lua +++ b/exchangeclone/pickaxes.lua @@ -77,7 +77,7 @@ local function pickaxe_on_use(itemstack, player, pointed_thing) exchangeclone.start_cooldown(player, "pickaxe", 0.5) elseif itemstack:get_name():find("red_") then local player_energy = exchangeclone.get_player_energy(player) - minetest.log(dump(torch_on_place(ItemStack(torch_itemstring), player, pointed_thing))) + minetest.log(dump(torch_on_place(ItemStack(torch_itemstring), player, pointed_thing):get_name())) exchangeclone.set_player_energy(player, player_energy - math.max(exchangeclone.get_item_energy(torch_itemstring) or 0, 8)) -- If the torch could not be placed, it still costs energy... not sure how to fix that end diff --git a/exchangeclone/red_matter_multitools.lua b/exchangeclone/red_matter_multitools.lua index df6d1f1..7d593b7 100644 --- a/exchangeclone/red_matter_multitools.lua +++ b/exchangeclone/red_matter_multitools.lua @@ -86,13 +86,13 @@ local katar_def = { sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { - exchangeclone_dirt = { speed = 10, level = 8, uses = 0 }, - shearsy = { speed = 10, level = 3, uses = 0 }, - shearsy_wool = { speed = 16, level = 3, uses = 0 }, - shearsy_cobweb = { speed = 36, level = 3, uses = 0 }, - hoey = { speed = 9, level = 8, uses = 0 }, - swordy = { speed = 20, level = 8, uses = 0 }, - axey = { speed = 20, level = 8, uses = 0 } + exchangeclone_dirt = { speed = 64, level = 8, uses = 0 }, + shearsy = { speed = 64, level = 3, uses = 0 }, + shearsy_wool = { speed = 64, level = 3, uses = 0 }, + shearsy_cobweb = { speed = 64, level = 3, uses = 0 }, + hoey = { speed = 64, level = 8, uses = 0 }, + swordy = { speed = 64, level = 8, uses = 0 }, + axey = { speed = 64, level = 8, uses = 0 } }, } @@ -248,9 +248,9 @@ local morningstar_def = { sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { - pickaxey = {speed = 80, level = 7, uses = 0}, - shovely = {speed = 22, level = 7, uses = 0}, - axey = { speed = 22, level = 7, uses = 0 } + pickaxey = {speed = 64, level = 7, uses = 0}, + shovely = {speed = 64, level = 7, uses = 0}, + axey = { speed = 64, level = 7, uses = 0 }, }, } diff --git a/exchangeclone/shears.lua b/exchangeclone/shears.lua index 6e95b96..2d531d6 100644 --- a/exchangeclone/shears.lua +++ b/exchangeclone/shears.lua @@ -1,40 +1,35 @@ --- TODO: Before releasing, check the shears. Just do it. --- I know you don't want to... but test EVERY SINGLE FUNCTION. --- MineClonia probably broke them. +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 -exchangeclone.shear_action = { - start_action = function(player, center, range, itemstack) - if exchangeclone.check_cooldown(player, "shears") then return end - local data = {} - exchangeclone.play_ability_sound(player) - data.itemstack = itemstack - data.remove_positions = {} - return data - end, - action = function(player, pos, node, data) - local node_def = minetest.registered_items[ItemStack(node.name):get_name()] - if not node_def then return data end - if (node_def.groups.shearsy or node_def.groups.shearsy_cobweb) and node.name ~= "mcl_flowers:double_grass_top" then + local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) + exchangeclone.play_ability_sound(player) + 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, data.itemstack:get_name()) + 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="sand"}) - else - table.insert(data.remove_positions, pos) + nodes[i] = nil end end end - return data - end, - end_action = function(player, center, range, data) - exchangeclone.remove_nodes(data.remove_positions) - exchangeclone.start_cooldown(player, "shears", (range+1)/7) 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 @@ -44,11 +39,7 @@ local shears_rightclick = function(itemstack, player, pointed_thing) end if player:get_player_control().aux1 then - if itemstack:get_name():find("dark") then - return exchangeclone.charge_update(itemstack, player, 3) - else - return exchangeclone.charge_update(itemstack, player, 4) - end + return exchangeclone.charge_update(itemstack, player) end if (pointed_thing.type == "node") and pointed_thing.above and not player:get_player_control().sneak then @@ -62,13 +53,14 @@ local shears_rightclick = function(itemstack, player, pointed_thing) end end - local center = player:get_pos() - - if (pointed_thing.type == "node") and pointed_thing.under then - center = pointed_thing.under + if pointed_thing.type == "node" then + local node = minetest.get_node(pointed_thing.under) + if minetest.get_item_group(node.name, "shearsy") > 0 + or minetest.get_item_group(node.name, "shearsy_cobweb") > 0 + or minetest.get_item_group(node.name, "leaves") > 0 then + exchangeclone.shear_action(itemstack, player, pointed_thing.under) + end end - local range = tonumber(itemstack:get_meta():get_int("exchangeclone_tool_charge")) - exchangeclone.node_radius_action(player, center, range, exchangeclone.shear_action, itemstack) return itemstack end @@ -79,18 +71,18 @@ minetest.register_tool("exchangeclone:dark_matter_shears", { 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.4, + full_punch_interval = 0.25, max_drop_level=1, - damage_groups = { fleshy = 2, }, + 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 = 5, level = 2, uses = 0 }, - shearsy_wool = { speed = 10, level = 2, uses = 0 }, - shearsy_cobweb = { speed = 30, level = 2, uses = 0 } + shearsy = { speed = 14, level = 2, uses = 0 }, + shearsy_wool = { speed = 14, level = 2, uses = 0 }, + shearsy_cobweb = { speed = 14, level = 2, uses = 0 } }, }) @@ -101,18 +93,18 @@ minetest.register_tool("exchangeclone:red_matter_shears", { 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.3, + full_punch_interval = 0.25, max_drop_level=1, - damage_groups = { fleshy = 4, }, + 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 = 8, level = 3, uses = 0 }, - shearsy_wool = { speed = 14, level = 3, uses = 0 }, - shearsy_cobweb = { speed = 34, level = 3, uses = 0 } + shearsy = { speed = 16, level = 3, uses = 0 }, + shearsy_wool = { speed = 16, level = 3, uses = 0 }, + shearsy_cobweb = { speed = 16, level = 3, uses = 0 } }, }) diff --git a/exchangeclone/shovels.lua b/exchangeclone/shovels.lua index 05e3a89..c91a9e4 100644 --- a/exchangeclone/shovels.lua +++ b/exchangeclone/shovels.lua @@ -1,27 +1,38 @@ function exchangeclone.shovel_action(itemstack, player, center) if not (itemstack and player and center) then return end if exchangeclone.check_cooldown(player, "shovel") then return end - local charge = itemstack:get_meta():get_int("exchangeclone_tool_charge") or 0 + local charge = math.max(itemstack:get_meta():get_int("exchangeclone_tool_charge"), 1) local start_node = minetest.get_node(center) local action if exchangeclone.mcl then if minetest.registered_items[start_node.name]._on_shovel_place or minetest.get_item_group(start_node.name, "path_creation_possible") == 1 then if minetest.get_node(vector.offset(center,0,1,0)).name == "air" then - action = "path" + if (not player:get_player_control().sneak or charge == 1) then + action = "path" + end end end end if action ~= "path" then - if exchangeclone.mcl2 and start_node.name == "mcl_core:grass_path" then + if exchangeclone.mcl2 and start_node.name == "mcl_core:grass_path" and + (not player:get_player_control().sneak or charge == 1) then action = "unpath" - elseif minetest.get_item_group(start_node.name, "exchangeclone_dirt") or start_node.name:find("sand") then - action = "crumbly_flat" - elseif minetest.get_item_group(start_node.name, exchangeclone.mcl and "shovely" or "crumbly") then - action = "crumbly" + elseif start_node.name == exchangeclone.itemstrings.gravel or start_node.name == exchangeclone.itemstrings.clay then + if player:get_player_control().sneak and charge > 1 then + action = "crumbly" + else + return + end + else + if player:get_player_control().sneak and charge > 1 then + action = "crumbly_flat" + else + return + end end end - + local groups_to_search, range_type if action == "path" then groups_to_search = exchangeclone.mcl2 and {"group:path_creation_possible"} or {"group:exchangeclone_dirt"} @@ -29,19 +40,26 @@ function exchangeclone.shovel_action(itemstack, player, center) elseif action == "unpath" then groups_to_search = {"mcl_core:grass_path"} range_type = "flat" - elseif action == "crumbly_flat" then - groups_to_search = {"group:"..(exchangeclone.mcl and "shoveley" or "crumbly")} - range_type = "flat" - else + elseif action == "crumbly" then groups_to_search = {start_node.name} range_type = "large_radius" + else + groups_to_search = {"group:"..(exchangeclone.mcl and "shovely" or "crumbly")} + range_type = "flat" + end + local nodes + if charge > 1 then + local vector1, vector2 = exchangeclone.process_range(player, range_type, charge) + local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) + exchangeclone.play_ability_sound(player) + nodes = minetest.find_nodes_in_area(pos1, pos2, groups_to_search) + else + if action == "path" or action == "unpath" then + nodes = {center} + else + return + end end - local vector1, vector2 = exchangeclone.process_range(player, range_type, charge) - if not (vector1 and vector2) then vector1, vector2 = vector.zero(), vector.zero() end - - local pos1, pos2 = vector.add(center, vector1), vector.add(center, vector2) - exchangeclone.play_ability_sound(player) - local nodes = minetest.find_nodes_in_area(pos1, pos2, groups_to_search) for _, pos in pairs(nodes) do local node = minetest.get_node(pos) if minetest.is_protected(pos, player:get_player_name()) then @@ -49,53 +67,33 @@ function exchangeclone.shovel_action(itemstack, player, center) else if action == "path" then if exchangeclone.mcla then - if minetest.registered_items[node.name]._on_shovel_place then + local on_shovel_place = minetest.registered_items[node.name]._on_shovel_place + if on_shovel_place then + on_shovel_place(itemstack, player, pos) + end + else -- in MCL2, it only searches for pathable nodes + if minetest.get_node(vector.offset(center,0,1,0)).name == "air" then minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true) minetest.swap_node(pos, {name="mcl_core:grass_path"}) end - else - minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true) - minetest.swap_node(pos, {name="mcl_core:grass_path"}) end + elseif action == "unpath" then + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true) + minetest.swap_node(pos, {name="mcl_core:dirt"}) + else + local drops = minetest.get_node_drops(minetest.get_node(pos).name, itemstack) + exchangeclone.drop_items_on_player(pos, drops, player) end - local drops = minetest.get_node_drops(minetest.get_node(pos).name, itemstack) - exchangeclone.drop_items_on_player(pos, drops, player) end end - exchangeclone.remove_nodes(nodes) - exchangeclone.start_cooldown(player, "shovel", charge/2) -end - action = function(player, pos, node, data) - if ((minetest.get_item_group(node.name, "crumbly") > 0) or (minetest.get_item_group(node.name, "shovely") > 0)) then - if minetest.is_protected(pos, player:get_player_name()) then - minetest.record_protection_violation(pos, player:get_player_name()) - else - if data.path then - -- TODO: Fix potential "shovel_on_place" functions that aren't paths in Mineclonia (same with axes) - if minetest.registered_items[node.name]._on_shovel_place or - minetest.get_item_group(node.name, "path_creation_possible") == 1 then - if minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name == "air" then - minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = pos}, true) - minetest.swap_node(pos, {name="mcl_core:grass_path"}) - end - end - else - local drops = minetest.get_node_drops(node.name, data.itemstack:get_name()) - exchangeclone.drop_items_on_player(pos, drops, player) - table.insert(data.remove_positions, pos) - end - end - end - return data - end, - end_action = function(player, center, range, data) - exchangeclone.remove_nodes(data.remove_positions) - if range > 0 or not data.path then - exchangeclone.start_cooldown(player, "shovel", range/4) -- Longish cooldown - end + if action == "crumbly" or action == "crumbly_flat" then + exchangeclone.remove_nodes(nodes) end -} + if charge > 1 then + exchangeclone.start_cooldown(player, "shovel", charge/2) + end +end local function shovel_on_place(itemstack, player, pointed_thing) @@ -105,22 +103,13 @@ local function shovel_on_place(itemstack, player, pointed_thing) end if player:get_player_control().aux1 then - if itemstack:get_name():find("dark") then - return exchangeclone.charge_update(itemstack, player, 3) - else - return exchangeclone.charge_update(itemstack, player, 4) - end + return exchangeclone.charge_update(itemstack, player) end - local range = itemstack:get_meta():get_int("exchangeclone_tool_charge") - - local center = player:get_pos() if pointed_thing.type == "node" then - center = pointed_thing.under + exchangeclone.shovel_action(itemstack, player, pointed_thing.under) end - exchangeclone.node_radius_action(player, center, range, exchangeclone.shovel_action, itemstack) - return itemstack end @@ -132,9 +121,9 @@ minetest.register_tool("exchangeclone:dark_matter_shovel", { wield_scale = exchangeclone.wield_scale, tool_capabilities = { -- 1/1.2 - full_punch_interval = 0.5, + full_punch_interval = 1, max_drop_level=6, - damage_groups = {fleshy=7}, + damage_groups = {fleshy=6}, punch_attack_uses = 0, groupcaps={ crumbly = {times={[1]=0.9, [2]=0.45, [3]=0.225}, uses=0, maxlevel=4}, @@ -145,10 +134,12 @@ minetest.register_tool("exchangeclone:dark_matter_shovel", { on_secondary_use = shovel_on_place, _mcl_toollike_wield = true, _mcl_diggroups = { - shovely = { speed = 16, level = 5, uses = 0 } + shovely = { speed = 14, level = 5, uses = 0 } }, }) +exchangeclone.set_charge_type("exchangeclone:dark_matter_shovel", "dark_matter") + minetest.register_tool("exchangeclone:red_matter_shovel", { description = "Red Matter Shovel", wield_image = "exchangeclone_red_matter_shovel.png", @@ -157,9 +148,9 @@ minetest.register_tool("exchangeclone:red_matter_shovel", { wield_scale = exchangeclone.wield_scale, tool_capabilities = { -- 1/1.2 - full_punch_interval = 0.5, + full_punch_interval = 1, max_drop_level=7, - damage_groups = {fleshy=9}, + damage_groups = {fleshy=7}, punch_attack_uses = 0, groupcaps={ crumbly = {times={[1]=0.6, [2]=0.25, [3]=0.1}, uses=0, maxlevel=5}, @@ -170,10 +161,12 @@ minetest.register_tool("exchangeclone:red_matter_shovel", { on_secondary_use = shovel_on_place, _mcl_toollike_wield = true, _mcl_diggroups = { - shovely = { speed = 19, level = 6, uses = 0 } + shovely = { speed = 16, level = 6, uses = 0 } }, }) +exchangeclone.set_charge_type("exchangeclone:red_matter_shovel", "red_matter") + --Crafting recipes minetest.register_craft({ diff --git a/exchangeclone/swords.lua b/exchangeclone/swords.lua index fff0669..d885f26 100644 --- a/exchangeclone/swords.lua +++ b/exchangeclone/swords.lua @@ -171,10 +171,9 @@ minetest.register_tool("exchangeclone:dark_matter_sword", { groups = { tool=1, sword=1, dig_speed_class=5, enchantability=0, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1}, wield_scale = exchangeclone.wield_scale, tool_capabilities = { - -- 1/1.2 - full_punch_interval = 0.7, + full_punch_interval = 1/1.6, max_drop_level=6, - damage_groups = {fleshy=15}, + damage_groups = {fleshy=13}, punch_attack_uses = 0, groupcaps={ snappy = {times={[1]=0.95, [2]=0.45, [3]=0.15}, uses=0, maxlevel=4}, @@ -185,7 +184,7 @@ minetest.register_tool("exchangeclone:dark_matter_sword", { sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { - swordy = { speed = 16, level = 5, uses = 0 } + swordy = { speed = 14, level = 5, uses = 0 } }, }) @@ -197,9 +196,9 @@ minetest.register_tool("exchangeclone:red_matter_sword", { wield_scale = exchangeclone.wield_scale, tool_capabilities = { -- 1/1.2 - full_punch_interval = 0.7, + full_punch_interval = 1/1.6, max_drop_level=7, - damage_groups = {fleshy=20}, + damage_groups = {fleshy=17}, punch_attack_uses = 0, groupcaps={ snappy = {times={[1]=0.6, [2]=0.25, [3]=0.1}, uses=0, maxlevel=5}, @@ -210,7 +209,7 @@ minetest.register_tool("exchangeclone:red_matter_sword", { sound = { breaks = "default_tool_breaks" }, _mcl_toollike_wield = true, _mcl_diggroups = { - swordy = { speed = 20, level = 6, uses = 0 } + swordy = { speed = 16, level = 6, uses = 0 } }, }) diff --git a/exchangeclone/transmutation_table.lua b/exchangeclone/transmutation_table.lua index 1a23338..3e1ceee 100644 --- a/exchangeclone/transmutation_table.lua +++ b/exchangeclone/transmutation_table.lua @@ -360,7 +360,7 @@ minetest.register_node("exchangeclone:transmutation_table", { description = "Transmutation Table", paramtype2 = "wallmounted", tiles = {"exchangeclone_transmutation_table.png", "exchangeclone_transmutation_table.png", "exchangeclone_transmutation_table_side.png"}, - groups = {oddly_breakable_by_hand = 3, handy = 1}, + groups = {cracky = 3, pickaxey = 1, handy = 1, oddly_breakable_by_hand = 1}, drawtype = "nodebox", node_box = { type = "fixed", @@ -370,7 +370,7 @@ minetest.register_node("exchangeclone:transmutation_table", { on_rightclick = function(pos, node, player, itemstack, pointed_thing) exchangeclone.show_transmutation_table_formspec(player) end, - _mcl_hardness = 0.6, + _mcl_hardness = 10, _mcl_blast_resistance = 6, }) diff --git a/zzzz_exchangeclone_init/init.lua b/zzzz_exchangeclone_init/init.lua index 9fb66ab..c825287 100644 --- a/zzzz_exchangeclone_init/init.lua +++ b/zzzz_exchangeclone_init/init.lua @@ -1,3 +1,6 @@ +-- The z's at the beginning of this mod's name (zzzz_exchangeclone_init) are to ensure that it +-- loads first, since Minetest loads mods in reverse alphabetical order. + exchangeclone = {recipes = {}, base_energy_values = {}, group_values = {}} if (not minetest.get_modpath("mcl_core")) and (not minetest.get_modpath("default")) then diff --git a/zzzz_exchangeclone_init/lib.lua b/zzzz_exchangeclone_init/lib.lua index dc90536..22fc9eb 100644 --- a/zzzz_exchangeclone_init/lib.lua +++ b/zzzz_exchangeclone_init/lib.lua @@ -322,33 +322,35 @@ end function exchangeclone.charge_update(itemstack, player) itemstack = ItemStack(itemstack) -- don't affect original local charge_type = exchangeclone.charge_types[itemstack:get_name()] - local max_level = exchangeclone.tool_levels.count[charge_type] - if not max_level then return itemstack end - local level = itemstack:get_meta():get_int("exchangeclone_tool_charge") or 1 + local max_charge = exchangeclone.tool_levels.count[charge_type] + if not max_charge then return itemstack end + local charge = itemstack:get_meta():get_int("exchangeclone_tool_charge") or 1 if player:get_player_control().sneak then - if level > 1 then - level = level - 1 - end - elseif level < max_level then - level = level + 1 + charge = math.max(1, charge - 1) + else + charge = math.min(max_charge, charge + 1) end - itemstack:get_meta():set_int("exchangeclone_tool_charge", level) - itemstack:set_wear(math.max(1, math.min(65535, 65535-(65535/(max_level-1))*(level-1)))) + minetest.log(charge) + itemstack:get_meta():set_int("exchangeclone_tool_charge", charge) + itemstack:set_wear(math.max(1, math.min(65535, 65535-(65535/(max_charge-1))*(charge-1)))) itemstack = exchangeclone.update_tool_capabilities(itemstack) return itemstack end -- Itemstrings for various items used in crafting recipes. exchangeclone.itemstrings = { - cobble = (exchangeclone.mcl and "mcl_core:cobble") or "default:cobble", - redstoneworth = (exchangeclone.mcl and "mesecons:redstone") or "default:obsidian", - glowstoneworth = (exchangeclone.mcl and "mcl_nether:glowstone_dust") or "default:tin_ingot", - coal = (exchangeclone.mcl and "mcl_core:coal_lump") or "default:coal_lump", - iron = (exchangeclone.mcl and "mcl_core:iron_ingot") or "default:steel_ingot", - copper = (exchangeclone.mcl and "mcl_copper:copper_ingot") or "default:copper_ingot", - gold = (exchangeclone.mcl and "mcl_core:gold_ingot") or "default:gold_ingot", - emeraldworth = (exchangeclone.mcl and "mcl_core:emerald") or "default:mese_crystal", - diamond = (exchangeclone.mcl and "mcl_core:diamond") or "default:diamond", + cobble = exchangeclone.mcl and "mcl_core:cobble" or "default:cobble", + redstoneworth = exchangeclone.mcl and "mesecons:redstone" or "default:obsidian", + glowstoneworth = exchangeclone.mcl and "mcl_nether:glowstone_dust" or "default:tin_ingot", + coal = exchangeclone.mcl and "mcl_core:coal_lump" or "default:coal_lump", + iron = exchangeclone.mcl and "mcl_core:iron_ingot" or "default:steel_ingot", + copper = exchangeclone.mcl and "mcl_copper:copper_ingot" or "default:copper_ingot", + gold = exchangeclone.mcl and "mcl_core:gold_ingot" or "default:gold_ingot", + emeraldworth = exchangeclone.mcl and "mcl_core:emerald" or "default:mese_crystal", + diamond = exchangeclone.mcl and "mcl_core:diamond" or "default:diamond", + gravel = exchangeclone.mcl and "mcl_core:gravel" or "default:gravel", + dirt = exchangeclone.mcl and "mcl_core:dirt" or "default:dirt", + clay = exchangeclone.mcl and "mcl_core:clay" or "default:clay", } exchangeclone.energy_aliases = {} @@ -585,6 +587,7 @@ end) -- Start a