Есть 1 способ, но это скажем так.. костыль.
В общем каждый короткий промежуток времени можно запускать с большой силой снаряд (projectile) по взгляду игрока, но дописав в него спец. метадату и сделав невидимым(Хотя при большой силе он и так будет незаметен), а затем слушать EntityDamageByEntity и в случае если наш тип сущности того кто ударил эквивалентен например снежку, то в случае наличия спец. метадаты отменять event и задавать как цель event.getEntity()
Таким образом мы сразу решаем проблему с тем что игрок может быть спрятан за блоком, но это таки довольно костыльно.
Можно также кидать проджектайл при EntityMoveEvent, но это еще хуже, так что лучше используй общий шедулер который будет бегать по игрокам, или Шедулер-Куратор отдельный для каждого, но опять же это как-то костыльно [2]
В общем отпишись если найдешь что