Compare commits
4 Commits
e04c335002
...
3fdee1ef9a
Author | SHA1 | Date |
---|---|---|
ThePython | 3fdee1ef9a | |
ThePython | dc58aceab1 | |
ThePython | 58d978d053 | |
ThePython10110 | c70c1daca0 |
16
README.md
16
README.md
|
@ -66,9 +66,11 @@ Dependencies: Minetest Game or MineClone.
|
|||
|
||||
|
||||
### PLANS/TODO FOR v7.0 (see dev branch for current progress)
|
||||
* #### FINISH MULTIDIG
|
||||
* Achievements/advancements/awards
|
||||
* Improvements to tools
|
||||
* Wear bar for charge level
|
||||
* Charge levels match ProjectE (both in number and in range)
|
||||
* Charge level affects speed
|
||||
* Correct/accurate speeds compared to ProjectE (hopefully)
|
||||
* Wear bar on Exchange Orbs for energy
|
||||
|
@ -82,12 +84,24 @@ Dependencies: Minetest Game or MineClone.
|
|||
* Talisman of Repair (will only work in player inventory, not Alchemical Chests like ProjectE)
|
||||
* Gem of Eternal Density (will only work in player inventory, not Alchemical Chests like ProjectE)
|
||||
* Remove deprecated PESA item (add alias to some existing item with 64 energy)
|
||||
* Edit wiki:
|
||||
* Add pages for:
|
||||
* Achievements?
|
||||
* Divining rods
|
||||
* Swiftwolf's Rending Gale
|
||||
* Talisman of Repair
|
||||
* Gem of Eternal Density
|
||||
* Mind, Life, Body, and Soul Stones
|
||||
* Modify tools page
|
||||
* Remove page for PESA
|
||||
|
||||
## Changelog
|
||||
<details><summary>Look at this fancy expanding changelog</summary>
|
||||
|
||||
### v7.0
|
||||
* Nothing yet. See the to-do list above for my plans.
|
||||
* Changes:
|
||||
* I'm now using a free AI tool called Codeium, which seems to work well. This obviously isn't a change to the mod, but it makes it easier to do certain things.
|
||||
* The pickaxe vein mining ability is now more efficient, only checking each position once.
|
||||
|
||||
### v6.6
|
||||
* Removed energy value for Ancient Debris (since it could be smelted in a DM/RM Furnace to get 2 Netherite Scrap)
|
||||
|
|
|
@ -1,22 +1,16 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
local stone_group = "cracky"
|
||||
if exchangeclone.mcl then
|
||||
stone_group = "pickaxey"
|
||||
end
|
||||
|
||||
exchangeclone.hammer_action = {
|
||||
start_action = function(player, center, range, itemstack)
|
||||
if exchangeclone.check_cooldown(player, "hammer") then return end
|
||||
local data = {}
|
||||
exchangeclone.multidig[player:get_player_name()] = true -- to prevent doing 3x3 as well as AOE
|
||||
exchangeclone.play_ability_sound(player)
|
||||
data.itemstack = itemstack
|
||||
data.remove_positions = {}
|
||||
return data
|
||||
end,
|
||||
action = function(player, pos, node, data)
|
||||
if minetest.get_item_group(node.name, stone_group) ~= 0 then
|
||||
if minetest.get_item_group(node.name, exchangeclone.stone_group) ~= 0 then
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
minetest.record_protection_violation(pos, player:get_player_name())
|
||||
else
|
||||
|
@ -29,8 +23,7 @@ exchangeclone.hammer_action = {
|
|||
end,
|
||||
end_action = function(player, center, range, data)
|
||||
exchangeclone.remove_nodes(data.remove_positions)
|
||||
exchangeclone.multidig[player:get_player_name()] = nil
|
||||
exchangeclone.start_cooldown(player, "hammer", range/2) -- The hammer has by far the most lag potential and therefore a long cooldown.
|
||||
exchangeclone.start_cooldown(player, "hammer", range/2) -- The hammer has by far the most lag potential and therefore a longer cooldown.
|
||||
end
|
||||
}
|
||||
|
||||
|
@ -49,12 +42,15 @@ local function hammer_on_place(itemstack, player, pointed_thing)
|
|||
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")
|
||||
exchangeclone.update_tool_capabilities(itemstack)
|
||||
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")
|
||||
exchangeclone.update_tool_capabilities(itemstack)
|
||||
minetest.chat_send_player(player:get_player_name(), S("3x3 mode"))
|
||||
end
|
||||
return itemstack
|
||||
|
@ -84,13 +80,14 @@ minetest.register_tool("exchangeclone:dark_matter_hammer", {
|
|||
cracky = {times={[1]=1.5, [2]=0.75, [3]=0.325}, uses=0, maxlevel=4},
|
||||
},
|
||||
},
|
||||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 16, level = 5, uses = 0 }
|
||||
},
|
||||
on_place = hammer_on_place,
|
||||
on_secondary_use = hammer_on_place,
|
||||
exchangeclone_multidig_mode = "1x1",
|
||||
on_dig = exchangeclone.multi_on_dig(exchangeclone.stone_group)
|
||||
})
|
||||
|
||||
minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
|
||||
|
@ -109,7 +106,6 @@ minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
|
|||
cracky = {times={[1]=1.8, [2]=0.9, [3]=0.5}, uses=0, maxlevel=4},
|
||||
},
|
||||
},
|
||||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 12, level = 5, uses = 0 }
|
||||
|
@ -118,7 +114,7 @@ minetest.register_tool("exchangeclone:dark_matter_hammer_3x3", {
|
|||
on_secondary_use = hammer_on_place,
|
||||
})
|
||||
|
||||
exchangeclone.register_alias("exchangeclone:dark_matter_hammer", "exchangeclone:dark_matter_hammer_3x3")
|
||||
minetest.register_alias("exchangeclone:dark_matter_hammer", "exchangeclone:dark_matter_hammer_3x3")
|
||||
|
||||
minetest.register_tool("exchangeclone:red_matter_hammer", {
|
||||
description = S("Red Matter Hammer").."\n"..S("Single node mode"),
|
||||
|
@ -136,7 +132,6 @@ minetest.register_tool("exchangeclone:red_matter_hammer", {
|
|||
cracky = {times={[1]=1, [2]=0.5, [3]=0.2}, uses=0, maxlevel=5},
|
||||
},
|
||||
},
|
||||
sound = { breaks = "default_tool_breaks" },
|
||||
_mcl_toollike_wield = true,
|
||||
_mcl_diggroups = {
|
||||
pickaxey = { speed = 19, level = 6, uses = 0 }
|
||||
|
|
|
@ -120,7 +120,6 @@ if exchangeclone.mcl then
|
|||
dofile(modpath.."/shears.lua")
|
||||
dofile(modpath.."/tool_upgrades.lua")
|
||||
end
|
||||
dofile(modpath.."/multidig.lua")
|
||||
dofile(modpath.."/swords.lua")
|
||||
dofile(modpath.."/axes.lua")
|
||||
dofile(modpath.."/hoes.lua")
|
||||
|
|
|
@ -1,140 +0,0 @@
|
|||
exchangeclone.multidig = {}
|
||||
|
||||
local stone_group = exchangeclone.mcl and "pickaxey" or "cracky"
|
||||
|
||||
local dirt_group = exchangeclone.mcl and "shovely" or "crumbly"
|
||||
|
||||
local function dig_if_group(pos, player, groups)
|
||||
local node = minetest.get_node(pos)
|
||||
for _, group in pairs(groups) do
|
||||
if minetest.get_item_group(node.name, group) > 0 then
|
||||
minetest.node_dig(pos, minetest.get_node(pos), player)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local special_dig = {
|
||||
["exchangeclone:dark_matter_pickaxe_3x1"] = {groups={stone_group}, mode="3x1"},
|
||||
["exchangeclone:red_matter_pickaxe_3x1"] = {groups={stone_group}, mode="3x1"},
|
||||
["exchangeclone:dark_matter_hammer_3x3"] = {groups={stone_group}, mode="3x3"},
|
||||
["exchangeclone:red_matter_hammer_3x3"] = {groups={stone_group}, mode="3x3"},
|
||||
["exchangeclone:dark_matter_hoe_3x3"] = {groups={"exchangeclone_dirt"}, mode="3x3"},
|
||||
["exchangeclone:red_matter_hoe_3x3"] = {groups={"exchangeclone_dirt"}, mode="3x3"},
|
||||
["exchangeclone:red_katar_3x3"] = {groups={"exchangeclone_dirt"}, mode="3x3"},
|
||||
["exchangeclone:red_morningstar_3x1"] = {groups={stone_group, dirt_group},mode="3x1"},
|
||||
["exchangeclone:red_morningstar_3x3"] = {groups={stone_group, dirt_group},mode="3x3"},
|
||||
}
|
||||
|
||||
minetest.register_on_dignode(
|
||||
function(pos, oldnode, player)
|
||||
if not player then return end
|
||||
local itemname = player:get_wielded_item():get_name()
|
||||
local dig_data = special_dig[itemname]
|
||||
if not dig_data then return end
|
||||
|
||||
local playername = player:get_player_name()
|
||||
if(playername == "" or exchangeclone.multidig[playername]) then
|
||||
return
|
||||
end
|
||||
exchangeclone.multidig[playername] = true
|
||||
|
||||
local player_rotation = exchangeclone.get_face_direction(player)
|
||||
|
||||
if dig_data.mode == "3x3" then
|
||||
local dir1
|
||||
local dir2
|
||||
|
||||
if player_rotation.y ~= 0 then
|
||||
dir1 = "x"
|
||||
dir2 = "z"
|
||||
elseif player_rotation.x ~= 0 then
|
||||
dir1 = "y"
|
||||
dir2 = "z"
|
||||
elseif player_rotation.z ~= 0 then
|
||||
dir1 = "x"
|
||||
dir2 = "y"
|
||||
end
|
||||
|
||||
--[[
|
||||
123
|
||||
4 5
|
||||
678
|
||||
]]
|
||||
|
||||
pos[dir1] = pos[dir1] - 1 --7
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir2] = pos[dir2] - 1 --6
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir1] = pos[dir1] + 1 --4
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir1] = pos[dir1] + 1 --1
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir2] = pos[dir2] + 1 --2
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir2] = pos[dir2] + 1 --3
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir1] = pos[dir1] - 1 --5
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
pos[dir1] = pos[dir1] - 1 --8
|
||||
dig_if_group(pos, player, dig_data.groups)
|
||||
elseif dig_data.mode == "3x1" then
|
||||
|
||||
|
||||
local current_mode = player:get_wielded_item():get_meta():get_string("exchangeclone_pick_mode")
|
||||
if current_mode == "" or not current_mode then current_mode = "tall" end
|
||||
|
||||
local new_pos = table.copy(pos)
|
||||
|
||||
if current_mode == "long" then
|
||||
if player_rotation.y ~= 0 then
|
||||
new_pos.y = new_pos.y + player_rotation.y
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.y = new_pos.y + player_rotation.y
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
elseif player_rotation.z ~= 0 then
|
||||
new_pos.z = new_pos.z + player_rotation.z
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.z = new_pos.z + player_rotation.z
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
else
|
||||
new_pos.x = new_pos.x + player_rotation.x
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.x = new_pos.x + player_rotation.x
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
end
|
||||
elseif current_mode == "tall" then
|
||||
if player_rotation.y ~= 0 then
|
||||
if player_rotation.x ~= 0 then
|
||||
new_pos.x = pos.x - 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.x = pos.x + 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
else
|
||||
new_pos.z = pos.z - 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.z = pos.z + 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
end
|
||||
else
|
||||
new_pos.y = pos.y - 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.y = pos.y + 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
end
|
||||
elseif current_mode == "wide" then
|
||||
if player_rotation.x ~= 0 then
|
||||
new_pos.z = pos.z - 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.z = pos.z + 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
else
|
||||
new_pos.x = pos.x - 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
new_pos.x = pos.x + 1
|
||||
dig_if_group(new_pos, player, dig_data.groups)
|
||||
end
|
||||
end
|
||||
end
|
||||
exchangeclone.multidig[playername] = nil
|
||||
end
|
||||
)
|
|
@ -1,24 +1,40 @@
|
|||
local S = minetest.get_translator()
|
||||
|
||||
function exchangeclone.mine_vein(player, start_pos, node_name, pos, depth)
|
||||
-- Not the most efficient, but it works.
|
||||
if not player then return end
|
||||
if not start_pos then return end
|
||||
function exchangeclone.mine_vein(player, start_pos, node_name, pos, depth, visited)
|
||||
if not player or not start_pos then
|
||||
return
|
||||
end
|
||||
|
||||
pos = pos or start_pos
|
||||
depth = depth or 0
|
||||
visited = visited or {}
|
||||
|
||||
local pos_str = minetest.pos_to_string(pos)
|
||||
if visited[pos_str] then
|
||||
return
|
||||
end
|
||||
visited[pos_str] = true
|
||||
|
||||
local node = minetest.get_node(pos)
|
||||
if not node_name then node_name = node.name end
|
||||
if not node_name then
|
||||
node_name = node.name
|
||||
end
|
||||
|
||||
if node_name == node.name then
|
||||
exchangeclone.drop_items_on_player(pos, minetest.get_node_drops(node.name, "exchangeclone:red_matter_pickaxe"), player)
|
||||
local drops = minetest.get_node_drops(node.name, "exchangeclone:red_matter_pickaxe")
|
||||
exchangeclone.drop_items_on_player(pos, drops, player)
|
||||
exchangeclone.check_nearby_falling(pos)
|
||||
minetest.set_node(pos, {name = "air"})
|
||||
for x = pos.x-1,pos.x+1 do for y = pos.y-1,pos.y+1 do for z = pos.z-1,pos.z+1 do
|
||||
if depth <= 10 then
|
||||
exchangeclone.mine_vein(player, start_pos, node_name, {x=x,y=y,z=z}, depth+1)
|
||||
|
||||
if depth < 10 then
|
||||
for _, neighbor_pos in ipairs(minetest.find_nodes_in_area(
|
||||
{x = pos.x - 1, y = pos.y - 1, z = pos.z - 1},
|
||||
{x = pos.x + 1, y = pos.y + 1, z = pos.z + 1},
|
||||
node_name)) do
|
||||
exchangeclone.mine_vein(player, start_pos, node_name, neighbor_pos, depth + 1, visited)
|
||||
end
|
||||
end end end
|
||||
end
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
local torch_itemstring = "default:torch"
|
||||
|
@ -81,7 +97,7 @@ local pick_def = {
|
|||
exchangeclone_pick_mode = "1x1",
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=5, enchantability=0, dark_matter_pickaxe=1, disable_repair = 1, fire_immune = 1, exchangeclone_upgradable = 1},
|
||||
wield_scale = exchangeclone.wield_scale,
|
||||
tool_capabilities = {
|
||||
tool_capabilities = (not exchangeclone.mcl) and {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.5,
|
||||
max_drop_level=6,
|
||||
|
|
|
@ -273,9 +273,6 @@ else
|
|||
["farming:seed_cotton"] = 10,
|
||||
["farming:seed_wheat"] = 16,
|
||||
["farming:wheat"] = 24,
|
||||
|
||||
["moreores:mithril_ingot"] = 16384,
|
||||
["moreores:silver_ingot"] = 4000,
|
||||
}) do
|
||||
exchangeclone.base_energy_values[itemstring] = exchangeclone.base_energy_values[itemstring] or energy_value
|
||||
end
|
||||
|
@ -287,6 +284,10 @@ end
|
|||
for itemstring, energy_value in pairs ({
|
||||
["exchangeclone:alchemical_tome"] = 0,
|
||||
|
||||
["moreores:mithril_ingot"] = 16384,
|
||||
["moreores:silver_ingot"] = 4000,
|
||||
["moreores:tin_ingot"] = 320,
|
||||
|
||||
["technic:chromium_ingot"] = 4096,
|
||||
["technic:granite"] = 1,
|
||||
["technic:lead_ingot"] = 256,
|
||||
|
@ -306,4 +307,4 @@ table.insert_all(exchangeclone.group_values, {
|
|||
{"sapling", 32},
|
||||
{"useless", 0},
|
||||
{"exchangeclone_dirt", 1},
|
||||
})
|
||||
})
|
||||
|
|
|
@ -2,12 +2,14 @@ exchangeclone = {recipes = {}, base_energy_values = {}, group_values = {}}
|
|||
|
||||
if (not minetest.get_modpath("mcl_core")) and (not minetest.get_modpath("default")) then
|
||||
error("ExchangeClone requires Minetest Game, MineClone2, or MineClonia (and possibly variant subgames).\nPlease use one of those games.")
|
||||
else
|
||||
exchangeclone.mcl = minetest.get_modpath("mcl_core")
|
||||
end
|
||||
|
||||
exchangeclone.mcla = minetest.get_game_info().id == "mineclonia" -- if exchangeclone.mcla, exchangeclone.mcl is also defined.
|
||||
exchangeclone.mcl2 = minetest.get_game_info().id == "mineclone2"
|
||||
-- Ensure that value is either true or nil
|
||||
if minetest.get_game_info().id == "mineclonia" then exchangeclone.mcla = true end
|
||||
if minetest.get_game_info().id == "mineclone2" then exchangeclone.mcl2 = true end
|
||||
if exchangeclone.mcl2 or exchangeclone.mcla then exchangeclone.mcl = true end
|
||||
if not exchangeclone.mcl then exchangeclone.mtg = true end
|
||||
|
||||
exchangeclone.pipeworks = minetest.get_modpath("pipeworks")
|
||||
exchangeclone.orb_max = minetest.settings:get("exchangeclone.orb_max") or 51200000 -- Max capacity of Klein Star Omega in ProjectE
|
||||
exchangeclone.keep_data = minetest.settings:get_bool("exchangeclone.keep_data", false)
|
||||
|
|
|
@ -735,11 +735,11 @@ exchangeclone.neighbors = {
|
|||
|
||||
function exchangeclone.check_nearby_falling(pos)
|
||||
for i = 1, 6 do
|
||||
local new_pos = vector.add(pos, exchangeclone.neighbors[i])
|
||||
local pos = vector.add(pos, exchangeclone.neighbors[i])
|
||||
if exchangeclone.mcl then
|
||||
local node = minetest.get_node(new_pos)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == "mcl_core:vine" then
|
||||
mcl_core.check_vines_supported(new_pos, node)
|
||||
mcl_core.check_vines_supported(pos, node)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -942,4 +942,161 @@ function exchangeclone.can_dig(pos)
|
|||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
exchangeclone.stone_group = exchangeclone.mcl and "pickaxey" or "cracky"
|
||||
|
||||
exchangeclone.dirt_group = exchangeclone.mcl and "shovely" or "crumbly"
|
||||
|
||||
local function dig_if_group(pos, player, groups)
|
||||
local node = minetest.get_node(pos)
|
||||
for _, group in pairs(groups) do
|
||||
if minetest.get_item_group(node.name, group) > 0 then
|
||||
minetest.node_dig(pos, minetest.get_node(pos), player)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function exchangeclone.multidig(pos, node, player, mode, groups)
|
||||
minetest.log(dump({node, mode, groups}))
|
||||
if not player then return end
|
||||
|
||||
-- Dig center node no matter what
|
||||
minetest.node_dig(pos, minetest.get_node(pos), player)
|
||||
|
||||
local player_rotation = exchangeclone.get_face_direction(player)
|
||||
|
||||
if mode == "1x1" then
|
||||
return
|
||||
elseif mode == "3x3" then
|
||||
local dir1
|
||||
local dir2
|
||||
|
||||
if player_rotation.y ~= 0 then
|
||||
dir1 = "x"
|
||||
dir2 = "z"
|
||||
elseif player_rotation.x ~= 0 then
|
||||
dir1 = "y"
|
||||
dir2 = "z"
|
||||
elseif player_rotation.z ~= 0 then
|
||||
dir1 = "x"
|
||||
dir2 = "y"
|
||||
end
|
||||
|
||||
--[[
|
||||
123
|
||||
4 5
|
||||
678
|
||||
]]
|
||||
|
||||
pos[dir1] = pos[dir1] - 1 --7
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir2] = pos[dir2] - 1 --6
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir1] = pos[dir1] + 1 --4
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir1] = pos[dir1] + 1 --1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir2] = pos[dir2] + 1 --2
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir2] = pos[dir2] + 1 --3
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir1] = pos[dir1] - 1 --5
|
||||
dig_if_group(pos, player, groups)
|
||||
pos[dir1] = pos[dir1] - 1 --8
|
||||
dig_if_group(pos, player, groups)
|
||||
elseif mode == "3x1_long" then
|
||||
if player_rotation.y ~= 0 then
|
||||
pos.y = pos.y + player_rotation.y
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.y = pos.y + player_rotation.y
|
||||
dig_if_group(pos, player, groups)
|
||||
elseif player_rotation.z ~= 0 then
|
||||
pos.z = pos.z + player_rotation.z
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.z = pos.z + player_rotation.z
|
||||
dig_if_group(pos, player, groups)
|
||||
else
|
||||
pos.x = pos.x + player_rotation.x
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.x = pos.x + player_rotation.x
|
||||
dig_if_group(pos, player, groups)
|
||||
end
|
||||
elseif mode == "3x1_tall" then
|
||||
if player_rotation.y ~= 0 then
|
||||
if player_rotation.x ~= 0 then
|
||||
pos.x = pos.x - 1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.x = pos.x + 1
|
||||
dig_if_group(pos, player, groups)
|
||||
else
|
||||
pos.z = pos.z - 1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.z = pos.z + 1
|
||||
dig_if_group(pos, player, groups)
|
||||
end
|
||||
else
|
||||
pos.y = pos.y - 1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.y = pos.y + 1
|
||||
dig_if_group(pos, player, groups)
|
||||
end
|
||||
elseif mode == "3x1_wide" then
|
||||
if player_rotation.x ~= 0 then
|
||||
pos.z = pos.z - 1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.z = pos.z + 1
|
||||
dig_if_group(pos, player, groups)
|
||||
else
|
||||
pos.x = pos.x - 1
|
||||
dig_if_group(pos, player, groups)
|
||||
pos.x = pos.x + 1
|
||||
dig_if_group(pos, player, groups)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function exchangeclone.multi_on_dig(groups)
|
||||
return function(pos, node, player)
|
||||
local item = player:get_wielded_item()
|
||||
local mode = item:get_meta():get_string("exchangeclone_multidig_mode") or "1x1"
|
||||
exchangeclone.multidig(pos, node, player, mode, groups)
|
||||
end
|
||||
end
|
||||
|
||||
-- Given an item and effiency level, return the groupcaps of the item with that efficiency level.
|
||||
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)
|
||||
local adjusted_efficiency = 1 -- TODO finish this
|
||||
if not groupcaps then return end
|
||||
for group, def in groupcaps do
|
||||
for level, time in def.times do
|
||||
def[level] = time -- TODO finish this
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function exchangeclone.update_tool_capabilities(itemstack)
|
||||
local meta = itemstack:get_meta()
|
||||
local mode = meta:get_string("exchangeclone_multidig_mode")
|
||||
local charge_level = meta:get_int("exchangeclone_item_range")
|
||||
local efficiency
|
||||
if mode == "1x1" then
|
||||
efficiency = charge_level
|
||||
elseif mode == "3x3" then
|
||||
efficiency = 0.7*charge_level
|
||||
elseif mode:sub(1,3) == "3x1" then
|
||||
efficiency = 0.8*charge_level
|
||||
end
|
||||
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)
|
||||
end
|
Loading…
Reference in New Issue