From 08a8b155d759162d074af6bf485d08d5107a18b5 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Wed, 6 Jan 2021 12:43:09 +0100 Subject: [PATCH] Fix #906 and #902 --- mods/ITEMS/mcl_bows/bow.lua | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 9d09b441..0f65469e 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -131,6 +131,24 @@ S("The speed and damage of the arrow increases the longer you charge. The regula range = 4, -- Trick to disable digging as well on_use = function() return end, + on_place = function(itemstack, player, pointed_thing) + if pointed_thing and pointed_thing.type == "node" then + -- Call on_rightclick if the pointed node defines it + local node = minetest.get_node(pointed_thing.under) + if player and not player:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, player, itemstack) or itemstack + end + end + end + + itemstack:get_meta():set_string("active", "true") + return itemstack + end, + on_secondary_use = function(itemstack) + itemstack:get_meta():set_string("active", "true") + return itemstack + end, groups = {weapon=1,weapon_ranged=1,bow=1,enchantability=1}, _mcl_uses = 385, }) @@ -140,11 +158,15 @@ local reset_bows = function(player) local inv = player:get_inventory() local list = inv:get_list("main") for place, stack in pairs(list) do - if stack:get_name()=="mcl_bows:bow_0" or stack:get_name()=="mcl_bows:bow_1" or stack:get_name()=="mcl_bows:bow_2" then + if stack:get_name() == "mcl_bows:bow" or stack:get_name() == "mcl_bows:bow_enchanted" then + stack:get_meta():set_string("active", "") + elseif stack:get_name()=="mcl_bows:bow_0" or stack:get_name()=="mcl_bows:bow_1" or stack:get_name()=="mcl_bows:bow_2" then stack:set_name("mcl_bows:bow") + stack:get_meta():set_string("active", "") list[place] = stack elseif stack:get_name()=="mcl_bows:bow_0_enchanted" or stack:get_name()=="mcl_bows:bow_1_enchanted" or stack:get_name()=="mcl_bows:bow_2_enchanted" then stack:set_name("mcl_bows:bow_enchanted") + stack:get_meta():set_string("active", "") list[place] = stack end end @@ -177,6 +199,7 @@ for level=0, 2 do on_use = function() return end, on_drop = function(itemstack, dropper, pos) reset_bow_state(dropper) + itemstack:get_meta():set_string("active", "") if mcl_enchanting.is_enchanted(itemstack:get_name()) then itemstack:set_name("mcl_bows:bow_enchanted") else @@ -202,7 +225,7 @@ controls.register_on_release(function(player, key, time) if (wielditem:get_name()=="mcl_bows:bow_0" or wielditem:get_name()=="mcl_bows:bow_1" or wielditem:get_name()=="mcl_bows:bow_2" or wielditem:get_name()=="mcl_bows:bow_0_enchanted" or wielditem:get_name()=="mcl_bows:bow_1_enchanted" or wielditem:get_name()=="mcl_bows:bow_2_enchanted") then local has_shot = false - + local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) local speed, damage local p_load = bow_load[player:get_player_name()] @@ -242,13 +265,13 @@ controls.register_on_release(function(player, key, time) end has_shot = player_shoot_arrow(wielditem, player, speed, damage, is_critical) - + if enchanted then wielditem:set_name("mcl_bows:bow_enchanted") else wielditem:set_name("mcl_bows:bow") end - + if has_shot and not minetest.is_creative_enabled(player:get_player_name()) then local durability = BOW_DURABILITY local unbreaking = mcl_enchanting.get_enchantment(wielditem, "unbreaking") @@ -270,7 +293,7 @@ controls.register_on_hold(function(player, key, time) end local inv = minetest.get_inventory({type="player", name=name}) local wielditem = player:get_wielded_item() - if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and (creative or get_arrow(player)) then + if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and wielditem:get_meta():get("active") and (creative or get_arrow(player)) then local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name()) if enchanted then wielditem:set_name("mcl_bows:bow_0_enchanted")