Do you know why raycast stops when it detects a block below itself (not just in itself)
scoreboard players remove @s bow_shoot_steps 1
execute as @s at @s run tp @s ^ ^ ^0.5
#execute as @s at @s run tp @s ~ ~ ~ ~ ~0.1
execute at @s run particle minecraft:crit ~ ~1 ~ 0 0 0 0 1 force
execute at @s run damage @e[type=!player,distance=..2,limit=1] 10
execute unless block ~ ~ ~ #gun:weak run tag @s add hitblock
execute as @s[tag=!hitblock,scores={bow_shoot_steps=1..}] at @s run function gun:bow/move2