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

[마인크래프트 모딩]#10 모든 살아있는 생명을 공격하는 좀비

kimchangmin02 2025. 6. 28. 11:33

이번에 '진화하는 좀비'라는 새로운 몹을 만들었음.
이 녀석의 특징은 주변에 살아있는 모든 것을 공격하는 것임.

원래 좀비는 플레이어나 주민만 우선적으로 공격함.


 주민을 우선순위로 공격하지않고, 주위의 살아있는 모든것중, 가장 가까이 있는 대상 공격,
그리고 그 대상 처치하면, 레벨업함(1마리라도 처치할때마다)<나중에 레벨마다 일정한 능력치 부여하기 위해서


레벨업하면, 그 죽인 엔티티의 최대체력 흡수해서, 자신의 최대체력 증가시킴


핵심: 좀비의 뇌(AI)에 있는 '미션 목록'을 바꿔치기함

마인크래프트 몹들은 다들 뇌(AI)가 있고, 그 안에 '무엇을 할지' 정해진 미션 목록이 있음.

일반 좀비의 미션 목록 (예시)

  • 1순위: 플레이어를 공격해라!
  • 2순위: 주민을 공격해라!
  • 3순위: 철 골렘을 공격해라!
  • 기타: 할 거 없으면 어슬렁거려라.

일반 좀비는 이 목록대로만 행동함. 그래서 플레이어나 주민을 보면 미친 듯이 달려드는 거임.


우리가 한 작업: 딱 두 단계로 끝냄

EvolvingZombieEvents.java 파일에서 이 미션 목록을 조작함.

1단계: 기존 미션 목록을 싹 다 지워버림 🗑️

일단 좀비의 뇌에서 "누굴 공격할지"에 대한 기존 목록을 깨끗하게 지워버림.

Generated java

// 야, 너 공격 대상 목록 다 지워.
zombie.targetSelector.getAvailableGoals().clear();
Use code with caution.Java

이 코드 한 줄로 좀비는 누구를 공격해야 할지 모르는 순수한 바보가 됨.

2단계: 아주 간단하고 강력한 새 미션을 딱 하나 줌 ✨

그리고 그 백지상태가 된 뇌에, 아주 단순무식한 새 미션을 딱 하나만 써넣음.

Generated java

// "가장 가까운 '살아있는 모든 것'을 공격해라!"
new NearestAttackableTargetGoal<>(
      zombie,               // 누가? -> 이 좀비가
      LivingEntity.class,   // 무엇을? -> 살아있는 모든 것을! (이게 핵심)
      true                  // 조건? -> 무조건!
);
Use code with caution.Java

여기서 LivingEntity.class 이게 치트키임.

마인크래프트에서 **'살아있는 모든 개체'**를 통틀어 부르는 대표 이름임.
플레이어, 주민, 소, 돼지, 양, 크리퍼, 스켈레톤 등등... **HP가 있고 살아 움직이는 건 전부 LivingEntity**임.


결론 요약

  • 기존 좀비: "플레이어 공격해! 주민 공격해!" 라고 적힌 깐깐한 미션 목록을 가지고 있었음.
  • 진화하는 좀비: 기존 목록을 찢어버리고, "그런 거 모르겠고, 그냥 눈앞에 살아있는 거 다 공격해!" 라는 단순하고 강력한 미션 하나만 받음.

그래서 이 좀비는 종류 안 가리고 가장 가까운 생명체에게 달려들게 된 거임.


어떤 원리인지 감이 오시나욤? 궁금한 거 있으면 댓글 ㄱㄱ

 

 

 

 

교훈: 어쩌면 우리가 실패했던, 주민의 ai는 기존의 ai를 그대로 보존시킨채로

우리의 ai를 추가하려고해서

발생했던 문제는 아니엇을까라는 생각이 듦

 

아니면 혹시 이렇게는 안되나

확장성은 떨어지겟지만,

기존 주민의 ai를 마크의 파일에서 그대로 복사해서

그걸, 사용자 정의 주민에게 붙여넣기하는 방식으로

 

사용자 정의 주민의 ai 목표를 새로 정의하는 방식이면

기존 주민처럼 행동하면서, 교배빵에 대해 상호작용도 할것같기도하고

 

포기하려고했는데

모드 성공하니깐, 또 자신감이 생기는것같기도