ZenScript | |
개발 | CraftTweaker Team |
버전 | 없음[1] |
웹사이트 |
마인트위커 문서 깃허브 |
[clearfix]
1. 개요
#!syntax java
println("Hello world!");
마인크래프트의 모드인 MineTweaker의 스크립트에 사용되는 프로그래밍 언어. 보통은 젠스크립트로 읽는다.
2. 기본 스크립트 이용법
처음 마인트위커(1.8.9 이후의 경우 크래프트 트위커)를 설치한 후 처음 실행한다면 자신의 마인크래프트 폴더에 scripts라는 폴더가 생성된다.[2] 이 폴더 안에 스크립트가 없을 경우에는 마인트위커는 명령어 외에는 아무런 기능도 제공하지 못하므로 스크립트 파일을 해당 폴더에 생성하고[3] 그 뒤 메모장 등 텍스트 편집 프로그램으로 열어 코드를 작성할 필요가 있다.2.1. Hello, world! 예제
이 코드를 자신의 스크립트에 넣고 실행한다면 마인트위커 로그 파일[4]에 Hello world!라는 메시지가 출력되게 된다.
#!syntax java
print("Hello world!");
응용하자면 print 코드는 스크립트 내부 변수를 확인할때도 사용 가능하다. 이 스크립트의 경우 Hello world! 1235가 출력되게 된다
#!syntax java
var namu = 1234 as int;
namu = namu + 1;
print("Hello world! " + namu);
이 코드에서 사용되는 var 부분은 변수이며, 하위 항목에 더 자세히 설명되어 있다.
2.2. 주석 넣기
스크립트 내에 설명을 추가하거나 실행되기 원치 않는 스크립트를 삭제하지 않고 비활성화하고싶다면 주석을 사용할 수 있다.Java와 같이 "//"를 이용해 한줄 주석을, "/* */"을 이용해 여러줄 주석을 넣을 수 있다. 단, 한글이나 특수문자를 입력하면 안된다. (자세한 이유는 아래 항목 참조)
#!syntax java
// this is a single line comment
/* this is a
multi line
comment */
2.3. 상수, 변수, 자료형
스크립트 내에서 잦은 빈도로 사용되는 값의 경우 상수 또는 변수로 지정하여 코딩 효율성을 늘릴 수 있다.var는 변수값을, val은 상수값을 의미한다. 변수값의 경우 스크립트 내에서 변경할 수 있는 반면 상수값의 경우 코드 내에서 한번 정의된 이후 절대 바뀔 일이 없는 경우에 주로 사용된다.[5]
#!syntax java
var namu1 = 1 as long;
val namu2 = 1 as long;
val pi = 3.1415926535 as double;
namu1 = namu1 + 1;
print("namu1 = " + namu1); // 2
namu2 = namu2 + 1; //Error
print("namu2 = " + namu2);
자료형이 변수 이름 앞에 붙는 Java등의 언어와 달리 ZenScript에서 변수의 자료형은 변수값 뒤에 붙는다. 위의 예제와 같이 as <자료형> 이렇게 입력하면 된다.
자료형 종류 | 설명 | import |
int | 32비트 정수이며 가장 기본적인 정수값 유형으로 범위는 -21억 4748만 3648 ~ 21억 4748만 3647이다. as <자료형>을 뒤에 붙여 따로 지정하지 않으면 해당 정수값은 이 자료형으로 설정된다. | |
long | 64비트 정수. 범위는 약 ±922경이다.[6] | |
short | 16비트 정수. 범위는 -32768 ~ 32767이다. | |
byte | 8비트 정수. 범위는 -128 ~ 127이다. | |
float | 32비트 자연수이다. | |
double | 64비트 자연수. float보다 더 정밀하거나 큰 숫자를 지정 가능하다. | |
boolean | true(참) 또는 false(거짓)만을 가지는 자료형이다. if문에서 사용 가능하다. | |
String | 문자열을 나타내는 자료형이다. 두개의 " 사이에 있는 내용은 문자열이 되며 as String 을 입력하지 않아도 된다. | |
IItemStack |
마인트위커 내에서의 아이템 묶음(ItemStack) 자료형이다. 별도의 클래스이므로 import가 필요하다. |
import crafttweaker.item.IItemStack; |
IIngredient |
아이템, 광석사전 등 조합 재료에 붙는 자료형이다. 별도의 클래스이므로 import가 필요하다. |
import crafttweaker.item.IIngredient; |
2.4. 조건문
조건문은 자신이 작성한 코드를 특정 조건을 만족할 경우 실행되게 하는 데 사용된다.#!syntax java
val namu = 0;
if (namu == 0) { // true
print("Namu is zero!");
} else {
print("Namu is NOT zero!");
}
var wiki = namu != 0 ? "namu" : "wiki";
print(wiki); // wiki
JavaScript/Java/C에 익숙하다면 AND 와 OR 연산자가 이 프로그래밍 언어들과 다른 점에 유의해야 한다.[7]
#!syntax java
val a = true;
val b = false;
print("a AND b = " + (a & b)); //false
print("a OR b = " + (a | b)); //true
2.4.1. 특정 모드 감지하기
모드 구성이 다른 다수의 모드팩에서 스크립트가 모드 구성에 따라 다르게 동작하게 만들려면 if문과 함께 모드 감지 코드를 사용하면 된다. in 다음에 붙는 문자열은 모드의 ID이다.#!syntax java
if (loadedMods in "namu"){
print("Namu is loaded");
}
if (loadedMods in "thermalfoundation"){
print("Thermal Foundation is loaded");
}
if (loadedMods in "ic2"){
print("IndustrialCraft 2 is loaded");
}
그러나 if문 안에도 모드팩 내에 없는 모드의 아이템을 넣으면 오류가 발생하게 되므로 주의가 필요하다.[8] 모드의 유무에 의해 특정 아이템/액체/함수 등이 있거나 없을 수 있다면 아래의 프리프로세서를 사용하자. 단, 프리프로세서는 크래프트 트위커의 고유 기능으로 마인트위커에서는 사용 불가하다.
만일 해당 스크립트 파일 전체가 특정 모드를 위한것이라면 프리프로세서를 사용하는것이 권장된다. 모드ID 부분에는 해당 스크립트가 실행되기위해 필요한 모드의 ID를 사용하면 된다.
#!syntax java
#modloaded 모드ID
모드 ID는 띄어쓰기로 구분하여 여러개 입력할 수 있으며, 아래의 예제는 IC2와 팅커스 컨스트럭트가 동시에 로딩된 경우에만 해당 스크립트가 실행되도록 만든다.
#!syntax java
#modloaded ic2 tconstruct
2.5. 한글/특수문자 입력 방법
마인트위커 스크립트 내(주석, 문자열 포함)에 한글과 같이 한 글자에 2바이트를 사용하는[9] 문자를 직접 사용하면 오류가 발생한다.그러나 문자열의 경우 한글과 특수문자를 입력하는 방법이 있으며 다음과 같다:
- 이 링크로 들어간다.[10]
- JavaScript/Java/C 라고 적힌 부분 오른쪽을 보면 ES6, C-Style, \n etc라고 적힌 부분이 있다. 그중 \n etc 에만 체크한다.
- 맨 윗칸(초록색 칸)에 변환을 원하는 문자열을 넣고 Convert 버튼을 누른다.
- JavaScript/Java/C 라고 적힌 칸에 있는 문자열을 복사하여 사용한다.
- 이 방법으로 "나무위키"를 변환했다면 \uB098\uBB34\uC704\uD0A4 가 출력될 것이다.
이렇게 변환된 문자열을 print 코드에 넣고 실행하면 마인트위커 로그에 "나무위키" 라고 뜨게 되며, 참나무 묘목의 이름도 "나무위키"로 변하게 된다. 또한 이 예제에 나오지 않은 함수에서도 문자열이 필요한곳이라면 대부분 활용 가능하다.
#!syntax java
val str = "\uB098\uBB34\uC704\uD0A4";
print(str);
<minecraft:sapling:0>.displayName = str;
2.6. 작업대 조합법
마인트위커를 사용하여 할 수 있는 가장 기본적인 변경은 작업대 조합법을 추가/삭제하는것이다.2.6.1. 유형 조합법
유형 조합법을 추가하는 코드는 다음과 같다:#!syntax java
recipes.addShaped(<결과물>, <조합법>);
이 코드는 recipes 객체의 addShaped 함수를 호출하는것을 의미한다. recipes 객체는 작업대 조합법의 추가/삭제만을 담당하며, 화로나 모드 레시피를 추가/삭제하기 위해서는 그들만의 객체에서 함수를 호출해야한다.
이제 함수를 제대로 호출하는 방법을 알아보자. 다음은 바닐라 마인크래프트의 곡괭이 조합법이다:
addShaped 함수의 <조합법>은 2차원 배열 형태로 아이템 코드를 받는다. 위 조합법의 2차원 배열 코드는 다음과 같다:
#!syntax java
[[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>],
[null, <minecraft:stick>, null],
[null, <minecraft:stick>, null]]
여기서 null은 빈칸을 의미한다.
아이템 코드의 형식은 <모드 이름:아이템 문자 아이디>이다. /mt hand 또는 /mt name 명령어를 통해 얻을 수 있다. 명령어에 대한 설명은 아래의 명령어 항목을 참조하자.
아래와 같이 띄어쓰지 않고 한줄로도 할 수 있다.
#!syntax java
[[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>], [null, <minecraft:stick>, null], [null, <minecraft:stick>, null]]
<결과물> 에 철 곡괭이의 아이템 코드를, <조합법>에 위에서 작성한 2차원 배열을 넣으면 다음과 같이 된다:
#!syntax java
recipes.addShaped(<minecraft:iron_pickaxe>,
[[<minecraft:iron_ingot>, <minecraft:iron_ingot>, <minecraft:iron_ingot>],
[null, <minecraft:stick>, null],
[null, <minecraft:stick>, null]]);
2.6.2. 무형 조합법
무형 조합법은 형태가 없이 재료의 종류만 맞으면 조합창 어느곳에 아이템이 위치해도 조합이 가능한 조합법이다.무형 조합법 추가 함수 addShapeless는 유형 조합법 추가 함수 addShaped와 같이 매개변수가 2개이지만, <조합법> 매개변수가 1차원 배열이라는 점이 다르다.
#!syntax java
recipes.addShapeless(<결과물>, <조합법>);
다음은 석탄/목탄과 나무막대 1개를 조합창에 위치 상관없이 어디에나 놓기만 하면 횃불 4개가 만들어지는 조합법을 추가하는 코드이다.
#!syntax java
recipes.addShapeless(<minecraft:torch> * 4, [<minecraft:coal:*>, <minecraft:stick>]);
<minecraft:coal:*>와 같이 아이템 문자 아이디 옆에 있는 메타데이터 변수에 숫자 대신 " * "를 입력하면 해당 아이템의 메타데이터에 상관없이 재료로 이용 가능하며[11], <minecraft:torch> * 4 와 같이 아이템 코드 밖에 " * "와 숫자를 쓰면 해당 조합의 결과물로 얻어질 아이템의 개수를 지정 가능하다.[12]
위 조합법을 적용하면 다음과 같은 조합이 가능하며, 석탄/목탄과 나무 막대를 조합창 어느곳에 두어도 개수만 맞으면 조합이 될 것이다:
2.6.3. 조합법 삭제하기
만일 특정 아이템의 조합을 금지하기 원하거나 조합법을 다르게 변경하고싶다면 조합법을 삭제할 필요가 있다.이 코드는 유형/무형 조합법을 가리지 않고 <아이템>매개변수에 입력된 해당 아이템이 결과물로 나오는 모든 작업대 조합법을 삭제한다.
#!syntax java
recipes.remove(<아이템>);
다음의 예는 다른 모드가 추가하는 작업대 조합법을 포함해 TNT가 결과물로 나오는 모든 작업대 조합법을 삭제한다:
#!syntax java
recipes.remove(<minecraft:tnt>);
유형/무형 조합법중 한 종류의 조합법 전체만 삭제하고 싶다면 다음의 코드를 이용하면 된다:
#!syntax java
recipes.removeShaped(<아이템>);
recipes.removeShapeless(<아이템>);
특정 형태의 조합법만 삭제하는것도 가능하다:
#!syntax java
//1
recipes.removeShaped(<minecraft:stick>, [[<*>], [<*>]]);
//2
recipes.removeShapeless(<minecraft:mushroom_stew>, [<minecraft:bowl>, <minecraft:brown_mushroom>, <minecraft:red_mushroom>]);
첫번째 코드는 나무 판자 2개를 세로로 놓아서 나무 막대를 조합하지 못하게 만들며, 두번째 코드는 무형 조합법인 버섯 스튜를 만들지 못하게 만든다. [13]
만일 A 조합법을 B 조합법으로 대체시키고 싶은 경우 기존 조합법을 삭제한 후 다시 추가하면 된다.
아래의 예제 코드는 그레그테크처럼 나무 판자 2개에서 막대가 2개만 만들어지도록 수정하는 코드이다. 여기서 <ore:plankWood>는 광석 사전 코드이며, 자세한 설명은 아래 서술되어 있다.
#!syntax java
recipes.removeShaped(<minecraft:stick> * 4, [[<ore:plankWood>], [<ore:plankWood>]]);
recipes.addShaped(<minecraft:stick> * 2, [[<ore:plankWood>], [<ore:plankWood>]]);
조합법을 변경할때는 반드시 위의 코드와 같이 조합법 삭제 코드 다음에 추가하는 코드를 넣도록 하자. 추가 후 삭제하면 변경한 조합법마저 삭제될 수 있다!
2.6.4. 광물 사전 이용
마인트위커는 포지의 광석 사전도 지원하며, 이를 통해 조합법에 다양한 아이템들을 이용 가능하게 해준다.[14]광석사전을 이용하려면 <ore:광석사전이름> 형태로 코드를 적으면 된다. 원하는 아이템이 광석사전에 속하는지 원한다면 아래에서 설명하는 /mt hand 명령어를 사용도록 하자.
자주 쓰이는 광석사전 이름은 다음과 같다:
이름 | 설명 |
treeWood | 바닐라를 비롯한 대다수의 나무 원목(통나무)은 이 광석사전 이름으로 등재된다.[15] |
plankWood | 바닐라의 것을 포함한 나무 판자는 이 접두사로 등록된다. |
saplingWood | 나무 묘목에 붙이는 광석사전 이름. |
dye**** | 염료에 붙는 광석사전 접두사. **** 부분은 염료의 색이다.[16] |
ore**** |
광석 블록에 붙이는 광석사전 접두사. **** 부분에는 해당 광석의 물질 이름을 넣는다. 예를 들어 철광석은 oreIron, 구리 광석은 oreCopper이다.[17] |
orePoor**** | 저질 광석의 광석사전 접두사. 저질 광석은 일반 광석에 비해 함유한 광물의 양이 적다. |
oreRich**** | 상급 광석의 광석사전 접두사. 상급 광석은 일반 광석에 비해 함유한 광물의 양이 많다. |
stick**** | 막대에 붙는 광석사전 접두사. 나무 막대의 경우 stickWood 이며, 일부 모드는 철, 구리 등 다른 재료의 막대를 추가한다. |
ingot**** | 주괴에 붙이는 광석사전 접두사. 광석과 마찬가지로 ****부분에는 재료 이름을 넣는다. |
dust**** | 가루에 붙이는 광석사전 접두사. |
plate**** | 판에 붙이는 광석사전 접두사. 판은 주로 인더스트리얼크래프트, 그레그테크, 이머시브 엔지니어링 등에서 쓰인다. |
block**** | 저장 블록[18]들은 이 광석사전으로 등록된다. |
gem**** | 다이아몬드, 에메랄드, 루비, 사파이어등 보석에 붙는 광석사전 접두사이다. |
gear**** | 톱니바퀴(기어, Gear)에 붙는 광석사전 접두사. 빌드크래프트, 포레스트리, 그레그테크 등 톱니바퀴를 추가하는 모드에서 상호 호환을 위해 이용된다. |
stone**** | 대리석, 흑요석 등 돌에 붙는 광석사전 접두사이다. |
1.14부터는 바닐라에 유사한 기능인 태그 시스템이 추가되면서 이 기능 또한 태그를 사용하도록 변경되었다. 기존에 <ore:oreCopper>로 광석 사전에 등록되던 아이템을 이용했다면 1.14부터는 <tag:forge:ores/copper>를 사용해야 한다. 모드간 공유되는 태그는 주로 forge 이름공간을 사용하며, 특정 모드 내부에서만 이용되는 태그는 해당 모드 ID를 이름공간으로 사용한다.
[1]
라이브러리의 버전이 없다.
[2]
직접 생성하여도 된다.
[3]
메모장(.txt)파일 생성후 확장자를 ZenScript (.zs) 로 변경하면 된다.
[4]
minetweaker.log, 마인크래프트 폴더 안에 있다.
[5]
val 로 지정된 상수값을 변경하려하면 오류가 발생한다.
[6]
자세히는 -922경 3372조 368억 5477만 5808 ~ 922경 3372조 368억 5477만 5807.
[7]
JavaScript/Java/C에서는 해당 연산자가 각각 &&, || 지만 ZenScript에서는 &, | 이다.
[8]
스크립트를 컴파일할때는 if문 내의 내용도 확인하기 때문.
[9]
한자,
중국어,
일본어, 기타 2바이트를 사용하는 문자 포함
[10]
유니코드 문자를 변환해주는 페이지이다.
[11]
이렇게 할 경우 조합법 출력에는 사용하지 못한다.
[12]
작업대 조합법 입력에는 개수 지정을 하지 말자. 단, 일부 모드 조합법 추가 함수의 경우 결과물뿐 아니라 입력에도 아이템 개수를 지정해도 된다.
[13]
단, 타 모드가 다른 형태의 나무막대 조합법이나 다른 재료를 이용하여 버섯 스튜를 추가하는 조합법을 추가하고있다면 그 조합법은 삭제되지 않을것이다.
[14]
광석 사전은 되도록 아이템 입력에만 사용하자. 결과물에 사용하면 오류를 내는 경우도 있다.
[15]
예외적으로 Natura 는 타 모더가 광석사전을 통해 자신의 나무를 건드리는것을 원치 않아 등록을 하지 않았다. 단, 판자는 등록되어 있다.
[16]
Black, Red, Green, Brown, Blue, Purple, Cyan, LightGray, Gray, Pink, Lime, Yellow, LightBlue ,Magenta, Orange, White
[17]
재료 이름의 첫 글자는 대문자로 해야한다. oreiron 같은 경우에는 인식되지 않는다.
[18]
주괴나 보석 9개를 이용하여 만드는 블록.