forked from VoxeLibre/VoxeLibre
Add missing shield features + tweaks & fixes
Features: - Add being able to be damaged by piercing crossbow enchant - Add being disabled for 5 seconds when attacked with axe Tweaks: - Disable guarding when eating Fixes: - Fix not being able to guard when pointing to a node/block - Fix shield guarding movement slowdown sometimes getting stuck on login - Attempt at fixing shield activating when in menu/formspec bug
This commit is contained in:
parent
c31226041f
commit
3b045f624b
|
@ -151,6 +151,10 @@ mcl_damage.register_modifier(function(obj, damage, reason)
|
|||
return
|
||||
end
|
||||
|
||||
if damager and damager:get_luaentity() and damager:get_luaentity()._piercing and damager:get_luaentity()._piercing > 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local durability = 336
|
||||
local unbreaking = mcl_enchanting.get_enchantment(shieldstack, mcl_shields.enchantments[2])
|
||||
if unbreaking > 0 then
|
||||
|
@ -167,6 +171,23 @@ mcl_damage.register_modifier(function(obj, damage, reason)
|
|||
end
|
||||
end
|
||||
minetest.sound_play({name = "mcl_block"}, {pos = obj:get_pos(), max_hear_distance = 16})
|
||||
|
||||
if mcl_shields.is_blocking(obj) and damager and damager:get_wielded_item() and damager:get_wielded_item():get_name() and
|
||||
(damager:get_wielded_item():get_name() == "mcl_tools:axe_wood" or
|
||||
damager:get_wielded_item():get_name() == "mcl_tools:axe_stone" or
|
||||
damager:get_wielded_item():get_name() == "mcl_tools:axe_iron" or
|
||||
damager:get_wielded_item():get_name() == "mcl_tools:axe_gold" or
|
||||
damager:get_wielded_item():get_name() == "mcl_tools:axe_diamond" or
|
||||
damager:get_wielded_item():get_name() == "mcl_tools:axe_netherite") then
|
||||
|
||||
mcl_shields.players[obj].cooldown = 5
|
||||
elseif mcl_shields.is_blocking(obj) and damager and damager:get_luaentity() and damager:get_luaentity().name and
|
||||
(damager:get_luaentity().name == "mobs_mc:vindicator" or
|
||||
damager:get_luaentity().name == "mobs_mc:piglin_brute") then
|
||||
|
||||
mcl_shields.players[obj].cooldown = 5
|
||||
end
|
||||
|
||||
return 0
|
||||
end)
|
||||
|
||||
|
@ -265,11 +286,19 @@ local function handle_blocking(player)
|
|||
|
||||
local pos = player:get_pos()
|
||||
if shield_in_hand then
|
||||
if mcl_shields.players[player].cooldown ~= 0 then
|
||||
player_shield.blocking = 0
|
||||
return
|
||||
end
|
||||
if not_blocking then
|
||||
minetest.after(0.25, function()
|
||||
if (not_blocking or not shield_in_offhand) and shield_in_hand and rmb then
|
||||
rmb = player:get_player_control().RMB
|
||||
if (not_blocking or not shield_in_offhand) and shield_in_hand and rmb and not mcl_hunger.is_eating(player) and mcl_shields.players[player].cooldown == 0 then
|
||||
player_shield.blocking = 2
|
||||
set_shield(player, true, 2)
|
||||
else
|
||||
player_shield.blocking = 0
|
||||
set_shield(player, false, 2)
|
||||
end
|
||||
end)
|
||||
elseif not shield_in_offhand then
|
||||
|
@ -277,7 +306,7 @@ local function handle_blocking(player)
|
|||
end
|
||||
elseif shield_in_offhand then
|
||||
local pointed_thing = mcl_util.get_pointed_thing(player, true)
|
||||
local offhand_can_block = (wielded_item(player) == "" or not pointed_thing)
|
||||
local offhand_can_block = (wielded_item(player) ~= "mcl_shields:shield")
|
||||
and (minetest.get_item_group(wielded_item(player), "bow") ~= 1 and minetest.get_item_group(wielded_item(player), "crossbow") ~= 1)
|
||||
|
||||
if pointed_thing and pointed_thing.type == "node" then
|
||||
|
@ -289,11 +318,19 @@ local function handle_blocking(player)
|
|||
if not offhand_can_block then
|
||||
return
|
||||
end
|
||||
if mcl_shields.players[player].cooldown ~= 0 then
|
||||
player_shield.blocking = 0
|
||||
return
|
||||
end
|
||||
if not_blocking then
|
||||
minetest.after(0.25, function()
|
||||
if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block then
|
||||
rmb = player:get_player_control().RMB
|
||||
if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block and not mcl_hunger.is_eating(player) and mcl_shields.players[player].cooldown == 0 then
|
||||
player_shield.blocking = 1
|
||||
set_shield(player, true, 1)
|
||||
else
|
||||
player_shield.blocking = 0
|
||||
set_shield(player, false, 1)
|
||||
end
|
||||
end)
|
||||
elseif not shield_in_hand then
|
||||
|
@ -391,6 +428,12 @@ end
|
|||
minetest.register_globalstep(function(dtime)
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
|
||||
if mcl_shields.players[player].cooldown > 0 then
|
||||
mcl_shields.players[player].cooldown = mcl_shields.players[player].cooldown - dtime
|
||||
elseif mcl_shields.players[player].cooldown < 0 then
|
||||
mcl_shields.players[player].cooldown = 0
|
||||
end
|
||||
|
||||
handle_blocking(player)
|
||||
|
||||
local blocking, shieldstack = mcl_shields.is_blocking(player)
|
||||
|
@ -518,6 +561,8 @@ minetest.register_on_joinplayer(function(player)
|
|||
mcl_shields.players[player] = {
|
||||
shields = {},
|
||||
blocking = 0,
|
||||
cooldown = 0,
|
||||
}
|
||||
remove_shield_hud(player)
|
||||
playerphysics.remove_physics_factor(player, "speed", "shield_speed")
|
||||
end)
|
||||
|
|
Loading…
Reference in New Issue