From d12674556386bd3ece938e56f1e995a0ddaa006b Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sat, 15 Aug 2020 22:51:44 -0500 Subject: [PATCH] Fix: wielded items covering entity And remove shield texture when blocking with inv shield. --- constant.lua | 1 + globalstep.lua | 6 +- helper.lua | 2 +- mod.conf | 2 +- overrides.lua | 152 ++++++++++++++++++++++++++++++++++++++++++++++--- punch.lua | 3 +- sscsm.lua | 28 ++++++++- 7 files changed, 178 insertions(+), 16 deletions(-) diff --git a/constant.lua b/constant.lua index 9d2cc83..53d1975 100644 --- a/constant.lua +++ b/constant.lua @@ -1,2 +1,3 @@ pvp_revamped.projectile_throw_style_dip = 1 pvp_revamped.projectile_throw_style_spinning = 2 +pvp_revamped.use_player_api = minetest.global_exists("player_api") diff --git a/globalstep.lua b/globalstep.lua index 64cffc7..570822e 100644 --- a/globalstep.lua +++ b/globalstep.lua @@ -19,7 +19,6 @@ local projectile_throw_style_dip = pvp_revamped.projectile_throw_style_dip local projectile_throw_style_spinning = pvp_revamped.projectile_throw_style_spinning local player_data = pvp_revamped.player_data local player_persistent_data = pvp_revamped.player_persistent_data -local lag = pvp_revamped.lag local create_hud_text_center = pvp_revamped.create_hud_text_center local remove_text_center = pvp_revamped.remove_text_center local get_player_information = minetest.get_player_information @@ -34,7 +33,8 @@ local max = math.max local floor = math.floor minetest.register_globalstep(function(dtime) - lag = dtime * 1000000 + local lag = dtime * 1000000 + pvp_revamped.lag = lag for k, v in pairs(player_data) do local server_lag = lag + get_player_information(k).avg_jitter * 1000000 @@ -321,6 +321,8 @@ minetest.register_globalstep(function(dtime) local entity = v.entity -- Drop arms. player:set_bone_position(entity.bone, entity.position, new(-180, 0, 0)) + -- Update player's armor visual. + armor:update_player_visuals(player) v.entity.object:remove() v.entity = nil diff --git a/helper.lua b/helper.lua index ccd5a7a..b6d1c87 100644 --- a/helper.lua +++ b/helper.lua @@ -91,4 +91,4 @@ function pvp_revamped.create_hud_text_center(player, hud_name, text) else hudkit:change(player, hud_name, "text", text) end -end \ No newline at end of file +end diff --git a/mod.conf b/mod.conf index 054ae04..a859682 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,3 @@ name = pvp_revamped description = Adds an extra layer to pvp. -optional_depends = sscsm, shields +optional_depends = sscsm, shields, player_api diff --git a/overrides.lua b/overrides.lua index 5b05c43..c86101f 100644 --- a/overrides.lua +++ b/overrides.lua @@ -22,12 +22,18 @@ local player_data = pvp_revamped.player_data local player_persistent_data = pvp_revamped.player_persistent_data local create_hud_text_center = pvp_revamped.create_hud_text_center local remove_text_center = pvp_revamped.remove_text_center +local use_player_api = pvp_revamped.use_player_api local registered_tools = minetest.registered_tools local get_item_group = minetest.get_item_group local get_us_time = minetest.get_us_time local new = vector.new local max = math.max local floor = math.floor +local set_textures + +if use_player_api then + set_textures = player_api.set_textures +end minetest.register_on_mods_loaded(function() local max_armor_use @@ -124,7 +130,17 @@ minetest.register_on_mods_loaded(function() -- Write pool to hud. create_hud_text_center(user, "pvp_revamped:shield_pool", block_pool) - data.shield = {pool = block_pool, bone = "Arm_Left", name = data_shield.name, index = data_shield.index, initial_time = time, time = time, duration = data_shield.duration, hasty_guard_duration = data_shield.hasty_guard_duration, armor_inv = true} + data.shield = { + pool = block_pool, + name = data_shield.name, + index = data_shield.index, + initial_time = time, + time = time, + duration = data_shield.duration, + hasty_guard_duration = data_shield.hasty_guard_duration, + armor_inv = true + } + data.block = nil player_data[name] = data @@ -133,6 +149,16 @@ minetest.register_on_mods_loaded(function() -- Remove un-used hud element. remove_text_center(user, "pvp_revamped:block_pool") + if use_player_api then + local tex_data = armor.textures[name] + -- Remove shield from left arm. + set_textures(user, { + tex_data.skin, + tex_data.armor:gsub("%^" .. data_shield.texture .. ".png", ""), + tex_data.wielditem + }) + end + return end @@ -257,7 +283,17 @@ minetest.register_on_mods_loaded(function() -- Write pool to hud. create_hud_text_center(user, "pvp_revamped:shield_pool", block_pool) - data.shield = {pool = block_pool, bone = "Arm_Left", name = data_shield.name, index = data_shield.index, initial_time = time, time = time, duration = data_shield.duration, hasty_guard_duration = data_shield.hasty_guard_duration, armor_inv = true} + data.shield = { + pool = block_pool, + name = data_shield.name, + index = data_shield.index, + initial_time = time, + time = time, + duration = data_shield.duration, + hasty_guard_duration = data_shield.hasty_guard_duration, + armor_inv = true + } + data.block = nil player_data[name] = data @@ -266,6 +302,16 @@ minetest.register_on_mods_loaded(function() -- Remove un-used hud element. remove_text_center(user, "pvp_revamped:block_pool") + if use_player_api then + local tex_data = armor.textures[name] + -- Remove shield from left arm. + set_textures(user, { + tex_data.skin, + tex_data.armor:gsub("%^" .. data_shield.texture .. ".png", ""), + tex_data.wielditem + }) + end + return end @@ -281,7 +327,15 @@ minetest.register_on_mods_loaded(function() -- Write pool to hud. create_hud_text_center(user, "pvp_revamped:shield_pool", block_pool) - data.shield = {pool = block_pool, bone = "Arm_Left", name = k, initial_time = time, time = time, duration = duration, hasty_guard_duration = hasty_guard_duration} + data.shield = { + pool = block_pool, + name = k, + initial_time = time, + time = time, + duration = duration, + hasty_guard_duration = hasty_guard_duration + } + data.block = nil player_data[name] = data @@ -291,6 +345,16 @@ minetest.register_on_mods_loaded(function() -- Remove un-used hud element. remove_text_center(user, "pvp_revamped:block_pool") + + if use_player_api then + local tex_data = armor.textures[name] + -- Remove shield from right arm. + set_textures(user, { + tex_data.skin, + tex_data.armor, + "3d_armor_trans.png" + }) + end end minetest.override_item(k, {on_secondary_use = function(itemstack, user, pointed_thing) @@ -316,6 +380,7 @@ if minetest.global_exists("armor") then armor.save_armor_inventory = function(self, player) local _, inv = self:get_valid_player(player) + local playername = player:get_player_name() -- Create new shield inv data. if inv then @@ -325,9 +390,20 @@ if minetest.global_exists("armor") then local armor_shield = get_item_group(name, "armor_shield") or 0 if armor_shield > 0 then - local groups = stack:get_definition().groups + local def = stack:get_definition() + local groups = def.groups + local texture = def.texture or name:gsub("%:", "_") + texture = texture:gsub(".png$", "") - player_persistent_data[player:get_player_name()].inventory_armor_shield = {name = name, index = i, block_pool = groups.block_pool, duration = groups.duration, hasty_guard_duration = groups.hasty_guard_duration, groups = groups} + player_persistent_data[playername].inventory_armor_shield = { + name = name, + index = i, + block_pool = groups.block_pool, + duration = groups.duration, + hasty_guard_duration = groups.hasty_guard_duration, + groups = groups, + texture = texture + } return old_save_armor_inventory(self, player) end @@ -335,7 +411,14 @@ if minetest.global_exists("armor") then end end - player_persistent_data[player:get_player_name()].inventory_armor_shield = nil + local data = get_player_data(playername) + + data.shield = nil + player_data[playername] = data + player_persistent_data[playername].inventory_armor_shield = nil + + -- Remove un-used hud element. + remove_text_center(player, "pvp_revamped:shield_pool") return old_save_armor_inventory(self, player) end @@ -343,6 +426,7 @@ if minetest.global_exists("armor") then armor.load_armor_inventory = function(self, player) local _, inv = self:get_valid_player(player) local results = old_load_armor_inventory(self, player) + local playername = player:get_player_name() -- Create new shield inv data. if inv then @@ -352,9 +436,20 @@ if minetest.global_exists("armor") then local armor_shield = get_item_group(name, "armor_shield") or 0 if armor_shield > 0 then - local groups = stack:get_definition().groups + local def = stack:get_definition() + local groups = def.groups + local texture = def.texture or name:gsub("%:", "_") + texture = texture:gsub(".png$", "") - player_persistent_data[player:get_player_name()].inventory_armor_shield = {name = name, index = i, block_pool = groups.block_pool, duration = groups.duration, hasty_guard_duration = groups.hasty_guard_duration, groups = groups} + player_persistent_data[playername].inventory_armor_shield = { + name = name, + index = i, + block_pool = groups.block_pool, + duration = groups.duration, + hasty_guard_duration = groups.hasty_guard_duration, + groups = groups, + texture = texture + } return results end @@ -362,8 +457,47 @@ if minetest.global_exists("armor") then end end - player_persistent_data[player:get_player_name()].inventory_armor_shield = nil + local data = get_player_data(playername) + + data.shield = nil + player_data[playername] = data + player_persistent_data[playername].inventory_armor_shield = nil + + -- Remove un-used hud element. + remove_text_center(player, "pvp_revamped:shield_pool") return results end + + armor.update_player_visuals = function(self, player) + if not player then + return + end + + local name = player:get_player_name() + local tex_data = self.textures[name] + + if tex_data then + local tex_armor = tex_data.armor + local wielditem = tex_data.wielditem + local shield_data = get_player_data(name).shield + local inventory_armor_shield = player_persistent_data[name].inventory_armor_shield + + if inventory_armor_shield and shield_data and shield_data.armor_inv then + tex_armor = tex_armor:gsub("%^" .. inventory_armor_shield.texture .. ".png", "") + end + + if shield_data and not shield_data.armor_inv then + wielditem = "3d_armor_trans.png" + end + + set_textures(player, { + tex_data.skin, + tex_armor, + wielditem + }) + end + + self:run_callbacks("on_update", player) + end end diff --git a/punch.lua b/punch.lua index 811c221..2be104a 100644 --- a/punch.lua +++ b/punch.lua @@ -28,7 +28,6 @@ local get_player_data = pvp_revamped.get_player_data local player_data = pvp_revamped.player_data local player_persistent_data = pvp_revamped.player_persistent_data local armor_3d = pvp_revamped.armor_3d -local lag = pvp_revamped.lag local hit_points = pvp_revamped.hit_points local create_hud_text_center = pvp_revamped.create_hud_text_center local remove_text_center = pvp_revamped.remove_text_center @@ -554,7 +553,7 @@ local function punch(player, hitter, time_from_last_punch, tool_capabilities, di local c_damage = damage * clash_def_mul hd.damage = max(hd.damage - (damage + c_damage) * parry_dmg_mul, 0) - elseif full_punch and tool_capabilities.counter_duration and hd.time + tool_capabilities.counter_duration + lag + get_player_information(hitter_name).avg_jitter * 1000000 > get_us_time() then + elseif full_punch and tool_capabilities.counter_duration and hd.time + tool_capabilities.counter_duration + pvp_revamped.lag + get_player_information(hitter_name).avg_jitter * 1000000 > get_us_time() then -- All damage gets reversed on counter. -- Current damage gets added to it plus the damage multipliable. local counter_dmg_mul = tool_capabilities.counter_dmg_mul or counter_dmg_mul diff --git a/sscsm.lua b/sscsm.lua index 46370b2..1777468 100644 --- a/sscsm.lua +++ b/sscsm.lua @@ -7,11 +7,17 @@ if sscsm then local create_wield_shield = pvp_revamped.create_wield_shield local create_hud_text_center = pvp_revamped.create_hud_text_center local remove_text_center = pvp_revamped.remove_text_center + local use_player_api = pvp_revamped.use_player_api local get_us_time = minetest.get_us_time local get_player_by_name = minetest.get_player_by_name + local set_textures local cos = math.cos local sin = math.sin + if use_player_api then + set_textures = player_api.set_textures + end + -- Register a sscsm for dodging and dashing. sscsm.register({name = "pvp_revamped:movement", file = minetest.get_modpath("pvp_revamped") .. "/movement.lua"}) @@ -217,7 +223,17 @@ if sscsm then -- Write pool to hud. create_hud_text_center(player, "pvp_revamped:shield_pool", block_pool) - data.shield = {pool = block_pool, bone = "Arm_Left", name = data_shield.name, index = data_shield.index, initial_time = time, time = time, duration = data_shield.duration, hasty_guard_duration = data_shield.hasty_guard_duration, armor_inv = true} + data.shield = { + pool = block_pool, + name = data_shield.name, + index = data_shield.index, + initial_time = time, + time = time, + duration = data_shield.duration, + hasty_guard_duration = data_shield.hasty_guard_duration, + armor_inv = true + } + data.block = nil player_data[name] = data @@ -225,6 +241,16 @@ if sscsm then -- Remove un-used hud element. remove_text_center(player, "pvp_revamped:block_pool") + + if use_player_api then + local tex_data = armor.textures[name] + -- Remove shield from left arm. + set_textures(player, { + tex_data.skin, + tex_data.armor:gsub("%^" .. data_shield.texture .. ".png", ""), + tex_data.wielditem + }) + end end end end)