mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
Add player knockback on punch to builtin
This commit is contained in:
parent
cf64054390
commit
291e7730cf
@ -33,5 +33,6 @@ dofile(gamepath .. "features.lua")
|
||||
dofile(gamepath .. "voxelarea.lua")
|
||||
dofile(gamepath .. "forceloading.lua")
|
||||
dofile(gamepath .. "statbars.lua")
|
||||
dofile(gamepath .. "knockback.lua")
|
||||
|
||||
profiler = nil
|
||||
|
46
builtin/game/knockback.lua
Normal file
46
builtin/game/knockback.lua
Normal file
@ -0,0 +1,46 @@
|
||||
-- can be overriden by mods
|
||||
function core.calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, distance, damage)
|
||||
if damage == 0 or player:get_armor_groups().immortal then
|
||||
return 0.0
|
||||
end
|
||||
|
||||
local m = 8
|
||||
-- solve m - m*e^(k*4) = 4 for k
|
||||
local k = -0.17328
|
||||
local res = m - m * math.exp(k * damage)
|
||||
|
||||
if distance < 2.0 then
|
||||
res = res * 1.1 -- more knockback when closer
|
||||
elseif distance > 4.0 then
|
||||
res = res * 0.9 -- less when far away
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
local function vector_absmax(v)
|
||||
local max, abs = math.max, math.abs
|
||||
return max(max(abs(v.x), abs(v.y)), abs(v.z))
|
||||
end
|
||||
|
||||
core.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, unused_dir, damage)
|
||||
if player:get_hp() == 0 then
|
||||
return -- RIP
|
||||
end
|
||||
|
||||
-- Server::handleCommand_Interact() adds eye offset to one but not the other
|
||||
-- so the direction is slightly off, calculate it ourselves
|
||||
local dir = vector.subtract(player:get_pos(), hitter:get_pos())
|
||||
local d = vector.length(dir)
|
||||
if d ~= 0.0 then
|
||||
dir = vector.divide(dir, d)
|
||||
end
|
||||
|
||||
local k = core.calculate_knockback(player, hitter, time_from_last_punch, tool_capabilities, dir, d, damage)
|
||||
|
||||
local kdir = vector.multiply(dir, k)
|
||||
if vector_absmax(kdir) < 1.0 then
|
||||
return -- barely noticeable, so don't even send
|
||||
end
|
||||
|
||||
player:add_player_velocity(kdir)
|
||||
end)
|
@ -5019,6 +5019,15 @@ Misc.
|
||||
of the creative mode setting, checks for "sneak" to set the `invert_wall`
|
||||
parameter and `prevent_after_place` set to `true`.
|
||||
|
||||
* `minetest.calculate_knockback(player, hitter, time_from_last_punch,
|
||||
tool_capabilities, dir, distance, damage)`
|
||||
* Returns the amount of knockback applied on the punched player.
|
||||
* Arguments are equivalent to `register_on_punchplayer`, except the following:
|
||||
* `distance`: distance between puncher and punched player
|
||||
* This function can be overriden by mods that wish to modify this behaviour.
|
||||
* You may want to cache and call the old function to allow multiple mods to
|
||||
change knockback behaviour.
|
||||
|
||||
* `minetest.forceload_block(pos[, transient])`
|
||||
* forceloads the position `pos`.
|
||||
* returns `true` if area could be forceloaded
|
||||
|
Loading…
Reference in New Issue
Block a user