Fixed assists not working with mt default items

This commit is contained in:
Giov4 2024-07-16 15:18:22 +02:00
parent e7ab15b373
commit 95b8059fcc
4 changed files with 91 additions and 77 deletions

View File

@ -48,6 +48,7 @@ dofile(minetest.get_modpath("fantasy_brawl") .. "/src/score.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/invulnerability.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/invulnerability.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/utils.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/utils.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/damage.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/blood_effect.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/blood_effect.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/health_bar.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/health_bar.lua")
@ -58,8 +59,8 @@ dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/skill_proxies/item
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/skill_proxies/aoe_proxy.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/skill_proxies/aoe_proxy.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/respawn/respawn.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/respawn/respawn.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/controls.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/controls.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/classes_system.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/classes_system.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/skill_layers/meteors_layer.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/skill_layers/meteors_layer.lua")
dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/class_selector_formspec.lua") dofile(minetest.get_modpath("fantasy_brawl") .. "/src/classes/class_selector_formspec.lua")

89
src/damage.lua Normal file
View File

@ -0,0 +1,89 @@
local S = fbrawl.T
local get_pl_by_name = minetest.get_player_by_name
local calculate_knockback = minetest.calculate_knockback
function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, distance, damage)
local mod = arena_lib.get_mod_by_player(player:get_player_name())
if mod == "fantasy_brawl" then return 0 end
return calculate_knockback(player, hitter, time_from_last_punch,
tool_capabilities, dir, distance, damage)
end
function fbrawl.hit_player(puncher, hit_pl, damage, knockback, self_damage)
local puncher_name = puncher:get_player_name()
local arena = arena_lib.get_arena_by_player(puncher_name)
local hitting_themself = puncher_name == hit_pl:get_player_name()
damage = damage * 20
if
(hitting_themself and self_damage == false)
or arena.players[hit_pl:get_player_name()].is_invulnerable
then
return false
end
hit_pl:punch(puncher, 2, {damage_groups = {fleshy = damage}})
if knockback then
hit_pl:add_velocity(knockback)
end
return true
end
function fbrawl.damage_players_near(puncher, pos, range, damage, knockback, callback)
local arena = arena_lib.get_arena_by_player(puncher:get_player_name())
if not arena then return false end
if type(range) == "number" then range = vector.new(range, range, range) end
for pl_name, props in pairs(arena.players) do
local hit_pl = get_pl_by_name(pl_name)
local hit_pl_pos = vector.add({x=0, y=1, z=0}, hit_pl:get_pos())
local is_close_enough = true
if
math.abs(pos.x - hit_pl_pos.x) > range.x
or math.abs(pos.y - hit_pl_pos.y) > range.y
or math.abs(pos.z - hit_pl_pos.z) > range.z
then
is_close_enough = false
end
if hit_pl == puncher then is_close_enough = false end
if is_close_enough then
local did_it_hit = fbrawl.hit_player(puncher, hit_pl, damage, knockback)
if did_it_hit and callback then
callback(hit_pl:get_player_name())
end
end
end
end
minetest.register_on_punchplayer(function(player, puncher, time_from_last_punch, tool_capabilities, dir, damage)
local pl_name = player:get_player_name()
local puncher_name = puncher:get_player_name()
local arena = arena_lib.get_arena_by_player(pl_name)
local mod = arena_lib.get_mod_by_player(player:get_player_name())
if mod ~= "fantasy_brawl" or puncher_name == pl_name then return false end
if fbrawl.is_player_playing(puncher_name) and not arena.players[pl_name].is_invulnerable then
arena.players[pl_name].hit_by[puncher_name] = (arena.players[pl_name].hit_by[puncher_name] or 0) + damage
end
return false
end)

View File

@ -1,6 +1,5 @@
local last_pls_y_velocity = {} -- pl_name = y_velocity local last_pls_y_velocity = {} -- pl_name = y_velocity
local get_node = minetest.get_node local get_node = minetest.get_node
local get_pl_by_name = minetest.get_player_by_name
local S = fbrawl.T local S = fbrawl.T
@ -24,69 +23,6 @@ end
function fbrawl.hit_player(puncher, hit_pl, damage, knockback, self_damage)
local puncher_name = puncher:get_player_name()
local arena = arena_lib.get_arena_by_player(puncher_name)
local hit_pl_hitters = arena.players[hit_pl:get_player_name()].hit_by
local hitting_themself = puncher_name == hit_pl:get_player_name()
damage = damage * 20
if
(hitting_themself and self_damage == false)
or arena.players[hit_pl:get_player_name()].is_invulnerable
then
return false
end
hit_pl:punch(puncher, 2, {damage_groups = {fleshy = damage}})
if not self_damage then
hit_pl_hitters[puncher_name] = (hit_pl_hitters[puncher_name] or 0) + damage
end
if knockback then
hit_pl:add_velocity(knockback)
end
return true
end
function fbrawl.damage_players_near(puncher, pos, range, damage, knockback, callback)
local arena = arena_lib.get_arena_by_player(puncher:get_player_name())
if not arena then return false end
if type(range) == "number" then range = vector.new(range, range, range) end
for pl_name, props in pairs(arena.players) do
local hit_pl = get_pl_by_name(pl_name)
local hit_pl_pos = vector.add({x=0, y=1, z=0}, hit_pl:get_pos())
local is_close_enough = true
if
math.abs(pos.x - hit_pl_pos.x) > range.x
or math.abs(pos.y - hit_pl_pos.y) > range.y
or math.abs(pos.z - hit_pl_pos.z) > range.z
then
is_close_enough = false
end
if hit_pl == puncher then is_close_enough = false end
if is_close_enough then
local did_it_hit = fbrawl.hit_player(puncher, hit_pl, damage, knockback)
if did_it_hit and callback then
callback(hit_pl:get_player_name())
end
end
end
end
-- min and max included, output format: 0.00 -- min and max included, output format: 0.00
function fbrawl.random(min, max) function fbrawl.random(min, max)
min = min * 100 min = min * 100
@ -169,18 +105,6 @@ end
local calculate_knockback = minetest.calculate_knockback
function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, distance, damage)
local mod = arena_lib.get_mod_by_player(player:get_player_name())
if mod == "fantasy_brawl" then return 0 end
return calculate_knockback(player, hitter, time_from_last_punch,
tool_capabilities, dir, distance, damage)
end
function fbrawl.pl_look_at(player, target) function fbrawl.pl_look_at(player, target)
local pos = player:get_pos() local pos = player:get_pos()
local delta = vector.subtract(target, pos) local delta = vector.subtract(target, pos)