Here is the struct I came up with for OP_PerformPlayerKnockbackMsg
Setting horizontal movement to a positive value will push the player away from the target location, negative value will push the player towards the target location.<Struct Name="WS_PlayerKnockback" ClientVersion="1" OpcodeName="OP_PerformPlayerKnockbackMsg">
<Data ElementName="target_x" Type="float" />
<Data ElementName="target_y" Type="float" />
<Data ElementName="target_z" Type="float" />
<Data ElementName="vertical_movement" Type="float" />
<Data ElementName="horizontal_movement" Type="float" />
<Data ElementName="unknown" Type="int8" />
<Data ElementName="use_player_heading" Type="int8" />
<Data ElementName="unknown2" Type="int8" Size="4" />
</Struct>
Vertical movement needs a negative value when being pushed away from the target and a positive value when being pushed towards the target, however a rather large negative value will actually make the player move towards the target location, haven't figured out the value where it changes direction though.
Setting use_player_heading to 1 will ignore the target location and push back or forward based on the players heading.
A decent size knockback would be vertical = -45 horizontal = 25, while a minor one would be vertical = -8 horizontal = 15