Started working on stuff

This commit is contained in:
ThePython 2024-01-22 07:18:52 -08:00
parent e04c335002
commit 58d978d053
7 changed files with 221 additions and 178 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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