forked from VoxeLibre/VoxeLibre
Integrate critical hits
This commit is contained in:
parent
2827542002
commit
d08a226a51
|
@ -102,6 +102,9 @@ old_register_hpchange(function(player, hp_change, mt_reason)
|
|||
|
||||
for _, modf in ipairs(mcl_damage.modifiers) do
|
||||
hp_change = modf.func(player, hp_change, mt_reason, mcl_reason) or hp_change
|
||||
if hp_change == 0 then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
return hp_change
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
mcl_criticals = {}
|
||||
|
||||
function mcl_criticals.modifier(obj, hp_change, reason)
|
||||
local damage = -hp_change
|
||||
if damage > 0 and reason.type == "player" then
|
||||
local hitter = reason.direct
|
||||
if mcl_sprint.is_sprinting(hitter) then
|
||||
obj:add_velocity(hitter:get_velocity())
|
||||
elseif (hitter:get_velocity() or hitter:get_player_velocity()).y < 0 then
|
||||
local pos = mcl_util.get_object_center(obj)
|
||||
minetest.add_particlespawner({
|
||||
amount = 15,
|
||||
time = 0.1,
|
||||
minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5},
|
||||
maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5},
|
||||
minvel = {x=-0.1, y=-0.1, z=-0.1},
|
||||
maxvel = {x=0.1, y=0.1, z=0.1},
|
||||
minacc = {x=0, y=0, z=0},
|
||||
maxacc = {x=0, y=0, z=0},
|
||||
minexptime = 1,
|
||||
maxexptime = 2,
|
||||
minsize = 1.5,
|
||||
maxsize = 1.5,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "mcl_particles_crit.png^[colorize:#bc7a57:127",
|
||||
})
|
||||
minetest.sound_play("mcl_criticals_hit", {object = obj})
|
||||
-- the minecraft wiki is actually wrong about a crit dealing 150% damage, see minecraft source code
|
||||
damage = damage + math.random(0, math.floor(damage * 1.5 + 2))
|
||||
end
|
||||
end
|
||||
return -damage
|
||||
end
|
||||
|
||||
mcl_damage.register_modifier(function(player, hp_change, _, mcl_reason)
|
||||
return mcl_criticals.modifier(player, hp_change, mcl_reason)
|
||||
end, -100)
|
|
@ -0,0 +1,2 @@
|
|||
name = mcl_criticals
|
||||
depends = mcl_damage
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -113,37 +113,6 @@ end
|
|||
|
||||
local node_stand, node_stand_below, node_head, node_feet
|
||||
|
||||
|
||||
minetest.register_on_punchplayer(function(player, hitter, damage)
|
||||
if hitter:is_player() then
|
||||
if hitter:get_player_control().aux1 then
|
||||
player:add_velocity(hitter:get_velocity())
|
||||
end
|
||||
if hitter:get_velocity().y < -6 then
|
||||
player:set_hp(player:get_hp() - (damage * math.random(0.50 , 0.75)))
|
||||
local pos = player:get_pos()
|
||||
minetest.add_particlespawner({
|
||||
amount = 15,
|
||||
time = 0.1,
|
||||
minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5},
|
||||
maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5},
|
||||
minvel = {x=-0.1, y=-0.1, z=-0.1},
|
||||
maxvel = {x=0.1, y=0.1, z=0.1},
|
||||
minacc = {x=0, y=0, z=0},
|
||||
maxacc = {x=0, y=0, z=0},
|
||||
minexptime = 1,
|
||||
maxexptime = 2,
|
||||
minsize = 1.5,
|
||||
maxsize = 1.5,
|
||||
collisiondetection = false,
|
||||
vertical = false,
|
||||
texture = "mcl_particles_crit.png^[colorize:#bc7a57:127",
|
||||
})
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
|
||||
time = time + dtime
|
||||
|
|
Loading…
Reference in New Issue