주요 기능:
- 주변의 아군 좀비(자신 포함) 중 가장 위급한 대상을 찾아 치유
- 치유를 할수록 레벨업, 성능 향상 (힐량/체력 증가, 쿨타임 감소)
- 머리 위에 레벨, 체력, 경험치, 쿨타임 등 상태 UI 표시

이 힐러 좀비를 어떤 구조로 구현했는지, 단계별로 핵심만 요약해서 설명하겠음.
1단계: 힐러 좀비의 데이터 저장하기 (Capability)
가장 먼저 해야 할 일은 힐러 좀비만의 고유 데이터(레벨, 총 치유량 등)를 저장할 공간을 만드는 거임. 바닐라 좀비한테는 이런 데이터가 없으니까.
포지(Forge)에서는 Capability라는 시스템을 사용해서 기존 엔티티에 이런 '추가 데이터 주머니'를 달아줄 수 있음.
- HealerZombieData.java: 힐러 좀비의 '개인 수첩'. 레벨, 총 치유량을 기록하는 변수들이 들어있음.
- HealerZombieDataProvider.java: 이 '개인 수첩'을 좀비에게 실제로 달아주는 역할을 하는 파일임.
이 두 파일을 이용해 모든 좀비에게 "너는 힐러가 될 수도 있어"라는 가능성을 열어줌.
2단계: 힐러 좀비의 뇌 만들기 (AI Goal)
이제 힐러 좀비가 어떻게 행동할지, 즉 '뇌'를 만들어 줘야 함. 마크 모딩에선 이걸 AI Goal이라고 부름.
HealerZombieGoal.java 파일에 모든 핵심 행동 로직을 넣었음.
- 치유 대상 찾기: 이게 제일 중요함.
- findMostInjuredZombie() 메소드에서 주변 20블록 내의 모든 좀비를 스캔함.
- 목록에서 체력 비율(현재체력/최대체력)이 가장 낮은 좀비를 우선순위로 정함. (단, 다른 힐러 좀비는 제외)
- 자기 자신도 목록에 포함시켜서, 주변에 더 위급한 동료가 없으면 스스로를 치유함.
// findMostInjuredZombie() 메소드의 핵심 로직 return nearbyZombies.stream() // 체력이 꽉 찬 좀비는 제외 .filter(zombie -> zombie.getHealth() < zombie.getMaxHealth()) // 다른 힐러 좀비는 제외 (하지만 자기 자신은 포함) .filter(zombie -> { if (zombie == this.healer) return true; // 나 자신은 OK return !isHealer(zombie); // 다른 힐러는 NO }) // 체력 '비율'이 가장 낮은 놈을 찾음 (가장 위급한 순) .min(Comparator.comparingDouble(z -> z.getHealth() / z.getMaxHealth()));Use code with caution.Java - 치유 실행 및 레벨업:
- 대상을 찾으면 졸졸 따라가서 2초 동안 힐을 시전함 (하트 파티클 표시).
- 힐이 성공하면 performHeal() 메소드가 호출됨.
- 힐량은 (기본 힐량) + (레벨-1) * 2 공식으로 레벨이 오를수록 강해짐.
- 레벨업 조건을 (현재 레벨) * 5 만큼의 누적 치유량으로 완화함. (Lv.1->2는 5, Lv.2->3은 10...)
- 레벨업하면 최대 체력이 오르고, 다음 레벨을 위해 누적 치유량은 0으로 초기화됨.
3단계: 유저에게 정보 보여주기 (Renderer)
AI만 만들면 겉으로는 그냥 이상하게 행동하는 좀비일 뿐임. 유저가 "아, 얘가 힐러구나!" 하고 알 수 있도록 머리 위에 UI를 띄워줘야 함.
HealerZombieRenderer.java 파일이 이 역할을 담당함.
- RenderLivingEvent.Post 이벤트를 사용해서, 좀비가 화면에 그려진 '직후'에 추가로 UI를 덧그림.
- 독립적인 쿨타임 시스템: healerZombieCooldowns 라는 맵(Map)을 만들어 힐러 좀비만의 쿨타임을 관리함. onClientTick 이벤트에서 매 틱마다 쿨타임을 1씩 감소시킴. (주민 힐러와 완전히 분리됨!)
- 머리 위에 표시되는 정보들:
- Lv.X Healer Zombie (레벨)
- EXP: X / Y (치유 경험치 바)
- 체력: X / Y (체력 바)
- Cooldown: X.Xs (치유 쿨타임)
4단계: 모든 기능 하나로 묶기 (Events & Network)
이제 위에서 만든 기능들을 하나로 엮어서 실제로 동작하게 만들어야 함.
- HealerZombieEvents.java: 우리 모드의 '컨트롤 타워'임.
- AttachCapabilitiesEvent: 모든 좀비가 스폰될 때 1단계에서 만든 '데이터 주머니'를 달아줌.
- EntityJoinWorldEvent: 힐러 좀비가 월드에 나타나면, 기존 공격 AI를 싹 지우고 2단계에서 만든 '힐러 AI'를 새로 넣어줌.
- PlayerInteractEvent: 유저가 '힐러 좀비 스폰 알'을 사용하면 힐러 좀비를 스폰시킴.
- HealerZombieNetwork.java & Packet 파일들: 멀티플레이를 위한 통신 담당.
- 서버(계산 담당)에서 좀비가 레벨업하거나 쿨타임이 돌면, 클라이언트(화면 담당)에게 "야, 이 좀비 정보 바뀌었으니까 UI 업데이트해!" 라고 **쪽지(Packet)**를 보냄.
- ClientboundHealerZombieDataSyncPacket: 레벨, 경험치 정보 전달
- ClientboundHealerZombieCooldownPacket: 쿨타임 정보 전달
'모딩 > 마인크래프트 모드 개발 일지' 카테고리의 다른 글
| [마인크래프트 모딩]#13 삼지창을 퍼붓는 좀비 만들기 (9) | 2025.06.29 |
|---|---|
| [마인크래프트 모딩]#12 해골마 궁수 좀비 만들기 (8) | 2025.06.28 |
| [마인크래프트 모딩]#10 모든 살아있는 생명을 공격하는 좀비 (4) | 2025.06.28 |
| [마인크래프트 모딩]#9 주민 ai수정의 어려움에 대해서 (9) | 2025.06.28 |
| [마크 모딩 삽질기] #8 주민아, 연애 좀 해! (feat. 뇌 제어 실패기) (11) | 2025.06.27 |