From a1cc24f8d3cd128a0117ad95c3fe180aa80a8169 Mon Sep 17 00:00:00 2001 From: Johannes Fritz Date: Wed, 11 Jan 2023 12:31:56 -0600 Subject: [PATCH] Slowing creative digging --- mods/CORE/_mcl_autogroup/init.lua | 12 +-- mods/CORE/mcl_autogroup/API.md | 5 +- mods/ENTITIES/mcl_item_entity/init.lua | 17 ++-- mods/HUD/mcl_inventory/creative.lua | 113 +++++-------------------- mods/HUD/mcl_inventory/init.lua | 34 +------- mods/ITEMS/mcl_tools/init.lua | 44 ---------- mods/PLAYER/mcl_meshhand/init.lua | 80 ++++++++++++----- mods/PLAYER/mcl_skins/mesh_hand.lua | 58 +++++++------ 8 files changed, 133 insertions(+), 230 deletions(-) diff --git a/mods/CORE/_mcl_autogroup/init.lua b/mods/CORE/_mcl_autogroup/init.lua index e04fb2eac..4d8ab35b8 100644 --- a/mods/CORE/_mcl_autogroup/init.lua +++ b/mods/CORE/_mcl_autogroup/init.lua @@ -204,7 +204,7 @@ end -- Checks if the given node would drop its useful drop if dug by a given tool. -- Returns true if it will yield its useful drop, false otherwise. -function mcl_autogroup.can_harvest(nodename, toolname) +function mcl_autogroup.can_harvest(nodename, toolname, player) local ndef = minetest.registered_nodes[nodename] if not ndef then @@ -228,7 +228,9 @@ function mcl_autogroup.can_harvest(nodename, toolname) end -- Check if it can be dug by hand - local tdef = minetest.registered_tools[""] + if not player or not player:is_player() then return false end + local name = player:get_inventory():get_stack("hand", 1):get_name() + local tdef = minetest.registered_items[name] if tdef then for g, gdef in pairs(tdef._mcl_diggroups) do if ndef.groups[g] then @@ -260,7 +262,7 @@ local function get_tool_capabilities(tdef) -- If the damage group and punch interval from hand is not included, -- then the user will not be able to attack with the tool. - local hand_toolcaps = minetest.registered_tools[""].tool_capabilities + local hand_toolcaps = mcl_meshhand.survival_hand_tool_caps return { full_punch_interval = hand_toolcaps.full_punch_interval, damage_groups = hand_toolcaps.damage_groups @@ -280,7 +282,7 @@ end -- would have to add _mcl_autogroup as a dependency which would break the mod -- loading order. function mcl_autogroup.get_groupcaps(toolname, efficiency) - local tdef = minetest.registered_tools[toolname] + local tdef = minetest.registered_items[toolname] local groupcaps = table.copy(get_tool_capabilities(tdef).groupcaps or {}) add_groupcaps(toolname, groupcaps, tdef._mcl_diggroups, efficiency) return groupcaps @@ -350,7 +352,7 @@ local function overwrite() end end - for tname, tdef in pairs(minetest.registered_tools) do + for tname, tdef in pairs(minetest.registered_items) do -- Assign groupcaps for digging the registered digging groups -- depending on the _mcl_diggroups in the tool definition if tdef._mcl_diggroups then diff --git a/mods/CORE/mcl_autogroup/API.md b/mods/CORE/mcl_autogroup/API.md index 79b9770b5..b3a913ab6 100644 --- a/mods/CORE/mcl_autogroup/API.md +++ b/mods/CORE/mcl_autogroup/API.md @@ -1,10 +1,11 @@ # mcl_autogroup This mod emulate digging times from mc. -## mcl_autogroup.can_harvest(nodename, toolname) -Return true if can be dig with . +## mcl_autogroup.can_harvest(nodename, toolname, player) +Return true if can be dig with by . * nodename: string, valid nodename * toolname: (optional) string, valid toolname +* player: (optinal) ObjectRef, valid player ## mcl_autogroup.get_groupcaps(toolname, efficiency) This function is used to calculate diggroups for tools. diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 60cfe9dd9..48a2f34cb 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -252,10 +252,17 @@ function minetest.handle_node_drops(pos, drops, digger) -- NOTE: This function override allows digger to be nil. -- This means there is no digger. This is a special case which allows this function to be called -- by hand. Creative Mode is intentionally ignored in this case. - - if (digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name())) or doTileDrops == false then + if digger and digger:is_player() and minetest.is_creative_enabled(digger:get_player_name()) then + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end return - end + elseif not doTileDrops then return end -- Check if node will yield its useful drop by the digger's tool local dug_node = minetest.get_node(pos) @@ -263,9 +270,9 @@ function minetest.handle_node_drops(pos, drops, digger) local tool if digger then tool = digger:get_wielded_item() - tooldef = minetest.registered_tools[tool:get_name()] + tooldef = minetest.registered_items[tool:get_name()] - if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name()) then + if not mcl_autogroup.can_harvest(dug_node.name, tool:get_name(), digger) then return end end diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a9a1d6dd9..32bb226f0 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -156,6 +156,7 @@ local function set_inv_page(page, player) creative_list = inventory_lists[page] end inv:set_size("main", #creative_list) + players[playername].inv_size = #creative_list inv:set_list("main", creative_list) end @@ -304,37 +305,21 @@ minetest.register_on_joinplayer(function (player) end end) -function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, show, page, filter) - --reset_menu_item_bg() - pagenum = math.floor(pagenum) or 1 - +function mcl_inventory.set_creative_formspec(player) local playername = player:get_player_name() + if not players[playername] then return end - if not inv_size then - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - end + local start_i = players[playername].start_i + local pagenum = start_i / (9*5) + 1 + local name = players[playername].page + local inv_size = players[playername].inv_size + local filter = players[playername].filter local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) - local name = "nix" local main_list local listrings = "listring[detached:creative_"..playername..";main]".. "listring[current_player;main]".. "listring[detached:trash;main]" - if page then - name = page - if players[playername] then - players[playername].page = page - end - end - --bg[name] = "crafting_creative_bg.png" - local inv_bg = "crafting_inventory_creative.png" if name == "inv" then inv_bg = "crafting_inventory_creative_survival.png" @@ -493,9 +478,6 @@ function mcl_inventory.set_creative_formspec(player, start_i, pagenum, inv_size, listrings if name == "nix" then - if filter == nil then - filter = "" - end formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" formspec = formspec .. "field_close_on_enter[search;false]" end @@ -582,16 +564,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if page then players[name].page = page - end - if players[name].page then + else page = players[name].page end - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - if fields.creative_prev then start_i = start_i - 9*5 elseif fields.creative_next then @@ -613,6 +590,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) else inv_size = 0 end + players[name].inv_size = inv_size if start_i >= inv_size then start_i = start_i - 9*5 @@ -622,72 +600,19 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end players[name].start_i = start_i - local filter = "" - if not fields.nix and fields.search and fields.search ~= "" then - filter = fields.search - players[name].filter = filter + if not fields.nix and fields.search then + players[name].filter = fields.search + else + players[name].filter = "" end - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) + mcl_inventory.set_creative_formspec(player) end) -if minetest.is_creative_enabled("") then - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - -- Place infinite nodes, except for shulker boxes - local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return group == 0 or group == nil - end) - - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - for _,item in ipairs(drops) do - minetest.add_item(pos, item) - end - end - local inv = digger:get_inventory() - if inv then - for _,item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) - end - end - end - end - - mcl_inventory.update_inventory_formspec = function(player) - local page - - local name = player:get_player_name() - - if players[name].page then - page = players[name].page - else - page = "nix" - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - local filter = players[name].filter - if filter == nil then - filter = "" - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9*5) + 1, inv_size, false, page, filter) - end -end +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) +end) minetest.register_on_joinplayer(function(player) -- Initialize variables and inventory @@ -700,7 +625,7 @@ minetest.register_on_joinplayer(function(player) end init(player) -- Setup initial creative inventory to the "nix" page. - mcl_inventory.set_creative_formspec(player, 0, 1, nil, false, "nix", "") + mcl_inventory.set_creative_formspec(player) end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 9f54511a0..4ca0f2a73 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -46,14 +46,9 @@ function return_fields(player, name) end end -local function set_inventory(player, armor_change_only) +local function set_inventory(player) if minetest.is_creative_enabled(player:get_player_name()) then - if armor_change_only then - -- Stay on survival inventory plage if only the armor has been changed - mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") - else - mcl_inventory.set_creative_formspec(player, 0, 1) - end + mcl_inventory.set_creative_formspec(player) return end local inv = player:get_inventory() @@ -143,11 +138,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -if not minetest.is_creative_enabled("") then - function mcl_inventory.update_inventory_formspec(player) - set_inventory(player) - end -end +mcl_inventory.update_inventory_formspec = set_inventory -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) @@ -199,24 +190,6 @@ function minetest.is_creative_enabled(name) return false end ---Insta "digging" nodes in gamemode-creative -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if not puncher or not puncher:is_player() then return end - local name = puncher:get_player_name() - if not minetest.is_creative_enabled(name) then return end - if pointed_thing.type ~= "node" then return end - local def = minetest.registered_nodes[node.name] - if def then - minetest.node_dig(pos,node,puncher) - return true - end -end) - ---Don't subtract from inv when placing in gamemode-creative -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end -end) - local function in_table(n,h) for k,v in pairs(h) do if v == n then return true end @@ -238,6 +211,7 @@ function mcl_inventory.player_set_gamemode(p,g) elseif g == "creative" then mcl_experience.remove_hud(p) end + mcl_meshhand.update_player(p) set_inventory(p) end diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 860ea756c..9f8afdc89 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -19,50 +19,6 @@ dig_speed_class group: - 7: Instantaneous ]] --- The hand -local groupcaps, hand_range, hand_groups - -if minetest.is_creative_enabled("") then - -- Instant breaking in creative mode - groupcaps = { creative_breakable = { times = {0}, uses = 0 } } - hand_range = tonumber(minetest.settings:get("mcl_hand_range_creative")) or 10 - hand_groups = { dig_speed_class = 7 } -else - groupcaps = {} - hand_range = tonumber(minetest.settings:get("mcl_hand_range")) or 4.5 - hand_groups = { dig_speed_class = 1 } -end -minetest.register_tool(":", { - type = "none", - _doc_items_longdesc = S("You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.").."\n".. - S("When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.").."\n".. - S("In Creative Mode, the hand is able to break all blocks instantly."), - wield_image = "blank.png", - wield_scale = {x=1.0,y=1.0,z=2.0}, - -- According to Minecraft Wiki, the exact range is 3.975. - -- Minetest seems to only support whole numbers, so we use 4. - range = hand_range, - tool_capabilities = { - full_punch_interval = 0.25, - max_drop_level = 0, - groupcaps = groupcaps, - damage_groups = {fleshy=1}, - }, - groups = hand_groups, - _mcl_diggroups = { - handy = { speed = 1, level = 1, uses = 0 }, - axey = { speed = 1, level = 1, uses = 0 }, - shovely = { speed = 1, level = 1, uses = 0 }, - hoey = { speed = 1, level = 1, uses = 0 }, - pickaxey = { speed = 1, level = 0, uses = 0 }, - swordy = { speed = 1, level = 0, uses = 0 }, - swordy_cobweb = { speed = 1, level = 0, uses = 0 }, - shearsy = { speed = 1, level = 0, uses = 0 }, - shearsy_wool = { speed = 1, level = 0, uses = 0 }, - shearsy_cobweb = { speed = 1, level = 0, uses = 0 }, - } -}) - -- Help texts local pickaxe_longdesc = S("Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.") local axe_longdesc = S("An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.") diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 1cc31f601..db58888c1 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -1,4 +1,5 @@ local mcl_skins_enabled = minetest.global_exists("mcl_skins") +mcl_meshhand = { } ---This is a fake node that should never be placed in the world ---@type node_definition @@ -15,43 +16,76 @@ local node_def = { end, drop = "", on_drop = function(_, _, _) return ItemStack() end, - groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, - range = minetest.registered_items[""].range + groups = { + dig_immediate = 3, + not_in_creative_inventory = 1, + dig_speed_class = 1, + }, + tool_capabilities = { + full_punch_interval = 0.25, + max_drop_level = 0, + groupcaps = { }, + damage_groups = { fleshy = 1 }, + }, + _mcl_diggroups = { + handy = { speed = 1, level = 1, uses = 0 }, + axey = { speed = 1, level = 1, uses = 0 }, + shovely = { speed = 1, level = 1, uses = 0 }, + hoey = { speed = 1, level = 1, uses = 0 }, + pickaxey = { speed = 1, level = 0, uses = 0 }, + swordy = { speed = 1, level = 0, uses = 0 }, + swordy_cobweb = { speed = 1, level = 0, uses = 0 }, + shearsy = { speed = 1, level = 0, uses = 0 }, + shearsy_wool = { speed = 1, level = 0, uses = 0 }, + shearsy_cobweb = { speed = 1, level = 0, uses = 0 }, + }, + range = tonumber(minetest.settings:get("mcl_hand_range")) or 4.5 } +-- This is for _mcl_autogroup to know about the survival hand tool capabilites +mcl_meshhand.survival_hand_tool_caps = node_def.tool_capabilities + +local creative_hand_range = tonumber(minetest.settings:get("mcl_hand_range_creative")) or 10 if mcl_skins_enabled then -- Generate a node for every skin local list = mcl_skins.get_skin_list() for _, skin in pairs(list) do - if skin.slim_arms then - local female = table.copy(node_def) - female._mcl_hand_id = skin.id - female.mesh = "mcl_meshhand_female.b3d" - female.tiles = { skin.texture } - minetest.register_node("mcl_meshhand:" .. skin.id, female) - else - local male = table.copy(node_def) - male._mcl_hand_id = skin.id - male.mesh = "mcl_meshhand.b3d" - male.tiles = { skin.texture } - minetest.register_node("mcl_meshhand:" .. skin.id, male) + local node_def = table.copy(node_def) + node_def._mcl_hand_id = skin.id + node_def.tiles = { skin.texture } + node_def.mesh = skin.slim_arms and "mcl_meshhand_female.b3d" or "mcl_meshhand.b3d" + if skin.creative then + node_def.range = creative_hand_range + node_def.groups.dig_speed_class = 7 + node_def.tool_capabilities.groupcaps.creative_breakable = { times = { 0.1 }, uses = 0 } end + minetest.register_node("mcl_meshhand:" .. skin.id, node_def) end else node_def._mcl_hand_id = "hand" node_def.mesh = "mcl_meshhand.b3d" node_def.tiles = { "character.png" } - minetest.register_node("mcl_meshhand:hand", node_def) + minetest.register_node("mcl_meshhand:hand_surv", node_def) + + node_def = table.copy(node_def) + node_def.range = creative_hand_range + node_def.groups.dig_speed_class = 7 + node_def.tool_capabilities.groupcaps.creative_breakable = { times = { 0.1 }, uses = 0 } + minetest.register_node("mcl_meshhand:hand_crea", node_def) +end + +function mcl_meshhand.update_player(player) + if mcl_skins_enabled then + local node_id = mcl_skins.get_node_id_by_player(player) + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:" .. node_id) + else + local creative = minetest.is_creative_enabled(player:get_player_name()) + player:get_inventory():set_stack("hand", 1, "mcl_meshhand:hand" .. (creative and "_crea" or "_surv")) + end end if mcl_skins_enabled then - -- Change the player's hand to their skin - mcl_player.register_on_visual_change(function(player) - local node_id = mcl_skins.get_node_id_by_player(player) - player:get_inventory():set_stack("hand", 1, "mcl_meshhand:" .. node_id) - end) + mcl_player.register_on_visual_change(mcl_meshhand.update_player) else - minetest.register_on_joinplayer(function(player) - player:get_inventory():set_stack("hand", 1, ItemStack("mcl_meshhand:hand")) - end) + minetest.register_on_joinplayer(mcl_meshhand.update_player) end diff --git a/mods/PLAYER/mcl_skins/mesh_hand.lua b/mods/PLAYER/mcl_skins/mesh_hand.lua index 8bbcff878..e695bface 100644 --- a/mods/PLAYER/mcl_skins/mesh_hand.lua +++ b/mods/PLAYER/mcl_skins/mesh_hand.lua @@ -11,43 +11,47 @@ end function mcl_skins.get_skin_list() local list = {} - for _, base in pairs(mcl_skins.base) do - for _, base_color in pairs(mcl_skins.base_color) do - local id = base:gsub(".png$", "") .. minetest.colorspec_to_colorstring(base_color):gsub("#", "") - local female = { - texture = make_texture(base, base_color), - slim_arms = true, - id = id .. "_female" - } - table.insert(list, female) - - local male = { - texture = make_texture(base, base_color), - slim_arms = false, - id = id .. "_male" - } - table.insert(list, male) + for _, game_mode in pairs({"_crea", "_surv"}) do + for _, base in pairs(mcl_skins.base) do + for _, base_color in pairs(mcl_skins.base_color) do + local id = base:gsub(".png$", "") .. minetest.colorspec_to_colorstring(base_color):gsub("#", "") + local female = { + texture = make_texture(base, base_color), + slim_arms = true, + id = id .. "_female" .. game_mode, + creative = game_mode == "_crea" + } + table.insert(list, female) + + local male = { + texture = make_texture(base, base_color), + slim_arms = false, + id = id .. "_male" .. game_mode, + creative = game_mode == "_crea" + } + table.insert(list, male) + end + end + for _, skin in pairs(mcl_skins.simple_skins) do + table.insert(list, { + texture = skin.texture, + slim_arms = skin.slim_arms, + id = skin.texture:gsub(".png$", "") .. (skin.slim_arms and "_female" or "_male") .. game_mode, + }) end - end - for _, skin in pairs(mcl_skins.simple_skins) do - table.insert(list, { - texture = skin.texture, - slim_arms = skin.slim_arms, - id = skin.texture:gsub(".png$", "") .. "_" .. (skin.slim_arms and "female" or "male"), - }) end return list end function mcl_skins.get_node_id_by_player(player) local skin = mcl_skins.players[player] + local creative = minetest.is_creative_enabled(player:get_player_name()) + local append = (skin.slim_arms and "_female" or "_male") .. (creative and "_crea" or "_surv") if skin.simple_skins_id then local skin = mcl_skins.simple_skins[skin.simple_skins_id] - return skin.texture:gsub(".png$", "") .. - "_" .. (skin.slim_arms and "female" or "male") + return skin.texture:gsub(".png$", "") .. append else return skin.base:gsub(".png$", "") .. - minetest.colorspec_to_colorstring(skin.base_color):gsub("#", "") .. - "_" .. (skin.slim_arms and "female" or "male") + minetest.colorspec_to_colorstring(skin.base_color):gsub("#", "") .. append end end