update mcl_shields/init.lua

This commit is contained in:
NO11 2022-03-11 10:07:55 +00:00
parent 324e734fcb
commit b89917caa0
1 changed files with 103 additions and 93 deletions

View File

@ -69,7 +69,10 @@ minetest.register_entity("mcl_shields:shield_entity", {
_shield_number = 2, _shield_number = 2,
on_step = function(self, dtime, moveresult) on_step = function(self, dtime, moveresult)
local player = self.object:get_attach() local player = self.object:get_attach()
if player then if not player then
self.object:remove()
return
end
local shield_texture = "mcl_shield_base_nopattern.png" local shield_texture = "mcl_shield_base_nopattern.png"
local i = self._shield_number local i = self._shield_number
local item = wielded_item(player, i) local item = wielded_item(player, i)
@ -87,18 +90,13 @@ minetest.register_entity("mcl_shields:shield_entity", {
if color then if color then
shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")" shield_texture = "mcl_shield_base_nopattern.png^(mcl_shield_pattern_base.png^[colorize:" .. color .. ")"
end end
end end
end end
if shield_is_enchanted(player, i) then if shield_is_enchanted(player, i) then
shield_texture = shield_texture .. overlay shield_texture = shield_texture .. overlay
end end
self.object:set_properties({textures = {shield_texture}}) self.object:set_properties({textures = {shield_texture}})
else
self.object:remove()
end
end, end,
}) })
@ -109,25 +107,34 @@ end
function mcl_shields.is_blocking(obj) function mcl_shields.is_blocking(obj)
if not obj:is_player() then return end if not obj:is_player() then return end
local blocking = mcl_shields.players[obj].blocking local blocking = mcl_shields.players[obj].blocking
if blocking > 0 then if blocking <= 0 then
return
end
local shieldstack = obj:get_wielded_item() local shieldstack = obj:get_wielded_item()
if blocking == 1 then if blocking == 1 then
shieldstack = obj:get_inventory():get_stack("offhand", 1) shieldstack = obj:get_inventory():get_stack("offhand", 1)
end end
return blocking, shieldstack return blocking, shieldstack
end end
end
mcl_damage.register_modifier(function(obj, damage, reason) mcl_damage.register_modifier(function(obj, damage, reason)
local type = reason.type local type = reason.type
local damager = reason.direct local damager = reason.direct
local blocking, shieldstack = mcl_shields.is_blocking(obj) local blocking, shieldstack = mcl_shields.is_blocking(obj)
if obj:is_player() and blocking and mcl_shields.types[type] and damager then if not (obj:is_player() and blocking and mcl_shields.types[type] and damager) then
return
end
local entity = damager:get_luaentity() local entity = damager:get_luaentity()
if entity and (type == "arrow" or type == "generic") then if entity and (type == "arrow" or type == "generic") then
damager = entity._shooter damager = entity._shooter
end end
if vector.dot(obj:get_look_dir(), vector.subtract(damager:get_pos(), obj:get_pos())) >= 0 then
if vector.dot(obj:get_look_dir(), vector.subtract(damager:get_pos(), obj:get_pos())) < 0 then
return
end
local durability = 336 local durability = 336
local unbreaking = mcl_enchanting.get_enchantment(shieldstack, mcl_shields.enchantments[2]) local unbreaking = mcl_enchanting.get_enchantment(shieldstack, mcl_shields.enchantments[2])
if unbreaking > 0 then if unbreaking > 0 then
@ -144,8 +151,6 @@ mcl_damage.register_modifier(function(obj, damage, reason)
end end
minetest.sound_play({name = "mcl_block"}) minetest.sound_play({name = "mcl_block"})
return 0 return 0
end
end
end) end)
local function modify_shield(player, vpos, vrot, i) local function modify_shield(player, vpos, vrot, i)
@ -175,22 +180,25 @@ local function set_shield(player, block, i)
end end
local shield = mcl_shields.players[player].shields[i] local shield = mcl_shields.players[player].shields[i]
if not shield then return end if not shield then return end
local luaentity = shield:get_luaentity() local luaentity = shield:get_luaentity()
if not luaentity then return end if not luaentity then return end
luaentity._blocking = block luaentity._blocking = block
end end
local function set_interact(player, interact) local function set_interact(player, interact)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local privs = minetest.get_player_privs(player_name) local privs = minetest.get_player_privs(player_name)
if privs.interact ~= interact then if privs.interact == interact then
return
end
local meta = player:get_meta() local meta = player:get_meta()
if meta:get_int("ineract_revoked") ~= 1 then if meta:get_int("ineract_revoked") ~= 1 then
privs.interact = interact privs.interact = interact
minetest.set_player_privs(player_name, privs) minetest.set_player_privs(player_name, privs)
end end
end end
end
local shield_hud = {} local shield_hud = {}
@ -229,7 +237,11 @@ end
local function handle_blocking(player) local function handle_blocking(player)
local player_shield = mcl_shields.players[player] local player_shield = mcl_shields.players[player]
local rmb = player:get_player_control().RMB local rmb = player:get_player_control().RMB
if rmb then if not rmb then
player_shield.blocking = 0
return
end
local shield_in_offhand = mcl_shields.wielding_shield(player, 1) local shield_in_offhand = mcl_shields.wielding_shield(player, 1)
local shield_in_hand = mcl_shields.wielding_shield(player) local shield_in_hand = mcl_shields.wielding_shield(player)
local not_blocking = player_shield.blocking == 0 local not_blocking = player_shield.blocking == 0
@ -248,7 +260,9 @@ local function handle_blocking(player)
end end
elseif shield_in_offhand then elseif shield_in_offhand then
local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player, true)) local offhand_can_block = (wielded_item(player) == "" or not mcl_util.get_pointed_thing(player, true))
if offhand_can_block then if not offhand_can_block then
return
end
if not_blocking then if not_blocking then
minetest.after(0.25, function() minetest.after(0.25, function()
if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block then if (not_blocking or not shield_in_hand) and shield_in_offhand and rmb and offhand_can_block then
@ -259,10 +273,6 @@ local function handle_blocking(player)
elseif not shield_in_hand then elseif not shield_in_hand then
player_shield.blocking = 1 player_shield.blocking = 1
end end
end
else
player_shield.blocking = 0
end
else else
player_shield.blocking = 0 player_shield.blocking = 0
end end