This (small) mod adds player knockback. Written for Magic-CTF by LMD. It does not use mover entities for several reasons, but instead player:move_to. The main task of this mod is to use player:move_to properly and not to move players into solid blocks. If there are errors, please let me know on GitHub.

API :

There are 6 global variables concerning punchback which can be modified from other mods. How they work can be seen in the commented source.

License : GPLv3

Depends : None

Download/Source(GitHub) : https://github.com/appgurueu/punchback

Code:

- Code: Select all
`PUNCHBACK_STEPS=5 --Punchback simulation accuracy`

DEFAULT_PUNCHBACK=0.2 --Default punchback strenght in blocks - used when tool hasnt got punchback capability

PUNCHBACK_RELOAD=1 --Punchback=factor*tool punchback*time from last punch, reload is factor

PUNCHBACK_MAX=3 --beyond 3 s time from last punch there's no difference

PLAYER_SIZE=0.6 --Player collisionbox simulation size in percent, eg 0.6 means 60 percent of real size

local factor=1

minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage)

local orig=vector.multiply(hitter:get_look_dir(),(pcall(tool_capabilities.punchback) or DEFAULT_PUNCHBACK) * math.min(PUNCHBACK_RELOAD*time_from_last_punch,PUNCHBACK_MAX)) --Calc punchback vector * strength

local mult=vector.divide(vector.normalize(orig),PUNCHBACK_STEPS) --Divide by steps

local pos=player:get_pos() --Player pos

for i=0,math.ceil(vector.length(orig)*PUNCHBACK_STEPS) do --Simulation

local d=PLAYER_SIZE

for _,y in pairs({-1*d,0,1*d}) do

for _,x in pairs({-0.5*d,0,0.5*d}) do

for _,z in pairs({-0.5*d,0,0.5*d}) do

local v=vector.add(vector.add(pos,{x=x,y=y,z=z}),mult)

local floor={x=math.floor(v.x*factor+0.5)/factor,y=math.floor(v.y*factor+0.5)/factor,z=math.floor(v.z*factor+0.5)/factor}

if not (minetest.get_node(floor).walkable==true) then --Stop moving when colliding with solid node

goto overjump

end

end

end

end

pos=vector.add(pos,mult)

end

::overjump::

player:moveto(pos) --Actual punchback

end)