모딩/마인크래프트 모드 개발 일지

[마인크래프트 모딩]#11 좀비힐러

kimchangmin02 2025. 6. 28. 12:10

주요 기능:

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

 

 

 

 

이 힐러 좀비를 어떤 구조로 구현했는지, 단계별로 핵심만 요약해서 설명하겠음.

1단계: 힐러 좀비의 데이터 저장하기 (Capability)

가장 먼저 해야 할 일은 힐러 좀비만의 고유 데이터(레벨, 총 치유량 등)를 저장할 공간을 만드는 거임. 바닐라 좀비한테는 이런 데이터가 없으니까.

포지(Forge)에서는 Capability라는 시스템을 사용해서 기존 엔티티에 이런 '추가 데이터 주머니'를 달아줄 수 있음.

  • HealerZombieData.java: 힐러 좀비의 '개인 수첩'. 레벨, 총 치유량을 기록하는 변수들이 들어있음.
  • HealerZombieDataProvider.java: 이 '개인 수첩'을 좀비에게 실제로 달아주는 역할을 하는 파일임.

이 두 파일을 이용해 모든 좀비에게 "너는 힐러가 될 수도 있어"라는 가능성을 열어줌.

2단계: 힐러 좀비의 뇌 만들기 (AI Goal)

이제 힐러 좀비가 어떻게 행동할지, 즉 '뇌'를 만들어 줘야 함. 마크 모딩에선 이걸 AI Goal이라고 부름.

HealerZombieGoal.java 파일에 모든 핵심 행동 로직을 넣었음.

  1. 치유 대상 찾기: 이게 제일 중요함.
    • findMostInjuredZombie() 메소드에서 주변 20블록 내의 모든 좀비를 스캔함.
    • 목록에서 체력 비율(현재체력/최대체력)이 가장 낮은 좀비를 우선순위로 정함. (단, 다른 힐러 좀비는 제외)
    • 자기 자신도 목록에 포함시켜서, 주변에 더 위급한 동료가 없으면 스스로를 치유함.
    Generated java
    // 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. 치유 실행 및 레벨업:
    • 대상을 찾으면 졸졸 따라가서 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: 쿨타임 정보 전달