Most tools updated, updated hardness

This commit is contained in:
ThePython 2024-01-26 08:52:38 -08:00
parent 4da9118ce1
commit c639113d6d
13 changed files with 306 additions and 312 deletions

View File

@ -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 = {

View File

@ -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 = {

View File

@ -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({

View File

@ -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", {

View File

@ -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",

View File

@ -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

View File

@ -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 },
},
}

View File

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

View File

@ -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({

View File

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

View File

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

View File

@ -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

View File

@ -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 <time>-second cooldown called <name> for <player>
function exchangeclone.start_cooldown(player, name, time)
if not (player and name and time and (time > 0)) then return end
local player_name = player:get_player_name()
exchangeclone.cooldowns[player_name][name] = time
minetest.after(time, function()
@ -701,11 +704,11 @@ exchangeclone.neighbors = {
function exchangeclone.check_nearby_falling(pos)
for i = 1, 6 do
local pos = vector.add(pos, exchangeclone.neighbors[i])
local new_pos = vector.add(pos, exchangeclone.neighbors[i])
if exchangeclone.mcl then
local node = minetest.get_node(pos)
local node = minetest.get_node(new_pos)
if node.name == "mcl_core:vine" then
mcl_core.check_vines_supported(pos, node)
mcl_core.check_vines_supported(new_pos, node)
end
end
end
@ -715,7 +718,9 @@ end
function exchangeclone.remove_nodes(positions)
minetest.bulk_set_node(positions, {name = "air"})
for _, pos in pairs(positions) do
exchangeclone.check_nearby_falling(pos)
if pos then
exchangeclone.check_nearby_falling(pos)
end
end
end
@ -922,7 +927,6 @@ end
function exchangeclone.multidig(pos, node, player, mode, nodes)
if not player then return end
minetest.log(dump(mode))
local player_rotation = exchangeclone.get_face_direction(player)
if mode == "3x3" then
@ -959,7 +963,7 @@ function exchangeclone.multidig(pos, node, player, mode, nodes)
else
dir = "x"
end
local added_vector = vector.zero
local added_vector = vector.zero()
added_vector[dir] = player_rotation[dir]*2
local pos2 = vector.add(pos, added_vector)
local found_nodes = minetest.find_nodes_in_area(pos, pos2, nodes)
@ -985,8 +989,11 @@ function exchangeclone.multidig(pos, node, player, mode, nodes)
dir = "x"
end
end
local pos1 = vector.add(pos, {[dir]=-1})
local pos2 = vector.add(pos, {[dir]=1})
local vector1, vector2 = vector.zero(), vector.zero()
vector1[dir] = -1
vector2[dir] = 1
local pos1 = vector.add(pos, vector1)
local pos2 = vector.add(pos, vector2)
local found_nodes = minetest.find_nodes_in_area(pos1, pos2, nodes)
for _, node_pos in pairs(found_nodes) do
minetest.node_dig(node_pos, minetest.get_node(node_pos), player)
@ -1014,7 +1021,7 @@ minetest.register_on_joinplayer(function(player)
end)
exchangeclone.tool_levels = {
count = {dark_matter = 2, red_matter = 3, red_multi = 4, phil = 4},
count = {dark_matter = 3, red_matter = 4, red_multi = 5, phil = 5},
efficiency = {
dark_matter = {nil, 3, 5},
red_matter = {nil, 3.5, 5, 7},
@ -1025,11 +1032,13 @@ exchangeclone.tool_levels = {
type = "front",
ranges = {
-- horizontal, vertical, depth (relative to look direction)
-- horizontal/vertical are radii (1,1 = 3x3, 2,2 = 5,5)
-- depth does NOT include starting position (1,1,1 mines 3x3x2 area)
nil,
{3,3,2},
{5,5,3},
{7,7,4},
{9,9,5}
{1,1,1},
{2,2,2},
{3,3,3},
{4,4,4}
}
},
flat = {
@ -1081,7 +1090,6 @@ function exchangeclone.get_groupcaps(item, efficiency)
item = ItemStack(item)
if exchangeclone.mcl then
local thingy = mcl_autogroup.get_groupcaps(item:get_name(), efficiency)
minetest.log(dump(thingy))
return thingy
else
local groupcaps = table.copy(minetest.registered_items[item:get_name()].tool_capabilities.groupcaps)
@ -1104,7 +1112,6 @@ function exchangeclone.update_tool_capabilities(itemstack)
local tool_capabilities = table.copy(minetest.registered_items[itemstack:get_name()].tool_capabilities)
tool_capabilities.groupcaps = exchangeclone.get_groupcaps(itemstack, efficiency)
meta:set_tool_capabilities(tool_capabilities)
minetest.log(dump(charge_level, efficiency))
return itemstack
end
@ -1142,7 +1149,7 @@ function exchangeclone.process_range(player, range, charge)
}, {
[horizontal] = -range_amounts[1],
[vertical] = -range_amounts[2],
[depth] = range_amounts[3]
[depth] = player_rotation[depth]*range_amounts[3]
}
end
end