
1. 일단, '충격파'라는 스킬의 큰 그림은?
머릿속으로 상상한 스킬의 작동 방식은 대충 이랬음.
- 1단계 (뇌): 주민의 인공지능이 스킬 쓸 타이밍을 재야 함. "오, 저기 좀비가 있군. 쿨타임도 다 찼겠다. 사거리도 딱이군. 쓴다!" 하고 결심하는 단계.
- 2단계 (시전): 스킬을 쓰기로 마음먹는 순간, 플레이어한테 '나 스킬 썼소!' 하고 티를 내야 함. 칼 휘두르는 "슈슉!" 소리를 내고, 발사 지점에 간지나는 파티클을 뽝! 하고 터뜨림. 이건 그냥 겉멋임.
- 3단계 (진짜 공격): 이제 진짜 마법이 일어날 시간임. 주민 앞쪽으로 '보이지 않는 공격 범위'를 만들어서 그 안에 있는 놈들을 싹 다 찾아냄.
- 4단계 (정산): 찾아낸 놈들한테 데미지를 주고 뒤로 뻥 날려버림. 그리고 날려버린 몬스터 수만큼 경험치를 냠냠함.
이 4단계만 거치면 완벽한 스킬 하나가 탄생하는 거임. 아주 간단한 설계였음. 물론, 언제나 그렇듯 현실은 달랐음.
2. 첫 번째 대환장 파티: 겁쟁이 주민의 허공 삽질
코드를 다 짜고 신나게 테스트를 해봤음.
좀비를 소환하고 우리 충격파 주민을 딱 붙여놨는데, 이 녀석이...
"좀비를 보자마자 뒤돌아서 도망치면서, 자기가 도망치는 방향(허공)에다 대고 충격파를 쏨."
뒤에 있는 좀비는 멀쩡하고 애꿎은 잔디만 날아가는 걸 보고 있자니 혈압이 오르기 시작했음.
- 원인: 스킬이 발사되는 방향을 **'주민이 현재 보고 있는 방향'**으로 설정해 놨기 때문임. 주민 AI는 적을 보면 일단 거리를 벌리려고 도망가니까, 당연히 좀비의 반대 방향을 보게 되고, 스킬은 허공으로 날아갈 수밖에.
- 해결: 주민의 시선을 탓할 게 아니었음. 발사 로직을 뜯어고쳤음.
- (기존) "네가 지금 보고 있는 방향으로 쏴!"
- (변경) "네가 어딜 보든 상관없어. 너의 위치에서 타겟(좀비)의 위치로 직선을 그려서, 그 방향으로 쏴!"
이렇게 바꾸니까 주민이 꽁무니 빠지게 도망치면서도, 발사되는 충격파는 귀신같이 뒤에 있는 좀비를 추적해서 명중시켰음. 문제 해결!
3. 그래서 기술적으로 어떻게 구현했는데? (Q&A 타임)
블로그를 보는 분들이 궁금해할 만한 것들을 정리해봤음.
Q1. '전방 일직선'에 있는 좀비는 대체 어떻게 찾아냄? 컴퓨터에 눈이 달린 것도 아니고.
A. 좋은 질문임. 컴퓨터는 눈이 없어서 **'수학'**으로 해결함.
**'보이지 않는 긴 복도'**를 만든다고 생각하면 쉬움.
- 방향 설정: 일단 주민 위치에서 좀비 위치까지의 방향을 계산함. (이게 수정된 알고리즘의 핵심)
- 복도 건설: 주민 몸뚱이를 기준으로, 그 방향으로 사거리(대충 10칸)만큼 길고 좁은 '직육면체 공간'을 쭉 만듦. 이게 바로 보이지 않는 복도, 즉 **'공격 판정 박스'**임.
- 손님 확인: 게임 시스템한테 "이 복도 안에 들어와 있는 놈들 전부 리스트로 만들어줘!" 하고 시킴.
결국 컴퓨터는 '본다'기보다, 자기가 만들어놓은 '공간' 안에 누가 들어와 있는지를 체크하는 거임.
Q2. 광역 스킬인데, 우리 편 다른 주민까지 날려버리면 어떡함? (팀킬 방지)
A. 여기서 바로 **'클럽 가드(문지기)'**가 등장함.
위에서 말한 '복도' 안에는 아군, 적군 할 것 없이 다 들어올 수 있음. 그래서 이 리스트를 가지고 한 명씩 신분 검사를 해야 함.
- 신분증 검사: 복도 안에 있는 모든 녀석들에게 물어봄. "너, 우리 편이야? (isAlly 함수)"
- 가드의 결정:
- "네, 저 아군인데요." → 가드가 말함. "오케이, 넌 통과. 상처 없이 지나가." (데미지, 넉백 안 받음)
- "크어어어... (좀비)" → 가드가 말함. "넌 명단에 없군. 입장 불가." → 충격파 콰쾅!
이런 식으로 공격 판정이 들어가기 직전에 아군을 싹 걸러내기 때문에 팀킬은 절대 일어날 수 없음.
Q3. 그래서 데미지랑 날아가는 거리는 어느 정도임?
A. 이건 그냥 내가 설정한 숫자 나름임.
- 데미지: 충격파 주민의 능력치에 **'공격력: 6'**이라고 적어뒀음. (하트 3칸) 스킬은 그냥 이 능력치를 읽어서 그대로 피해를 줌. 이 숫자를 10으로 바꾸면 데미지가 10이 되는 아주 정직한 시스템임.
- 날아가는 거리 (넉백): 이건 두 개의 숫자로 조절함.
- 수평 파워: 얼마나 '멀리' 날아갈지. (현재 1.8)
- 수직 파워: 얼마나 '높이' 뜰지. (현재 0.5)
- 이 두 숫자를 잘 조합하면, 그냥 뒤로 슥 밀리는 게 아니라 포물선을 그리며 저 멀리 시원하게 날아가는 장면을 연출할 수 있음. 타격감의 핵심임.
4. 최종 보스: 게임 터뜨리는 NullPointerException
기능을 다 만들고 이제 진짜 다 됐다고 생각한 순간, 게임이 터졌음.
에러 메시지는 바로 이것.
java.lang.NullPointerException: Registry Object not present: mymod:shockwave_villager
이건 모드 개발자라면 누구나 한 번쯤 겪는다는 '그 녀석'이었음.
- 원인: 쉽게 말해, **"집도 짓기 전에 가구부터 놓으려고 한 상황"**임.
게임이 시작되면서 "충격파 주민한테 체력 20, 공격력 6을 줘야지~" 하고 능력치를 주려고 하는데, 정작 게임에는 '충격파 주민'이라는 존재가 아직 공식적으로 등록되지 않았던 거임. 게임 입장에서는 "누구요? 그런 애 없는데요?" 하면서 그냥 실행을 멈춰버린 것. - 해결: 모드의 메인 파일(MyMod.java)에 딱 두 줄 추가해 줬음.
"게임 시작하면, 다른 거 하기 전에 이 '충격파 주민'이라는 녀석이랑 '충격파 주민 스폰알'부터 명단에 딱 올려놔!"
해결
광역스킬은 거의 처음인데
보류해둿던 전사의 회전베기도 구현할수도(마법사는 거의 피해주는 느낌은 아니엇으니깐)
'모딩 > 마인크래프트 모드 개발 일지' 카테고리의 다른 글
| 마크 모딩) 커스포지에 업로드 (0) | 2025.12.20 |
|---|---|
| 마크 모딩) 커스포지에 업로드하기전 사전준비들 (2) | 2025.12.20 |
| [마인크래프트 모딩]#19 '궁수 타워' 만들기 (15) | 2025.07.04 |
| [마인크래프트 모딩]#18 오늘 산재해있던, 문제들에 대해서 (8) | 2025.07.02 |
| [마인크래프트 모딩]#17 나만의 소환사 주민 만들기 (9) | 2025.07.02 |