안녕하세요, 브금입니다!
오늘 적을 강좌는 상당히 유용할 것이라 믿습니다.
바로 "투사체 헤드샷 판정" 강좌입니다.
여기서 말하는 투사체는 1.12.2 기준 맞았을 때 피격 판정이 뜨는 눈덩이, 계란, 화살 등을 의미합니다.
원리부터 설명하겠습니다.
피격 판정을 인식하는 이벤트는 on damage: 입니다
이 이벤트에서 투사체에 맞았을 때 y좌표는 y coordinate of projectile 이며,
그 때 맞은 사람의 y 좌표는 y coordinate of victim 로 사용할 수 있습니다.
구문을 깔끔하게 적기 위해 임시변수에 각각 해당 두개의 좌표를 담으면, ( 저는 {_head1} , {_head2} 로 저장했습니다 )
두 좌표의 차를 이용하여 맞은 부위의 결과값을 출력해낼 수 있습니다.
이를 이용하여 머리 / 몸통 / 다리 / 발 등으로 오직 y좌표로만 4개의 타격 부위를 나눌 수 있으며,
응용함에 따라 네 부위의 데미지 설정도 다르게 할 수 있습니다.
주석과 함께 해당 구문을 보겠습니다.
on damage: #플레이어가 데미지를 입었을 때
set {_head1} to y coordinate of projectile #{_head1}에 투사체 y좌표 저장
set {_head2} to y coordinate of victim #{_head2}에 피격자 y좌표 저장
set {_n.%attacker%} to "몸샷" #기본 출력을 몸통으로 설정
if {_head1}-{_head2} is bigger than 1.5: #만약 {_head1}-{_head2}가 1.5 보다 크다면
set {_n.%attacker%} to "헤드샷 " #피격 판정을 "헤드샷"으로 설정
if {_head1}-{_head2} is smaller than 0.6: #만약 {_head1}-{_head2}가 0.6 보다 작다면
set {_n.%attacker%} to "발샷" #피격 판정을 "발샷"으로 설정
send "&f%{_n.%attacker%}%" to attacker #출력 구문
감사합니다!
스크립터브혼
2020.07.10마인크래프트 시간단위가 0.05초라서 그만큼의 오차가 생깁니다.
location of projectile는 충돌 순간의 좌표가 아닌 틱단위 위치좌표를 반환하기 때문입니다.
그래서 두 플레이어가 서로 수직에 가깝게 위치 할 수록 잘못된 결과를 가져옵니다.
DDang_
2021.07.14ㄷㄷ 이건 몰랐네요 그럼 플러그인 eyelocation 을 쓰는게 맞을까요?
스크립터브혼
2021.07.14시간차로 인한 오차이기 때문에 클라이언트에서 충돌위치를 반환해주어야만 오차없이 구현할 수 있을겁니다.
단순히 충돌했는지만으로는 0.05초의 오차를 해결할 수 없습니다.
저도 벡터를 사용해서 0.05초 간의 두궤적에 따라 발생할 수 있는 충돌에 대해서 판단해 봤는데
어쨋든 활은 궤적에 따라 움직이지만 플레이어는 그렇지 않기 때문에 역시나 오차는 생깁니다.
또한 충돌 판정에 있어서 구의 충돌은 간단히 구현되지만, 육면체의 충돌은 상당히 복잡합니다.
특히 몸통의 경우 얼굴과는 다르게 방향값을 알수가 없습니다. 얼굴은 플레이어가 바라보는 방향을 그대로 보지만, 몸통은 해드의 방향성에 따라 적당히 따라가는 정도라서 팔의 충돌을 구현하는것은 불가능에 가깝습니다.
이동하는 플레이어를 수직에 가까운 아래에서 쏘는 경우 발에 맞을때도 있고, 손에 맞을 때도 있고 가끔은 머리에도 맞는데 이것을 판단하는게 상당히 난해합니다. 이 정도까지 실험하다가 그냥 충돌 판정을 구현하는걸 포기했습니다.
활을 아주 쎄게 쏠 경우 0.05초간 활이 날아갈 수 있는 블록이 5블록이 넘습니다. 이 오차를 잡아내는건 쉽지 않아요.
DDang_
2021.07.18와 그래서 투사체 날려서 헤드 판정 내는 플러그인이나 맞은 곳 알아내는 로직 짰을 때 위에서 아래로 쏠 때는 무조건 헤드가 나오는게 아니었군요