1. 개요
링크직접 NPC를 만들어 모습이나 대화, 움직임 등을 직접 설정할 수 있는 모드로 주로 맵 제작 등에 쓰이는 모드. 단순히 마을에서 떠들기만 하는 NPC만 만들 수 있는 것이 아니라 몬스터나 보스는 물론이고 의사, 용병 같은 다양한 역할을 가진 NPC도 만들 수 있다.
설정할 수 있는 범위가 무척이나 넓기 때문에 처음에는 NPC 하나 만드는 것도 벅차지만 이는 거꾸로 말하자면 모드 자체가 무척 잘 짜여져 있다는 뜻으로, 어느 정도 익숙해진다면 마인크래프트를 RPG 게임으로 승화시키는 것도 무리가 아닌 모드이다.
영어를 전혀 몰라도 문제없을 정도로 한글화가 되어있지만, 번역이 되지 않은 부분도 상당수 존재하며 번역이 좀 어색한 부분도 존재한다.
일부 실력자 같은 경우는 NPC를 이용해서 월드가드, 월드보호, 유저 스텟, 캐릭터 선택, 유저스킬 등등 여러 가지를 플러그인과 동급으로 만들 정도이다.
2. 아이템
- Redstone Block
- Location Quest Block
- NPC Wand
- Mob Cloner
- Scripter
- NPC Pather
- Mounter
- Teleporter
- Carpentry Bench
- Mailbox
그 밖에도 하위 버전은 상관없으나 1.11.2 이후부터는 기존에 커스텀npc 모드에 같이 있었던 여러 무기나 소품들이 별개의 모드로 분리되었다. 링크
3. NPC 만들기
3.1. 디스플레이
- 이름
- 제목
- 모델
Parts 항목에서는 수염, 치마, 뿔, 꼬리, 귀 같은 부가 요소를 설정할 수 있다. 다만 일반적인 스티브 모습의 NPC만 설정할 수 있으니 주의.
Scale 항목에서는 몸의 각 부위의 크기를 최대 50%까지 키우거나 줄일 수 있다. 마찬가지로 스티브 모습의 NPC만 설정 가능.
- 텍스쳐
- 망토
- 오버레이
- 생활 애니메이션
- 보임
- 보스 체력 바
3.2. 스탯
- 체력
- 어그로 범위
- 생명체 유형
- 리스폰
- 근접 옵션
- 원거리 옵션
- 발사체 유형
- 저항
- 화재 면역
- 익사
- 낮에 불탐
- 낙하 대미지
- PotionImmune
- 거미줄 영향
- 체력 리젠
- 전투 중 체력 리젠
3.3. AI
- 적 발견시
- 물을 피함
- 문 상호작용
- 제자리로 돌아옴
- 수영 가능
- 대상에게 도약
- 선호 쉼터
- 대상 고정
- Attack Invisible
- 전술 변경
회피 - 공격을 슬쩍 피하는 방식으로 움직이며 공격한다.
포위 - 적을 둘러싸면서 공격한다.
치고빠지기 - 공격하다가 슬쩍 도망간다.
매복 - 숨어있다가 적이 가까이 오면 달려들어 공격한다.
은밀히접근 - 몰래 적을 따라가다가 어느 정도 가까워지면 공격한다.
- 이동 설정
3.4. 인벤토리
NPC 모습의 양옆에 있는 장비 창에는 자유롭게 방어구나 무기를 넣어둘 수 있다. 방어구나 무기를 넣어뒀다고 추가로 강해지지는 않으니 참고. 방패 칸에는 굳이 방패를 넣지 않아도 되므로 칼을 두 개 줘서 이도류를 구사할 수 있다. 물론 상술했듯이 외형 빼고는 아무 의미 없다. 화살 칸은 원거리 공격에서 발사될 투사체의 모습을 정하는 것으로 이 칸이 비어 있으면 NPC가 원거리 공격을 하지 못하니 원거리 공격을 하는 NPC를 만들고 싶다면 꼭 이 칸에 무언가를 넣어줘야 한다.[1]
최소 경험치와 최대 경험치는 해당 NPC를 죽였을 때 얻을 수 있는 경험치를 뜻한다. 돼지, 소 같은 동물들은 1~3을 주고 몬스터들은 5를 주며 엔더드래곤은 12000을 주니 참고.
NPC 인벤토리는 해당 NPC를 죽였을 때 드롭할 아이템으로 최대 9종류까지 설정할 수 있으며 확률을 100%로 했을 경우 NPC를 죽일 때마다 무조건 아이템을 주게 된다. 경험치 설정 밑에 일반이라 쓰여있는 버튼이 보일 텐데, 이를 누르면 Auto Pickup으로 변경되어 드롭 아이템이 땅에 떨어지는 것이 아니라 플레이어한테 즉시 들어오게 된다. [2]
3.5. 부가기능
3.5.1. 역할
- 역할 없음
- 상인
예를 들어서 이렇게 설정했을 경우 뼈다귀를 10개 주면 돌 검을 1개 받을 수 있게 된다. 옆에 있는 손상 무시는 내구도가 있는 아이템을 주고 다른 아이템을 받는 거래를 할 때 내구도가 하나도 닳지 않아야만 거래에 쓸 수 있느냐, 내구도가 닳은 것도 거래에 쓸 수 있느냐에 대한 설정이고, Ignore NBT는 NBT가 들어간 아이템도 취급하는가에 대한 설정이다.
- 수행원
이렇게 설정했을 경우 나무 검을 주면 하루, 돌 검을 주면 3일, 철 검을 주면 5일 동안 플레이어를 따라다니게 된다.
윗부분의 대사는 고용에 성공했을 때의 대사이며 그 밑에 있는 대사는 고용 기간이 끝났을 때의 대사이다. 물론 대사는 자유롭게 변경할 수 있다.
고용된 NPC를 마우스 오른쪽으로 클릭하면 남은 체력과 남은 고용 기간을 볼 수 있으며 기간을 연장할 수 있다. 또 따라다니게 할 것인지 대기시켜둘 것인지도 정할 수 있다.
- 은행
- 텔레포터
- 우체부
- Companion(WIP[뜻])
그리고 설정에 따라 인벤토리 창을 설정할수 있으면 일정 시간 마다 먹이를 줘야 한다.
- 대화
특정 조건을 충족하면 적어놓은 대화를 시작한다. 여러 NPC끼리 서로 대화하는 상황도 연출 가능.
3.5.2. 직업
- 직업 없음
- 바드
- 힐러
- 가드
- 기부자
맨 위의 버튼은 아이템을 어떤 방식으로 주느냐에 대한 설정으로 Random Item은 설정한 아이템 중 무작위로 하나를 주며, All Items는 설정한 모든 아이템을 준다. Give Not Owned Items는 설정한 모든 아이템을 가지고 있지 않을 때만 설정한 모든 아이템을 주며, 'Give When Doesn't Own Any'는 아무 것도 가지고 있지 않을 때 설정한 모든 아이템을 준다. Chained는 설정한 아이템을 제일 왼쪽부터 차례대로 준다.
그 밑의 버튼은 아이템을 주는 시간에 대한 설정으로 Timer는 밑의 Cooldown 만큼의 시간(초)이 지나면 주며, Give Only Once는 플레이어당 1회만 주며 Daily는 마인크래프트 시간 기준으로 1일마다 한 번씩 준다.
- 수행원
- 소환사
- 대화
- 청크 로더
- Puppet
- Builder
- Farmer
3.5.3. 대화 설정
- World Lines
- Attack Lines
- Interact Lines
- Killed Lines
- Kill Lines
맨 밑의 Random Lines를 '예'로 설정하면 설정한 말 중 무작위의 말을 내뱉는다.
3.5.4. 파벌
기본적으로 플레이어를 공격하며 이름이 빨간색으로 표시되는 Aggressive, 플레이어에게 우호적이며 이름이 초록색으로 표시되는 Friendly, 먼저 공격받기 전까지는 플레이어에게 아무 영향도 끼치지 않으며 이름이 노란색으로 표시되는 Neutral로 총 세 종류의 파벌이 존재하며 이외에도 다른 파벌을 더 추가할수있다.적대 파벌 공격을 예로 설정할 경우 Aggressive는 Friendly를, Friendly는 Aggressive를 공격하게 되며 같은 파벌 도움을 예로 설정하면 적대파벌 공격을 설정하지 않아도 같은 파벌이 공격을 시작하면 뒤따라 공격을 하게 된다.
사망 시 영향력은 해당 NPC를 죽였을 때 각 파벌들이 플레이어를 보는 시선에 대한 것이다. 자세한 것은 글로벌 - 파벌 참조.
3.5.5. 대화문
3.5.6. 소리 설정
3.5.7. 밤 설정
밤이 되면 NPC가 해당 설정으로 재설정 되고 아침이 되면 다시 원래대로 돌아오는 기능이다.
3.5.8. Linked
NPC끼리 연동을 할 수 있게 해준다. 일단 Linked 참조. 그룹을 만들고 NPC를 해당 그룹에 넣을 수 있다.이 그룹에 있는 NPC는 역할과 스크립트를 제외한 모든 정보를 같게 만들 수 있다.
3.5.9. Scenes
3.5.10. Marks
3.6. 글로벌
글로벌은 NPC 하나를 설정하는 것이 아니라 광범위하게 영향이 가는 내용을 설정하는 것이다.3.6.1. 은행
3.6.2. 파벌
이름은 해당 파벌의 이름을 뜻하며 색상은 해당 파벌에 해당하는 NPC의 이름이 어떤 색상으로 표시되는지를 말한다.
영향력은 플레이어와 파벌 간의 관계도 같은 것인데, Aggressive 같은 경우 기본 영향력은 0, 중립으로 가기 위한 영향력은 500, 친밀로 가기 위한 영향력은 1500이 필요한 식이다.
몬스터에게 공격받음은 몬스터에게 공격을 받는지에 대한 설정이다.
적대 파벌은 서로 싸우게 될 파벌을 설정하는 것으로 하나도 설정하지 않아도 되는 반면, 존재하는 다른 모든 파벌과 적대적인 막장 파벌로 만들 수도 있다.
3.6.3. 대화문
NPC의 대화문을 설정하다 설정에 따라 퀘스트에 레벨 제한 또는 역할 사용의 레벨 제한을 걸 수도 있다.
대부분 퀘스트를 주기 위해 설정한다.
추가를 누른 후 생긴 New를 탭 한 뒤 우측의 대화문을 탭 하여 New에 해당하는 탭으로 이동한다. 이곳에서 추가를 눌러 대화들을 생성할 수 있다.
추가된 New를 탭 하면 제목, 대화 텍스트, 가능성 등의 옵션이 나타나는데, 이를 통해 대화를 설정할 수 있다.
-대화 텍스트 : 이름 그대로 NPC의 대사를 입력하는 창이다.
-가능성 설정 :
-파벌 옵션 :
-대화 옵션 : 플레이어의 대답이나 선택지를 설정하는 탭이다. 제목 창에 대사를 적고 옵션 타입을 통해 해당 대사에 대한 상호작용을 할 수 있다.
-소리 선택 :
-가능성 설정 :
-파벌 옵션 :
-대화 옵션 : 플레이어의 대답이나 선택지를 설정하는 탭이다. 제목 창에 대사를 적고 옵션 타입을 통해 해당 대사에 대한 상호작용을 할 수 있다.
-소리 선택 :
3.6.4. 퀘스트
커스텀 NPC에 퀘스트를 만드는데 사용된다.
대부분 대화문과 연동해서 사용하지만 명령어로도 설정할 수 있다.
/noppes quest start (플레이어) (퀘스트 번호) - 플레이어에게 강제로 퀘스트을 준다.
/noppes quest finish (플레이어) (퀘스트번호) - 퀘스트를 강제로 완료한다.[4]
/noppes quest stop (플레이어) (퀘스트번호) - 퀘스트를 강제로 종료시킨다.[5]
/noppes quest remove (플레이어) (퀘스트번호) - 퀘스트을 초기화한다.[6]
여기에서 퀘스트 번호는 퀘스트 이름을 설정하는 화면 옆에 적혀 있다. ID라고 적혀 있는 것 밑에 숫자를 찾을 수 있다.
3.6.5. 텔레포트
부가 기능으로 만들 텔레포트를 삭제하거나 또는 다른 텔레포트 만들 때 쓰인다.3.6.6. 유저 데이터
여기에서는 유저 데이터를 볼 수 있다. 일단 원하는 유저의 닉네임을 클릭 한 뒤 옆에 있는 화면으로 유저 데이터를 삭제할 수 있다.
Quest Data는 유저의 퀘스트 데이터를 볼수 있다.
Dialog Data는 유저의 대화 데이터를 볼수 있다.
Transport Data는 유저의 텔레포트 데이터를 볼수 있다.
Bank Data는 유저의 은행 데이터를 볼수 있다.
Faction Data는 유저의 파벌 데이터를 볼수 있다.
3.6.7. 제작법
Carpentry Bench에서 사용할 수 있는 제작법을 만들 수 있다. 글로벌 버튼을 누르면 일반 제작대에서 사용할 수 있는 제작법도 만들 수 있다.1.12.2는 안된다
3.6.8. 자연스폰(WIP[뜻])
개인으로 저장한 NPC를 일정 바이옴에 자연 리스폰하게 만들 수 있다. 아직 작업중이라고는 하지만 블럭에 껴서 스폰되는 문제를 제외하고는 완벽하니, 만약 야생을 더 편하게 혹은 더 하드코어하게 즐기고 싶은 사람들은 여러 친밀 혹은 적대적 NPC들을 추가해서 자연스폰 하도록 해 보자.참고로 여기에 써져 있는 것 중 '스폰확률' 비슷한 뉘앙스의, 경우의 수 조절하는 막대기가 있다. 그 값이 높을수록 청크에 분마다 스폰될 확률이 높아지며, 낮을수록 분마다 스폰될 확률이 낮아진다. 0으로 하면 아예 스폰되지 않으며, 100으로 하면 여타 동물들이나 밤에 스폰되는 몹 수와 비슷한 젠 량을 가지게 된다.
3.6.9. Linked
이 기능은 NPC끼리 연동하는 그룹을 설정하는 기능이다. 여기에서 추가 버튼을 눌러서 원하는 이름의 그룹을 만들 수 있다.4. 스크립트
스크립트는 커스텀 NPC에 여러가지 기능을 확장해주는 기능이다.이 기능을 사용하기 위해서는
C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext
에 있는 nashorn 파일을 모드 파일에 넣어주어야 한다.여러 가지 스크립트가 있으면 주로 자바스크립트을 쓰고 메소드(Method)는 여기에서 원하는 버전 관련 스크립트가 있다.
버전마다 사용되는 방식이 다르니 참고할 것.
4.1. 1.7.10에서
1.7.10에서는 스크립터로 원하는 NPC를 우클릭하면 창이 뜨는데 그 창에서 '아니요'를 클릭해서 '예'로 수정할 수 있다. 그리고 Scripts를 클릭하면 다른창이 뜨는데, 그 창에서 스크립트를 쓰면 된다.일단 이벤트와 이벤트 취소 여부를 알아보자.
초기 NPC가 완드 또는 스크립터로 다시 설정될 때 또는 다시 발동될 때이다.
10 tick[8] 단위로 업데이트한다.
상호작용 - NPC를 우클릭하면 작동된다. (취소 가능) 대화 - 대화문이 열리면 작동된다. 데미지 - NPC가 데미지 입을대마다 작동된다. (취소 가능) 사망 - NPC가 죽을 때 작동된다. 공격 - NPC가 공격할대 마다 작동된다. (취소 가능) 대상 - NPC가 공격할 대상을 찾을대 마다 작동된다. (취소 가능) Colide - NPC가 엔티티와 붙은면 발동된다. Kills - NPC가 아무 몹을 죽이면 발동된다. Dialog Closed - 대화문이 끝나면 발동된다. |
1.7.10 까지에서는 원하는 이벤트에 자기가 원하는 메소드를 넣으면 된다.
ex) npc.executeCommand("kill @a");
4.2. 상위버전
상위버전에서는 스크립터로 원하는 NPC를 우클릭하면 창이 뜨는데 그 창에서 '아니요'를 클릭해서 '예' 로 수정한다. 그리고 위에 있는 + 버튼을 눌러서 1번 창을 만들고 그 안에 스크립트를 작성하면 된다.상위버전에서는 1.7.10 이하에서 다른게 이벤트가 지정 되어 있는게 아니라서 특정 메소드를 사용하지 않고도 var같은 변수를 저장할수 있다.1.8 이상에서 스크립트를 쓰는 방법은
function 이벤트(event){
스크립트
}
스크립트
}
이런 형식으로 만들면 된다.
이벤트는
npc 기준은 init : NPC가 완드 또는 스크립터로 다시 설정될 때 또는 다시 살아날때 발동된다. tick: 10 tick[9] 단위로 발동된다. interact: NPC를 우클릭하면 작동된다. (취소 가능) dialog: 대화문이 뜨면 실행된다. dialog_option: 대화문이 끝날 때마다 작동된다. damaged: 대미지를 입으면 발동된다. meleeAttack: 근접 공격을 하면 발동된다. rangedLaunched: 원거리 공격을 하면 발동된다. target: NPC가 적을 감지할 때 발동된다. targetLost: NPC가 적을 놓치면 발동된다. died: NPC가 죽으면 발동된다. kill: NPC가 적을 죽일 때 발동된다. role: 직업 일을 할 때 발동된다. 은행: 창고를 잠금해제 했을 때 또는 업그레이드 했을 때 발동된다. 용병: NPC를 고용했을때 또는 고용이 끝날 때 발동한다. 상인: 교환 또는 교환에 실패했을 때 발동한다. 텔레포트: 텔레포트가 잠금 해제되거나 이용했을때 발동된다. cillide: NPC가 엔티티(몹/플레이어)와 붙으면 발동된다. timer: 타이머가 끝날 때 발동된다. 스크립트 문 또는 스크립트 블럭 기준 init : 스크립트로 다시설정 할때 발동된다. tick: 0.5초마다 발동된다. interact: 우클릭하면 발동된다. redstone : 블럭에 레드스톤 신호가 오면 발동된다. doorToggle : 스크립트 문에서만 적용되며 문이 열리거나 닫히면 발동된다. broken : 블럭이 파괴되면 발동 된다. rainFilled : 비가 내리면 발동된다. neighborChanged : 주변 블럭에 변동이 생기면 발동된다. clicked : 블럭을 좌클릭하면 발동된다. harvested : 플레이어가 블럭을 파괴하면 발동된다. collide : 엔티티가 블럭과 충돌하면 발동된다. timer: 타이머가 끝날 때 발동된다. |
function tick(event){
event.npc.executeCommand("kill @a")
}
이렇게 하면 된다.event.npc.executeCommand("kill @a")
}
4.3. 공통
커스텀 NPC는 주로 자바 스크립트로 되어있다.for 와 if 같은 ECMA 와 같이 기존에 있는 문법을 사용할 수 있다.
Math.floor(값) - 절하 Math.ceil(값) - 절상 Math.cos/sin/tan(라디안) - 삼각함수 Math.PI - 파이π값을 불러옵니다. ()를 쓰지 않습니다. Math.max(값1, 값2 ...) - 최대값 반환 ex)Math.max(1, 2, 3) = 3 Math.min(값1, 값2 ...) - 최하값 반환 같음 Math.sqrt(값) - 평방근,루트값 Math.pow(값, 지수) - 거듭제곱 Math.random() 0 ~ 0.99999... 범위의 실수 반환 Math.floor(값) - 소수점 버림 |
변수는 주로 var로 쓴다.
배열의 예시로는 다음과 같다.
var a=[0 ]
2차원 배열은
var a=[ [ ],[ ] ]
a[ 0 ][ 0 ]=1
a[1][0]=2
a[0][1]=3
이렇게 하면 된다.a[ 0 ][ 0 ]=1
a[1][0]=2
a[0][1]=3
4.4. 난독화
커스텀 NPC 난독화 같은경우는 대부분 MCEntity 또는 MCWorld로 실행 시킨다. getMCEntity().field_70758_at : 엔티티가 바라보고있는 방향구함 getMCEntity().field_70759_as : 엔티티 가 바라보고있는 방향 구함(위에 있는것과 차이를 몰라서 2개 모두 서술) getMCEntity().field_70125_A : 엔티티가 바라보고있는 방향 y축을 구함 Java.type("net.minecraft.util.AxisAlignedBB").func_72330_a(x1,y1,z1,x2,y2,z2) :x1 y1 z1 에서부터 x2 y2 z2 의 데이터 값을 구함 getMCWorld().func_72839_b(npc.getMCEntity(), func_72330_a로 구한값); : func_72330_a로 구한값을 MCEntity 로 반환함(배열) getMCEntity().func_70107_b : 엔티티룰 텔레포트한다. getMCEntity().field_70165_t : 엔티티 의 x 값을 반환함 getMCEntity().field_70163_u : 엔티티의 y 값을 반환함 getMCEntity().field_70161_v : 엔티티 의 z 값을 반환함 getMCEntity().func_70013_c() : 엔티티가 현재 있는곳의 밝기를 반환함 getMCEntity().func_110138_aP() : 엔티티의 최대체력을 반환함 getMCEntity().func_110143_aJ() : 엔티티의 현재 체력을 반환함 getMCEntity().func_70617_f_() :엔티티 가 사다리에 있으면 true를 반환하고, 그렇지 않으면 false로 반환한다. |
5. 둘러보기
[1] 물론 스크립트라는 기능을 사용하면 해당 칸에 무언가를 안 넣어도 원거리 공격이 가능하다.[2] 플레이어의 몸 중심부에 드롭되는 것이므로 플레이어가 너무 빠르게 움직이고 있다면 경험치 등은 먹어지지 않을 수도 있다.[뜻] Work In Progress. 작업중인 것을 뜻한다.[4] 단 보상은 받지 못한다.[5] 이 경우 해당 퀘스트를 다시 받을 수 있다.[6] 완료된 퀘스트라면 다시 받을 수 있다.[뜻] Work In Progress. 작업중인 것을 뜻한다.[8] 약 0.5초 정도.[9] 약 0.5초