{{{#!wiki style="margin: -0px -10px -5px; min-height:calc(1.5em + 5px)" {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin: -5px -1px -11px; word-break:keep-all" | <colbgcolor=darkgreen><colcolor=#fff> 기본 플레이 | |
시스템 | 세계 (시드) · 게임 모드 · 난이도 · 게임 규칙 · 엔딩 · 죽음 메시지 · 스플래시 · 명령어 · NBT · 런처 | |
인게임 | 아이템 · 몹 (플레이어) · 개체 · 날씨 · 차원 · 생물군계 · 구조물 · 마법 부여 · 상태 효과 · 조작법 · 피해 · 업적 | |
도움말 | 튜토리얼 · 팁 (탐험 · 파밍 · 회로) · 재생 가능한 자원 · 브릿징 · PVP · 파쿠르 · 스피드런 · 건축 (맵아트) | |
시리즈 및 매체 | ||
출시 에디션 | 자바 에디션 (업데이트 · 거리 효과) · 베드락 에디션 (업데이트) · 포켓 에디션* · 콘솔 에디션* · 파이 에디션* | |
파생 게임 | 마인크래프트 던전스* · 마인크래프트 레전드* · 마인크래프트 에듀케이션 · 마인크래프트: 스토리 모드* · 마인크래프트 어스* | |
미디어 | OST · 관련 서적 · 레고 · 영화 · 애니메이션 · Minecraft Live · Minecraft Now · Minecraft Monthly | |
유저 콘텐츠 | ||
창작 요소 | 2차 창작 · 망토 · 맵 · 모드 (개발 · 팁 · 모드팩) · 애드온 · 팩 (리소스 팩 · 데이터 팩) · 외부 프로그램 · 핵 | |
멀티 콘텐츠 | 멀티플레이 · 서버 · 플러그인 · Realms · EULA | |
개발 | 개발 기초 · 모드 개발 · 플러그인 개발 | |
기타 | ||
이야깃거리 | 여담 · 커뮤니티 · 사건 사고 · 문제점 · 용어 · 지원 언어 · 머나먼 땅 · 이미테이션 게임 · 히로빈 | |
관련 문서 | 나무위키 마인크래프트 프로젝트 · 마인크래프트로 분류된 문서 · 마인크래프트의 하위 문서 | |
* 표시는 서비스가 종료되었거나 개발이 중단되었다는 표시이다. | }}}}}}}}} |
블록런처 | ||
Mod | Add-On | ModPE |
1. 개요2. 메소드
2.1. 기본 메소드2.2. ModPE 메소드2.3. Level 메소드2.4. Player 메소드2.5. Entity 메소드2.6. Item 메소드2.7. Block 메소드2.8. Server 메소드2.9. 이벤트 리스너2.10. 상수들
3. 유용한 스크립트4. 유용한 소스5. .modpkg6. 여담2.10.1. 채팅 색 상수2.10.2. 아이템 구분 상수2.10.3. 파티클 타입 상수2.10.4. Entity 타입 상수2.10.5. Entity 랜더러 타입 상수2.10.6. 갑옷 타입 상수2.10.7. 포션 효과 상수2.10.8. 월드구분 상수2.10.9. Block Face 상수2.10.10. 인첸트 상수2.10.11. Use Animation 상수2.10.12. EnchantType 상수2.10.13. BlockRenderType 상수
2.11. 네이티브 함수2.12. 유틸2.13. 렌더링(모델링) 관련 함수6.1. 동영상
1. 개요
마인크래프트 베드락 에디션의 비공식 런처인개발자는 Treebl이다. 블록런처의 개발자인 주웨이 장(Zhuowei Zhang)[1]이 블록런처에 ModPE 기능을 넣으면서 주웨이가 만든 것이라고 아는 사람들이 많다. ModPE 불러오기 메뉴에 'Treebl 의 공식 레포'가 있는 것이 이 때문이다.
ModPE 스크립트는 줄여서 스크립트라고 불리기도 한다. 따라서, 마인크래프트 PC에서의 스크립트(Skript) 플러그인과 혼동하는 경우도 꽤 있다.[2] 3세대 모드인 ModPE 스크립트는 1세대의 장점, 2세대의 장점을 합쳐 쉽고 정교하게 만들 수 있다. 참고로, 가능한 영역은 애드온이 스크립트보다 넓다. 애초에 애드온은 MCPE의 메소드를 직접 후킹하는 거라 절대적으로 자유도가 높으며, 들리는 소문에 의하면 블록런처에다가도 후킹이 가능하다고 한다.
이런 ModPE 스크립트를 제작하는 사람들을 한국에서는 스크립터라고 부르며 높은 퀄리티의 작품을 생산하는 사람들은 대부분 포럼에 가입되어 있다. 포럼은 전세계가 사용하고 이용자도 훨씬 많으니 어떻게 보면 당연한 것이다.
이 ModPE 스크립트는 JavaScript 기반으로 만들어졌다. 또한 Rhino 엔진을 기반으로 돌아가기 때문에 안드로이드 뷰를 사용할 수 있어 이걸로 GUI 구현이 가능하다. 진저브레드(안드로이드 2.3.x) 이하에서는 안드로이드 소스를 사용할 수 없다고 잘못 알려져 있으나, 실제로는 android.widget.Switch와 같은 일부 뷰[3]들을 제외하고는 정상적으로 작동한다. 과거, 버튼 생성 소스에 사용되는 android.widget.PopupWindow 부분에서 발생하는 오류를 보고, 당시 스크립트 제작자들이 잘못 판단한 듯. 하지만, PopupWindow 역시 소스만 아주 조금만 수정[4]해주면 진저브레드에서도 잘 작동한다.
ModPE는 블록런처가 브릿지 역할을 하여 ModPE → BlockLauncher (ScriptManager) → 블록런처 네이티브 함수 → MCPE 함수를 거쳐서 가기 때문에 처리속도가 느리다. 복잡한 작업하면서 ModPE에 속도는 기대하지 않는 것이 좋을 것이다. 게다가 자바스크립트 자체가 인터프리터를 쓰다보니 더더욱 속도는 느리다. 속도를 바란다면 MCPE를 직접 만지는 애드온을 파는게 좋다.
MCPE Master[5]라는 앱으로도 스크립트를 사용할 수 있으나, 100% 구동되지는 않는다. MCPE Master[6]에서는 블록런처와는 달리, 스크립트를 애드온이라고 불렀으나, 지금은 ModPE라고 부른다. 통칭 'Toolbox(툴박스)'라고 불리는 앱으로도 스크립트 사용이 가능했으나,[7] 1.1을 지원하는 버전부터는 GUI도 바뀌고 더 이상 ModPE가 지원되지 않는다. 덕분에 툴박스로 클라이언트를 사용하던 사람들에게 이는 청천벽력 같은 소식이다. 그 이유인 즉슨 툴박스로는 블록런처로 서버에서 작동하지 않는 메서드가 작동하기 때문.
해외에서는 스크립트라는 명칭 대신 js mod, ModPE Script 등으로 불린다. 참고로, 해외에서 .mod는 PTPatch[9]라고 불린다.
현재 블록런처가 지원하는 마인크래프트 버전은 1.14.1.5 이다. 그리고 롤리팝 이상에서만 작동하는 듯 하다. 킷켓 이하에서는 작동하지 않고 팅기는 현상이 발생했다.[10]
블록런치의 업데이트 속도가 마인크래프트의 업데이트 속도를 따라가지 않고 있다. 게다가 1.0.0 버전으로 오면서 많은 코드가 변경되면서 개발에 어려움이 있다고 한다. 심지어, 2020년 한 해 동안 블록런처의 업데이트가 없었다! 아예 스토어에서 내려가면서 ModPE 스크립트는 막을 내렸다.
다른 MCPE 모드들에 대한 설명은 상위 항목 참고
2. 메소드
ModPE의 메소드는 중복되는 것이 여러개 있다. 무엇을 선택하든 상관없다.하지만 이 문서에서는 setTile(); → Level.setTile(); 과 같이 부모가 있는 메소드를 쓰는것을 권장한다.
2.1. 기본 메소드
- addItemInventory(ItemId, ItemCount, ItemDamage); 인벤토리에 아이템 추가. 서바이벌모드에서 자주 쓰이며 인벤토리에 아이템을 추가한다 음수도 사용 가능[11] = Player.addItemInventory(ItemId, ItemCount, ItemDamage); 추천
bl_setMobSkin(par1Object, par2String);미 사용 = Entity.setMobSkin(entity, skin);bl_spawnMob(par1double, par2double, par3double, par4int, par5String);미 사용 = Level.spawnMob(x, y, z, entity, skin); 0.7.6 시절에는 사용하면 Level.spawnMob();를 사용하라는 문구가 떴었다.- clientMessage(Message); 채팅창에 메시지 추가 싱글 플레이 전용
- explode(x, y, z, power, onFire); 폭발 시키기. onFire이 true인 경우는 번개가 떨어졌을 때 처럼 불이 발생하는데, 그 불은 서버원에게 보이지 않으나, 데미지는 준다.
setTile();로 직접 설치하면 된다. - getCarriedItem(); 들고있는 아이템 반환 = Player.getCarriedItem(); 추천
- getLevel(); 현재 레벨 반환 용도 없음
- getPitch(entity); 엔티티의 상하값 반환 = Entity.getPitch(entity); 추천. -90~90 사이로 가져옴. 위쪽이 -90. 인자 생략시 플레이어의 상하값 반환.
- getPlayerEnt(); 플레이어 엔티티값 반환
- getPlayerX(); 플레이어 X좌표 반환
- getPlayerY(); 플레이어 Y좌표 반환
- getPlayerZ(); 플레이어 Z좌표 반환. 참고로 getPlayer식의 메소드는 소수 15자리까지 반환하며, 소수 부분을 버리려면 Math.floor 또는 parseInt();를 쓰면 된다.
16자리였나 - getTile(x, y, z); 좌표의 블록아이디 반환
- getYaw(entity); 엔티티의 좌우값 반환 = Entity.getYaw(entity); 추천. 인자 생략시 플레이어의 좌우값 반환.
- preventDefault(); 이벤트 취소. 일부 이벤트 리스너에서 서버원이 그 이벤트를 발생시키는 경우 작동하지 않음.
- print(Message); 토스트 메시지를 띄운다. 인터넷에 연결되거나 할때 화면 하단부분에 뜨는 메시지가 토스트이다.
먹는 토스트가 아니다 - rideAnimal(rider, animal); 동물을 태움 rider가 animal을 탐. 블록런처 1.11 ~ 1.11.1에서 사용시 아무 일도 일어나지 않거나 팅긴다.
- setNightMode(boolean); 항상 밤. true할 시 항상 밤이 된다. 0.11.x 시절까지 존재하던 네더 반응기를 사용하면 빠른 속도로 밤이 되고 시간이 멈추는데, 이와 동일한 방식으로 작동한다.
false를 입력한다고 항상 낮인 건 아니다 - setPosition(ent, x, y, z); 엔티티의 위치를 이동한다.[12] = Entity.setPosition(ent, x, y, z); 추천. 서버원에게 사용시 작동하지 않는다,
- setPositionRelative(Entity, AddX, AddY, AddZ); 엔티티의 위치를 이동한다[13] = Entity.setPositionRelative(AddX, AddY, AddZ); 추천
- setRot(Entity, yaw, pitch); 엔티티의 상하 좌우값 변경 그러나 잘안된다[14] = Entity.setRot(yaw, pitch); 추천
- setTile(x, y, z, id, damage); 블록 설치 메소드
- setVelX(Entity, value); 엔티티를 X방향으로 value 값만큼 속도를 준다 = Entity.setVelX(Entity, value); 추천 블록런처 1.16.x에서 정상적으로 작동하지 않는다.
- setVelY(Entity, value); 엔티티를 Y방향으로 value 값만큼 속도를 준다 = Entity.setVelY(Entity, value); 추천 블록런처 1.16.x에서 정상적으로 작동하지 않는다.
- setVelZ(Entity, value); 엔티티를 Z방향으로 value 값만큼 속도를 준다 = Entity.setVelZ(Entity, value); 추천 블록런처 1.16.x에서 정상적으로 작동하지 않는다.
spawnChicken(par1double, par2double, par3double, par4String);미사용, 함수이름보면 알겠지만 닭 스폰 함수이다.spawnCow(par1double, par2double, par3double, par4String);미사용, 함수이름보면 알겠지만 소 스폰 함수이다.spawnPigZombie(par1double, par2double, par3double, par4int, par5String);미사용, 함수이름보면 알겠지만 돼지좀비 스폰 함수이다.
2.2. ModPE 메소드
- ModPE.dumpVtable(par1String, par2int); 메소드를 덤프하지만 쓰이지 않는다.
- ModPE.getBytesFromTexturePack(par1String); 택스쳐팩의 ByteArray를 반환한다.
- ModPE.getOS(); OS의 버전이 아닌 이름을 반환한다. 버전명이나 API 레벨을 원한다면 android.os.Build에 있는 것들을 사용하면 된다.
- ModPE.getMinecraftVersion(); 마인크래프트의 버전을 가져온다.
- ModPE.langEdit(key, name); 아이템 이름 변경용이라고 잘못 알려져 있는 함수로서, 마인크래프트 내의 언어 파일의 내용을 수정한다. 즉, 아이템 이름 변경 뿐만 아니라, 버튼에 들어가는 문구나 노란색 글자로 채팅창에 뜨는 알림, 사망시 스크린에 쓰는 내용 등도 수정할 수 있다.
- ModPE.leaveGame(); 맵 밖으로 나간다. 일정 확률로 팅기는 경우가 있다.
- ModPE.log(par1String);
- ModPE.openInputStreamFromTexturePack(par1String); 택스쳐팩 파일의 InputStream을 반환한다.
- ModPE.overrideTexture(path, url); url의 텍스쳐 파일을 path의 경로에 추가한다. Entity.setMobSkin(); 등에서 텍스쳐 부분에 mob/추가한 이미지.png 처럼 사용할 수 있다. 캐시를 생성하며, 인터넷 연결이 필요하다.
- ModPE.readData(name); 해당 이름에 저장된 값을 불러온다. 저장한 내용을 전역에서 불러오는 경우, 정상적으로 작동하지 않는다.
- ModPE.removeData(name); 해당 이름에 저장된 값을 지운다.
- ModPE.resetFov(); 플레이어의 시야 범위를 초기화시킨다.
- ModPE.resetImages(); ModPE.ovrrrideTexture();나 ModPE.setItems();에 의한 텍스쳐 파일들의 변화를 원상태로 되돌려놓는다.
- ModPE.saveData(name, value); 해당 내용에 해당 값을 저장한다. 변수와 달리 블록런처를 종료해도 저장되며, 스크립트 간 공유는 불가능.
파일 입출력이라는 상위호환이 있기 때문에 잘 쓰이지 않는다 - ModPE.selectLevel(mapDir); 해당 맵으로 이동한다. 일정 확률로 팅기며, 맵의 이름이 아닌, 폴더명(Level.getWorldDir();로 확인 가능)이 기준이다.
- ModPE.setCamera(entity); 시야를 해당 엔티티의 시야로 바꾼다. 블록 설치나 파괴 가능.
- ModPE.setFoodItem(itemId, texture, textureIndex, par4int, itemName, par6int); 음식을 추가한다. (ModPE.setFoodItem(아이템 코드, 아이템 텍스쳐, 아이템 텍스쳐 데미지, 회복량(1이 반칸), 아이템이름, 최대 개수);
- ModPE.setFov(fov); 플레이어의 시야를 fov로 설정한다. 음수 가능.
- ModPE.setGameSpeed(tickForSecond); 게임속도를 설정한다. 초당 몇 틱이 흐를지 결정. 20틱이 1초이다.
- ModPE.setGuiBlocks(par1String); 아이템이 인벤토리 핫바에 보이는 이미지를 바꿀때 쓴다.
근데 왜 인자가 1개지 - ModPE.setItem(itemId, texture, textureIndex, itemName, par5int); 아이템을 추가한다. (ModPE.setItem(아이템 아이디, 아이템 텍스쳐, 아이템 텍스쳐 데미지, 아이템 이름, 한 슬롯에 넣을 수 있는 최대 개수); 와 같은 형식
이런식으로 쓰니 뭔가 길다) 아이템 아이디는 최대 511까지만 가능했었으나, 지금은 4095까지로 확장된 상태이다. ModPE.setItems(url); items-opaque.png파일을 해당 url의 파일로 수정하는 함수이나, 지금은 작동하지 않는다.- ModPE.setTerrain(par1String); 택스쳐팩의 Terrain을 덮어씌운다.
- ModPE.showTipMessage(message); 화면에 마인카트 탑승시와 같은 위치에 메시지 출력.
- ModPE.takeScreenshot(fileName); 스크린샷을 찍는다. 버튼 소스에 넣으면 0.11.1부터 작동하지 않으며, 네이티브 함수로 사용하면 작동한다.
버튼에 넣으면 튕긴다.네이티브 쓰면 안팅긴다
2.3. Level 메소드
- Level.addParticle(ParticleType, x, y, z, velX, velY,velZ, size); 특정 좌표에 특정 파티클을 생성한다. ParticleType는 아래 상수 문단의 객체나 숫자 코드로도 쓸 수 있다. velX,Y,Z는 각각 파티클이 움직이는 방향이다. size의 경우, 몇몇 파티클에서는 크기가 아닌, 다른 것과 관련되어있다. 블록런처 1.16.x에서 고장났으나, 개발자의 트위터에 고쳤다는 트윗이 블록런처 베타 버전 다운로드 링크와 함께 올라와 있다. 아직 Play 스토어에서는 업데이트가 반영되지 않은 듯.
괄호 안 내용이 신경쓰이는건 기분탓 - Level.addParticle(ParticleType, x, y, z, R, G, B, size); 파티클 타입을 spell로 했을 시에만 사용 가능하다. R, G, B의 각각 자리에 RGB값을 넣어 원하는 색으로 설정이 가능하다.
- Level.biomeIdToName(biomeId); 바이옴의 아이디를 이름으로 출력한다. Level.getBiome으로 딴는것인데 바이옴 ID에서 바이옴 이름을 취득하는 함수다.
- Level.destroyBlock(x, y, z, shouldDrop); 해당 위치의 블록을 파괴한다. function destroyBlock을 호출하지 않으며, 0.12.1 이상에서는 shouldDrop이 false여도 블록이 드롭된다(shouldDrop이 true이면 드롭, false이면 드롭X).
- Level.dropItem(x, y, z, height, id, amount, damage); 해당 위치에 해당 아이템이 height만큼 위로 튀어나오면서 드롭된다. 멀티를 지원하는 스크립트에서 addItemInventory 대용으로 사용된다.[15]
- Level.explode(x, y, z, onFire); explode();와 동일. onFire에 true를 넣으면 폭발시, 불이 붙고 false면 붙지 않는다. 몇몇 기기에서는 이 함수로 발생시킨 불이 서버원에게 보이지 않는다.
- Level.getAddress(); 서버에 접속하고 있으면 그 서버의 아이피를 딴다.
싱글플레이어에서는 뭐가 반환될까?null이 아닐까?Server.getAddress();는 null을 반환하던데...내부 ip나 공인 ip를 반환하지 않을까? 그것도 아니면 127.0.0.1? - Level.getBiome(x, z); 해당 좌표의 바이옴 아이디를 가져온다.
- Level.getBiomeName(x, z); 해당 좌표의 바이옴 이름을 가져온다.
- Level.getBrightness(x, y, z); 해당 좌표의 밝기를 가져온다
- Level.getChestSlot(x, y, z, slot); 해당 좌표에 있는 창고의 해당 슬롯에 있는 아이템의 아이템 아이디를 반환. slot은
당연히0부터 시작 - Level.getChestSlotCount(x, y, z, slot); 해당 좌표에 있는 창고의 해당 슬롯에 있는 아이템의 개수를 반환
- Level.getChestSlotData(x, y, z, slot); 해당 좌표에 있는 창고의 해당 슬롯에 있는 아이템의 아이템 데미지를 반환
- Level.getData(x, y, z); 해당 좌표에 있는 블록의 블록 데미지를 반환.
- Level.getFurnaceSlot(x, y, z, slot); 화로 안에 해당 슬롯에 들어있는 아이템에 대한 아이디를 가져오는 것이다. 화로 슬롯은 0은 재료,1은 연료,2는 완성품이다.
이것을 이용하면 화로에 TNT를 넣으면 폭발하게 할수 있다! - Level.getFurnaceSlotCount(x, y, z, slot); 화로 안에 해당 슬롯에 있는 아이템의 대한 개수를 가져오는 것이다.
- Level.getFurnaceSlotData(x, y, z, slot); 화로 안에 해당 슬롯에 있는 아이템의 대한 아이템 데이터 값을 가져오는 것이다.
- Level.getGameMode(); 게임 모드를 불러옴. 서바이벌은 0, 크리에이티브는 1. 블록런처 1.16.x에서 고장.
- Level.getGrassColor(x, z);
- Level.getSignText(x, y, z, line); 해당 위치에 있는 표지판의 line번째 줄의 내용을 가져옴. line은 0부터 시작.
- Level.getTile(x, y, z); getTile();과 동일.
- Level.getTime(); 현재의 마인크래프트에서의 시간을 불러옴.
0을 시작으로 24000마다 하루가 지난다 - Level.getWorldDir(); 현재 들어가 있는 맵의 폴더명을 불러옴.
- Level.getWorldName(); 현재 들어가 있는 맵의 이름을 불러옴
- Level.playSound(x, y, z, sound, volume, pitch); 해당 위치에서 해당 소리가 나도록 한다. pitch는 음정이다. 1은 정상소리이다. 낮추면 음정이 낮아지고, 높이면 음정이 높아진다.
마인크래프트 명령어 /playsound에서 쓰이는것과 비슷함소리는 Minecraft Wiki 소리 파일을 참고하시길... - Level.playSoundEnt(ent, sound, volume, pitch); 해당 엔티티가 해당 소리를 내도록 한다.
- Level.setChestSlot(x, y, z, slot, id, damage, amount); 해당 위치에 있는 창고의 해당 슬롯의 아이템을 설정함.
블록런처 1.9.7에서 오류 발생(오류 내용이 '아직은 사용할 수 없습니다'였다). 다른 함수들과 달리 개수보다 데미지가 먼저 나옴. - Level.setFurnaceSlot(x, y, z, slot, ItemId, ItemDamage, ItemCount);
이건 다른 메소드 아이디,개수,데미지 순서와 다르게 아이디,데미지,개수 순서다 - Level.setGameMode(gameMode); 게임모드 설정. 서바이벌은 0, 크리에이티브는 1. 블록런처 1.16.x에서 고장. 실제 게임모드와 Level.set/getGameMode();로 바뀐 게임모드가 별개로 작동하는 듯.
- Level.setGrassColor(x, z, RGB); 잔디색깔을 넣을 수 있다. 이것도 RGB값을 넣을 수 있다.
- Level.setNightMode(value); value가 true면 밤으로 시간을 고정한다. false이면 평소대로 시간이 흐른다. 지금은 삭제된 네더 반응기를 활성화시켰을 때 밤이 되는 것 처럼 바뀐다.
- Level.setSignText(x, y, z, line, value); 해당 위치에 있는 표지판의 line번째 줄의 내용을 value로 설정. line은 0부터 시작.
- Level.setSpawn(x, y, z); 해당 지점을 스폰 지점으로 설정한다.
그런데 다른 플레이어의 스폰 지점까지 그곳으로 지정된다 - Level.setSpawnerEntityType(x, y, z, entityId); 몹 스포너에서 스폰되는 몹 타입을 설정한다.
- Level.setTile(par1int, par2int, par3int, par4int, par5int); setTile();과 동일.
- Level.setTime(time); 시간 설정.
역시 24000이 하루이다0.12.1 이후부터 24000으로 바뀐 것이다. 0.11.1 이하에서는 19200이였다.블록런처 1.16.x에서 살짝 고장났다. 시간 변동이 바로 적용되지 않는다. - Level.spawnChicken(x, y, z, skin); 닭 소환 함수이다.
쓸모있나?대부분 Level.spawnMob(); 사용. - Level.spawnCow(x, y, z, skin); 소 소환 함수이다.
쓸모있나?대부분 Level.spawnMob(); 사용. - Level.spawnMob(x, y, z, entityType, skin); 해당 위치에 해당 엔티티 타입 아이디를 가진 엔티티를 해당 스킨을 씌워서 소환. 스킨 생략 시, 기존의 스킨으로 스폰됨. 화염구 등의 일부 엔티티에는 스킨 설정이 안됨.
- Level.executeCommand(command, boolean); 콘솔 명령어로 명령어를 실행한다. boolean에는 출력 결과[16]를 보여줄지 말지 인데, false로 하면 무슨 이유인지 맵에서 아예 튕겨버린다. true로 하면 문제없다. 참고로, 블록런처 1.15.x 시절에는 인자가 하나밖에 없었다. 그래서, 1.15.x에 맞추어서 만들었던 스크립트를 1.16.x에서 사용하다가 팅기는 경우[17]도 있다.
2.4. Player 메소드
Player 객체에 속한 메소드들은 원래는 이벤트 useItem과 같은 리스너 내부에서 사용하면, 해당 이벤트를 일으킨 플레이어(서버원 포함)을 기준으로 작동하야 하나, 그렇지 아니하는 함수들도 많다.- Player.addItemCreativeInv(id, damage, count); id damge count순으로 넣는다. 크리에이티브 인벤토리에 아이템을 추가한다
- Player.addItemInventory(id, count, damage); addItemInventory();와 동일
- Player.canFly(); 플레이어의 공중 부양 가능 여부를 불리언 값으로 가져온다. 블록런처 1.15.x 이후 고장, 최신 버전에서 돌아옴.
- Player.clearInventorySlot(slot); 해당 인벤토리 슬롯의 아이템을 제거한다
- Player.getArmorSlot(slot); 플레이어가 입은 갑옷의 아이디를 반환한다
- Player.getArmorSlotDamage(slot); 플레이어가 입은 갑옷의 데미지를 반환한다
- Player.getCarriedItem(); 플레이어가 든 아이템을 반환 (useItem 이벤트 리스너에서는 4번째 매개변수가 동일한 역할을 한다.)
- Player.getCarriedItemCount(); 플레이어가 든 아이템 개수를 반환
- Player.getCarriedItemData(); 플레이어가 든 아이템 데미지를 반환한다.(useItem 이벤트 리스너에서는 7번째 매개변수가 동일한 역할을 하는데, 과거 그 7번째 매개변수가 정상적으로 작동하지 않았던 적이 있다. 아직도 그러는지는 직접 확인해보길 바란다.)
- Player.getDimension(); 플레이어가 있는 월드를 반환 (오버월드, 네더월드, 엔더월드)
- Player.getEntity(); 플레이어 엔티티 반환. getPlayerEnt();와 동일.
- Player.getHunger(); 플레이어 허기 반환.
- Player.getInventorySlot(slot); 인벤토리 슬롯의 아이템 반환
- Player.getInventorySlotCount(slot); 인벤토리 슬롯의 개수 반환
- Player.getInventorySlotData(slot); 인벤토리 슬롯의 데미지 반환
- Player.getName(entity); 플레이어의 이름을 반환한다. 플레이어가 아닌 경우, "Not a Player" 반환. 정확히는 이름이 아닌, 이름표를 가져온다. 따라서, 중간에 이름표가 바뀌면, 원래 닉네임이 아닌, 바뀐 이름으로 반환한다.
- Player.getPointedBlockData(); 플레이어가 바라보고있는 블록의 데이터를 반환한다.[18]
- Player.getPointedBlockId(); 플레이어가 바라보고있는 블록의 아이디를 반환한다
- Player.getPointedBlockSide(); 플레이어가 바라보고있는 블록의 면을 반환한다
- Player.getPointedBlockX(); 플레이어가 바라보고있는 블록의 x좌표를 반환한다
- Player.getPointedBlockY(); 플레이어가 바라보고있는 블록의 y좌표를 반환한다
- Player.getPointedBlockZ(); 플레이어가 바라보고있는 블록의 z좌표를 반환한다
- Player.getPointedEntity(); 플레이어가 바라보고있는 블록의 엔티티를 반환한다
- Player.getSelectedSlotId(); 플레이어가 선택한 슬롯을 반환한다
- Player.getX(); 플레이어의 x좌표를 반환한다. getPlayerX();와 동일.
- Player.getY(); 플레이어의 y좌표를 반환한다. getPlayerY();와 동일.
- Player.getZ(); 플레이어의 z좌표를 반환한다. getPlayerZ();와 동일.
- Player.isFlying(); 플레이어가 날고있는지 반환한다. 블록런처 1.15.x 이후 고장, 최신 버전에서 돌아옴.
- Player.isPlayer(entity); 엔티티가 플레이어인지 아닌지를 반환한다.
- Player.setArmorSlot(slot, id, damage); 플레이어에게 해당 갑옷을 입힌다.
- Player.setCanFly(boolean); 플레이어의 공중 부양 가능 여부를 설정한다. 블록런처 1.15.x 이후 고장, 최신 버전에서 돌아옴.
- Player.setFlying(boolean); 플레이어의 공중 부양 여부를 설정한다. 블록런처 1.15.x 이후 고장, 최신 버전에서 돌아옴.
- Player.setHealth(value); 플레이어의 체력을 설정한다. 0.12.1부터는 서버원에게 사용 시 바로 반영되지 않는다. 체력을 6 높게 설정하고, 즉시 데미지 포션 효과를 주어 다시 6을 깎는 꼼수가 존재한다.
- Player.setSelectedSlotId(slot); 플레이어의 슬롯을 설정한다.
- Player.setItemCustomName(slot, name); 해당 슬롯에 있는 아이템의 이름을 바꾼다.
- Player.enchant(slot, enchant, power); 해당 슬롯에 있는 아이템을 해당 강도로 인첸트한다.
- Player.getEnchantments(slot); 해당 슬롯에 있는 아이템에 한 인첸트를 배열로 반환한다. 객체 배열이며, .type은 인첸트 코드, .level은 인첸트 레벨이다.
2.5. Entity 메소드
- Entity.addEffect(ent, mobEffect, par3int, par4int, par5boolean, par6boolean); ent(엔티티의 엔티티 값
드립?)에 해당하는 엔티티에 mobEffect[19]에 해당하는 효과를 par4int 세기로 par3int틱(20틱이 1초)만큼 준다. par5boolean, par6boolean은모르는 사람이 많다.보통 false, true로 써넣는데 par5boolean은 신호기에서 효과를 얻었는지쓸모있나?, par6boolean은 포션 이펙트(그 골뱅이같이 생겨가지고 포션먹으면 올라오는거)를 보이게 할지 말지를 결정하는 것이다.(네이버나 엠코같은곳에 검색해서 보는걸 추천한다. 이 메서드(정확히는 익명 함수 표현식)은 설명이 길다.) - Entity.getAll(); 맵 전체의 엔티티를 배열로 불러온다.
- Entity.getAnimalAge(ent); 엔티티의 나이를 가져온다.
되는지는 모르겠다. - Entity.getCarriedItem(ent); 1.17.3에 추가 된 메소드.
이게 이제서야 나오다니엔티티가 들고 있는 아이템 아이디를 가져온다. - Entity.getCarriedItemCount(ent); 1.17.3에 추가 된 메소드. 엔티티가 들고 있는 아이템의 개수를 가져온다.
- Entity.getCarriedItemData(ent); 1.17.3에 추가 된 메소드. 엔티티가 들고 있는 아이템의 데이터를 가져온다.
- Entity.getEntityTypeId(ent); 엔티티의 엔티티 타입 아이디[20]를 가져온다.
- Entity.getHealth(ent); 엔티티의 체력을 가져온다.
- Entity.getItemEntityCount(ent); 드롭된 아이템의 개수를 가져온다.
- Entity.getItemEntityData(ent); 드롭된 아이템의 데이터를 가져온다.
- Entity.getItemEntityId(ent); 드롭된 아이템의 아이디를 가져온다.
- Entity.getMaxHealth(ent); 해당 엔티티의 최대 체력을 가져온다.
- Entity.getMobSkin(ent); 엔티티의 스킨의 값을 가져온다.
- Entity.getNameTag(ent); 엔티티의 이름표를 가져온다. 플레이어에게 사용 시 Player.getName();과 동일하나, 해당 엔티티가 없거나, 이름표가 없으면 Not a Player 대신 null이 반환된다.
- Entity.getPitch(ent); 엔티티의 상하 시야값을 가져온다. 아래 뱡향이 양수이다.
- Entity.getRenderType(ent); 엔티티의 랜더타입을 가져온다.
- Entity.getRider(ent); 엔티티가 타고있는 엔티티를 반환한다.
- Entity.getRiding(ent); 엔티티를 타고있는 엔티티를 반환한다.
- Entity.getTarget(ent); 엔티티가 누구를 공격하고 있는지 가져오는 함수로 만들려고 했던 것 같다. 0.14.1 기준으로 뭔가 이상하다.
- Entity.getUniqueId(ent); 초기엔 UUID를 반환했으나 지금은 엔티티 값을 반환한다.
- Entity.getVelX(ent); 엔티티가 X축 방향으로 이동하는 속도를 가져온다.
- Entity.getVelY(ent); 엔티티가 Y축 방향으로 이동하는 속도를 가져온다.
- Entity.getVelZ(ent); 엔티티가 Z축 방향으로 이동하는 속도를 가져온다.
- Entity.getX(ent); 엔티티의 x좌표를 가져온다.
- Entity.getY(ent); 엔티티의 y좌표를 가져온다.
- Entity.getYaw(ent); 엔티티의 좌우 시야값을 가져온다.
- Entity.getZ(ent); 엔티티의 z좌표를 가져온다.
- Entity.isSneaking(ent); 해당 엔티티가 숙이기를 사용하는 중인지 가져온다.
- Entity.remove(ent); 해당 엔티티 삭제. 플레이어에게 사용시 그 플레이어는 팅긴다. 0.8.1 이하에서는 해당 플레이어 유령화.
- Entity.removeAllEffects(ent); 엔티티의 모든 포션 효과를 지운다.
- Entity.removeEffect(ent, mobEffect); 엔티티에게서 특정 포션효과를 지운다.
- Entity.rideAnimal(rider, animal); rideAnimal();과 동일. 블록런처 1.11 ~ 1.11.1에서 사용시 아무 일도 일어나기 않거나 팅긴다.
- Entity.setAnimalAge(ent, age); 엔티티의 나이를 설정한다 age는 틱단위.
아기 좀비 등을 만들고 싶다면, 네이티브 함수인 ScriptManager.nativeZombieSetBaby(); 함수를 사용하는 것을 추천한다.현재 네이티브함수가 삭제되어 아기 좀비등을 만들수 없다. - Entity.setCape(ent, skin); 망토 설정 함수. 미작동
- Entity.setCarriedItem(ent, itemId, amout, itemDamage); 해당 엔티티가 해당 아이템을 들고 있도록 설정.
- Entity.setCollisionSize(ent, x, y); 해당 엔티티의 충돌 크기 설정. 크기를 0, 0으로 하면 벽 통과, 음수로 하면 블록 통과가 된다. 1.16.x에서는 정상적으로 통과가 되지 않는다.
- Entity.setFireTicks(ent, sec); 해당 엔티티를 sec초 동안 태운다.
- Entity.setHealth(ent, value); 해당 엔티티의 체력을 value로 설정한다. 0.12.1 부터는 서버원에게 사용시 바로 반영되지 않는다.
- Entity.setImmobile(ent, isImmobile); 해당 엔티티를 움직이지 않는 엔티티로 설정한다. isImmobile을 true로 하면 움직이지 않고, false로 하면 움직인다. 이전에는 플레이어에게 사용하면 적용이 되지 않았지만, 최근 버전부터는 된다.
- Entity.setMaxHealth(ent, value); 해당 엔티티의 최대 체력을 value로 설정한다.
- Entity.setMobSkin(ent, skin); 엔티티의 스킨 설정.
- Entity.setNameTag(ent, name); 엔티티의 이름을 바꾼다. 플레이어에게도 적용된다. 채팅,맵 내 이름표, Player.getName();이 반환하는 이름은 바뀌는데 어찌된 영문인지 접속자 목록에서 플레이어를 확인해보면 서버를 연 사람 이외는 변경 이전 닉네임(최초 맵 접속 닉네임)으로 돼있다.
- Entity.setPosition(ent, x, y, z); setPosition();과 동일
- Entity.setPositionRelative(ent, x, y, z); 현재위치에서 x y z값을 더해 움직인다.
- Entity.setRenderType(ent, renderId); 엔티티의 랜더를 설정한다.
- Entity.setRot(ent, yaw, pitch); 엔티티의 시야를 바꾼다 setRot();와 동일하게 잘작동되지않는다.
- Entity.setSneaking(ent, isSneak); 엔티티를 숙이기 한다. 근데, 0.12.1 이후부터 플레이어일 경우 됐다가 다시 풀린다.
- Entity.setTarget(ent1, ent2); ent1이 ent2를 공격하도록 설정한다. 단, ent1이 닭이나 돼지와 같은 공격을 하지 않는 엔티티인 경우, 작동X.
- Entity.setVelX(ent, value); setVelX();과 동일.
- Entity.setVelY(ent, value); setVelY();과 동일.
- Entity.setVelZ(ent, value); setVelZ();과 동일.
Entity.spawnMob(par1double, par2double, par3double, par4int, par5String);Level.spawnMob으로 대체됨.
2.6. Item 메소드
- Item.addCraftRecipe(par1int, par2int, par3int, par4Scriptable); 0.8.1 이하에서의 조합법 추가 함수. 사용법은 Item.addCraftRecipe(결과물 아이템코드, 개수, 아이템데미지, [재료1 아이템코드, 재료1 개수, 재료1 아이템데미지, 재료2 아이템코드...]); 재료는 1개든 2개든 상관없다. 블록런처 1.10.x부터 이 함수로 조합법을 추가한 경우, 서버원이 인벤토리를 열면 해당 서버원이 팅긴다.
근데 10개 이상이면 작업대에서도 조합이 불가하므로 안 되지 않을까0.8.1 이하에서는 조합창에 조합법이 뜨지 않았으며, 10개 이상이여도 조합법이 떴다. 무료 조합 모드와 함께 사용하면 편리했었던 함수였다. - Item.addFurnaceRecipe(par1int, par2int, par3int); 화로 조합법 추가 함수. 사용법은 Item.addFurnaceRecipe(재료 아이템코드, 결과물 아이템코드, 결과물 아이템데미지);
- Item.addShapedRecipe(par1int, par2int, par3int, par4Scriptable, par5Scriptable); 0.9.0 이상에서의 조합법 추가 함수. 사용법은 Item.addShapedRecipe(결과물 아이템코드, 결과물 개수, 결과물 아이템데미지, ["맨 윗줄 조합법", "가운데 줄", "아랫줄"], [재료1 지칭문자, 재료1 아이템코드, 재료1 아이템데미지
여기 뒤에 지칭문자를 더 추가할수 있다]);뭐가뭔지 모르겠다Item.addCraftRecipe처럼 ... 부분에 재료2, 재료3...을 추가할 수 있다. 그리고 지칭문자는 뭐고 맨윗줄 가운데줄 아랫줄에 뭘 써야될 지가 궁금할 텐데 만약 조합법을 ["ABA", "BAB", "ABA"], ["A", 1, 0, "B", 3, 0]참고로 띄어쓰기를 하면 빈공간이 된다이라고 입력했을 때 A 자리에 돌(1:0)이 들어가고 B 자리에 흙(3:0)이 들어간 조합법대로 조합이 가능한 것이다.솔직히 돌 5개랑 흙 4개로 조합할 게 뭐가 있을까이래도 이해가 안 되면초록창에 검색해 보아라블록런처 1.15.x을 기준으로, 이 함수를 통해 서버원이 가지고 있지 않은 조합법을 서버장이 가지고 있으면, 서버원이 인벤토리를 열면 그 서버원이 팅긴다. 서버원이 동일한 조합법을 추가하는 스크립트를 적용하고 들어오면 팅기지 않는다. - Item.defineArmor(itemId, itemIcon, damage, armorName, armorTexture, durability, armorDurability, armorType); 이 메소드로 갑옷을 추가할 수 있다! 사용법은 ModPE.setItem과 유사하다 볼 수 있다. Item.defineArmor(아이디,meta에서 가져온 이름,meta에서 가져온 이름의 인덱스,갑옷이름,해당 갑옷 택스쳐 경로,갑옷표시에 차는 양(1에 갑옷모양 반칸),내구도,갑옷 타입); 이다.갑옷 타입은 ArmorType.helmet/chestplate/leggings/boots 이며, 그냥 상수(0, 1, 2, 3)로 적어도 된다.
- Item.defineThrowable(par1int, par2String, par3int, par4String, par5int); 무려 던질 수 있는 아이템을 추가할 수 있다! ModPE.setItem();과 사용법이 같다.
- Item.getName(itemId, itemDamage, par3boolean); 아이템의 이름을 가져온다. par3boolean이 false라면 "돌"과 같은 형식으로, true라면 "item.block.stone"과 같은 형식으로 가져온다. 참고로, 블록런처 1.15.7에서는 둘 다 동일하게 "돌"과 같은 형식으로 가져오며, 블록런처 1.16.x부터는 다시 원래대로 가져오는 듯 하다.
- Item.isValidItem(itemId); 해당 아이템 아이디를 가진 아이템이 존재하는지를 반환한다. for문, Item.getName();과 함께 사용하면 노가다를 하지 않고도 아이템 목록을 만들 수 있다!
하지만, 아이템 데미지 부분은 약간 노가다가 필요하다. - Item.setCategory(par1int, par2int, par3int); 아이템의 분류(장식 블록, 건축 블록, 도구 등)를 설정한다.
- Item.setHandEquipped(itemId, isEquipment); 아이템을 들고 있을 때, 도구처럼 들고 있을 지를 설정한다.
- Item.setMaxDamage(itemId, damage); 아이템의 내구도를 설정한다.
- Item.setProperties(itemId,{"foil":true or false});
인첸트가 적용 된 아이템같이 빛나는 효과 처럼 설정한다. - Item.setAllowOffhand(itemId,true or false); 1.2부터 추가된 왼손에서 아이템을 들게 해준다.
당연히 true로 해야 들리고, 아이템코드칸에 Block.getAllBlockIds()을 집어넣어주면 모든 블럭을 놓을 수 있다.
2.7. Block 메소드
- Block.defineBlock(id, name, par3Object, par4Object, par5Object, par6Object);
- Block.getAllBlockIds(); 존재하는 모든 블록의 아이디들을 배열로 반환한다. 맵에 존재하는 블록들을 가져오는게 아니다.
- Block.getRenderType(id); 블록 렌더러 타입을 반환한다.
- Block.setColor(id, array); 블록의 전체적 색감을 변경한다 array는 [0xFFFFFF] 처럼 int 형이 들어가야하며 배열의 개수에 따라 데미지가 달라진다. 블록런처 1.15.2 기준으로
또고장. 1.15.7까지도 고쳐지지 않았다. - Block.setDestroyTime(id, time); 블록을 부술 때 걸리는 시간을 변경한다. time을 -1로 하면 베드락처럼 캐지지 않는다. 서버원에게는 반영되지 않는다.
- Block.setExplosionResistance(id, Resistance); 블록이 폭발 데미지에서 버티는강도를 정한다. Block.setDestroyTime();과는 달리 -1을 넣으면 잘 터진다.
근데 이게 너무 잘터진다0.15.x 이후로 고장난 듯 하며, 블록런처 1.15.7에서는 싱글 기준으로 이 함수를 사용한 블록이 캐지지 않는다..! - Block.setLightLevel(id, value); 블록의 내뿜는 빛의양을 조절한다. 값은 0~15. 16 이상은 빛을 내뿜지 않는다.(블록 자체에서 나는 빛의 양 조절)
- Block.setLightOpacity(id, value); 블록의 빛 투과도를 설정한다.
- Block.setRenderLayer(id, type); 블록의 투명도 같은 것을 설정한다.
- Block.setRenderType(id, type); 블록의 모양을 설정한다.
- Block.setShape(id, minX, minY, minZ, maxX, maxY, maxZ); 블록의 모양을 바꾼다. 블록픽셀을 1px이라하면 1.0은 16px이다. 만약 minX를 0.5로 하면 블록의 시작부분이 8px이후로 시작하는거다. maxY를 0.1로 하면 얇게 깔리는 블록등을 만들수있다. 0, 0, 0, 1, 1, 1이 일반적인 크기이며, 음수나 1 초과의 수가 들어가도 된다. 심지어 분수도 된다. 그래서 ?/16을 입력하면 픽셀단위로 수정이 가능하다. y 크기를 음수부터 음수까지로 하는 방식으로 블록 여러개가 한 칸에 들어가도록 하여 신호기를 구현할 때 사용되었던 적도 있다.
2.8. Server 메소드
- Server.getAddress(); 서버의 ip 주소를 반환한다. 도메인 서버의 경우에도 ip로 반환했었다. 중간부터는 도메인으로 반환하였으나, 지금은 다시 ip로 반환한다.
- Server.getAllPlayerNames(); 모든 서버원의 이름을 배열로 반환한다.
- Server.getAllPlayers(); 모든 서버원의 엔티티 아이디를 배열로 반환한다.
- Server.getPort(); 서버의 포트를 반환한다.
그래봤자 19132 - Server.joinServer(address, port); 서버에 접속한다.
- Server.sendChat(message); 서버로 채팅 메세지를 보낸다. 단순히 채팅창에 메시지를 출력하는 clientMessage(message); 와는 다르게 채팅을 보내는 함수이니 자동으로 이름이 붙혀진다. 가끔 서버원들도 보이는 메시지를 구현하기 위해 자동으로 붙여지는 이름을 때서 사용한다. 서버장이 사용하는 경우는 작동하지 않지만, 이 함수를 호출하면 실행되는 네이티브 함수인 net.zhuoweizhang.mcpelauncher.ScriptManager.nativeSendChat(message);를 사용하면 작동한다. 0.14.0에서는 서버장이 사용하는 경우, nativeSendChat();을 사용하여도 일부 기종에서 작동하지 않는다. 이 경우는 clientMessage();를 함께 사용하면 작동한다. 그리고 최신버전에서 고쳐졌으나, 0.15.0에서 다시 고장나더니, 이제는 블록런처에서 nativeSendChat 부분이 삭제[21]되었다. 들리는 소문에 의하면 툴박스에서는 작동하다. 툴박스 제작자의 실력이면 충분히 고칠 수 있어서, 제작자가 고친건지, 마크의 구조가 다시 바뀌어서 블록런처에서 지워지지만 않았으면 다시 작동했었을 것인지는 모른다.
아니면, 0.15.0 시절에 고장났던게 사실 고장난게 아니라 주웨이가 지웠을 가능성도 있다.지금은 마크 내의 명령어를 실행시키는 Level.executeCommand(); 메소드에서 /say나 /title 명령어 등을 실행키켜서 전체 채팅이나 이와 유사한 기능을 구현하여 사용한다. 그리고, 지금은 다시 작동한다.
2.9. 이벤트 리스너
기본 지급하는 콜백 함수들이다. 일부 함수들은 멀티플레이를 지원하지 않는다. '이벤트 함수' 등으로 불리는 경우도 있으나, '이벤트 리스너'가 정확한 명칭이다. 몇몇 이벤트 리스너들은 preventDefault(); 함수를 사용하여, 해당 이벤트가 취소되도록 할 수 있다.- function useItem(x, y, z, itemid, blockid, side, itemDamage, blockDamage) 블록을 터치했을때 호출된다. 0.11.1 이상부터 서버원이 문 창고, 케이크 등을 터치한 경우는 호출되지 않는다. 블록런처 1.17 베타 11 버전 기준으로 getPlayerEnt() 또는 Player.getEntity() 사용 시 서버원이 인식되지 않는다.
- function attackHook(attacker, victim) '플레이어가 때릴 시 호출'이였으나, 지금은 몹들이 때리는 경우도 호출되는 듯 하다.
- function chatHook(str) 해당 스크립트를 적용한 플레이어가 채팅을 했을때 호출된다. 과거에는 채팅의 내용이 /로 시작하면 proCmd만 호출되고 chatHook은 호출되지 않았다.
- function procCmd(cmd) 해당 스크립트를 적용한 플레이어가 커맨드(/로 시작)를 쳤을때 호출된다. (/ 뒤에 나오는 문자열이 저장된다.)
MCPE Master에서는 미작동인것 같다.0.16.0 이상에서는 마인크래프트 자체의 명령어를 활성화시키면 호출되지 않았으며, 지금은 호출된다. - function destroyBlock(x, y, z, side) 블록을 부수었을 때 호출된다.
- function startDestroyBlock(x, y, z, side) 블록을 부수기 시작할 때 호출된다.
- function continueDestroyBlock(x, y, z, side, progress) 블록을 부수는 도중에 호출되는 함수로 추정된다.
- function eatHook(hearts, saturationRatio) 음식을 먹었을때 호출된다. hearts는 0.11.1 이하 기준의 체력 회복량, saturationRatio는 허기 전체를 1로 보았을 때를 기준으로 허기가 차오르는 비율.
과거 사기케들이 모여있는 팀과 중2병 걸린 스크립터가 각각 function eatFood(foodId)와 function eatFood(foodId, healAmount)를 개발했었다. - function entityAddedHook(entity) 엔티티들이 추가됐을 때 호출된다
업데이트 직후에 자주 고장났던적이 있다 - function entityRemovedHook(entity) 엔티티들이 제거됐을 때 호출된다
마찬가지로 업데이트 직후에 자주 고장난다 - function entityHurtHook(attacker, victim, halfHearts) 엔티티가 엔티티에게 맞으면 호출되는 것으로 추정된다.
- function explodeHook(entity, x, y, z, power, onFire) 폭발 하였을때 호출된다. entity는 터진 엔티티, power는 터진 강도, onFire는 불타는지의 여부이다.
- function serverMessageReceiveHook(str) 서버메시지를 받았을때 호출된다. 예를들어 'XXX가 서버에 들어왔습니다' 라던지...
- function chatReceiveHook(str, sender) 플레이어(서버원 포함)가 채팅했을때 호출된다. 채팅 내용이 /로 시작하는 경우는 호출되지 않는다. sender는 해당 플레이어의 Client Id가 아닌, 닉네임이다. 고장났다가 블록런처 1.16.2 기준으로 고쳐졌으나, 1.17 베타 11 버전 기준으로 또 고장. 현재 덤프에서도 아예 삭제되었다. 개발자의 실수인지 아닌지는 모른다.
- function deathHook(murderer, victim) 엔티티가 죽었을때 호출된다.
- function selectLevelHook() 레벨을 선택했을때 호출된다.
- function newLevel(hasLevel) 레벨에 들어갔을때 호출된다. function selectLevelHook()과 다른점은 function selectLevelHook()은 선택즉시 호출하지만, function newLevel()은 완전히 로드가 끝났을때 호출된다. hasLevel은 이전에 존재한 맵인지 확인하는 불리언 값이다.
- function leaveGame() 월드를 나갔을때 호출된다.
- function modTick() 1초당 20번 호출된다. 게임 스피드를 조작할시 바뀐다. 20틱이 1초이다. 정확히는 1틱 마다 호출.
function levelEventHook(player, eventType, x, y, z, data) 문이 열리거나 하는 이벤트 등이 발생하면 호출되던 함수이다. 블록런처 1.16.2 기준으로 작동하지 않으며, 다른 용도로 바뀌었다면 수정 바란다.function blockEventHook(x, y, z, type, data) 주기적(약 3초)으로 창고들의 위치를 가져오던 함수이나, 블록런처 0.12.1부터 작동하지 않기 시작했다. 지금은 덤프 목록에도 안뜬다.- function redstoneUpdateHook(x, y, z, newCurrent, someBooleanIDontKnow, blockId, blockData) 특정 블록에 레드스톤 신호가 갔을 때 발동되는 함수이다. 참고로 블록에 레드스톤 신호가 가게끔 설정하는 것은 Block.setRedstoneConsumer(blockId,boolean)이다.
이 것 설정 안 해두면 이 이벤트 리스너는 절대로 발동하지 않는다.x, y, z는 특정 블록의 위치이다. newCurrent는 레드스톤 신호의 세기로서, 대부분 newCurrent > 0 (레드스톤 신호 On) 으로 쓰거나 newCurrent == 0 (레드스톤 신호 Off) 으로 쓴다. blockId와 blockData는 각각 블록의 아이디와 블록의 데이터 (데미지)이다. - function screenChangeHook(screenName) 1.13rc1에 추가된 리스너로, 이름 그대로 화면이 바뀌면 호출된다. 아래는 screenName으로 반환되는 것들이다. 이는 버전이 업데이트됨에 따라 조금씩 바뀐다.
- 메인화면 : start_screen
- 채팅창 : chat_screen
- 게임화면 : in_game_play_screen[22]
- GUI : hud_screen
- 일시정지 : pause_screen
- 설정창 : options_screen
- 스킨선택 : skin_picker_screen
- 언어선택 : language_choice_screen
- 상점창 : store_screen
- 월드선택창 : play_screen - worlds
- 렐름선택창 : play_screen - realms
- 친구선택창 : play_screen - friends
- 월드생성창 : create_world_screen
- 서버추가창 : add_external_server_screen
- 리소스팩창 : resource_packs_screen
- 종료창(팝업) : - - gui.warning.exitGameWarning
- 맵삭제창 : confirm_screen
- 맵나갈때창 : leave_level_screen
- 맵로딩창(싱글) : world_loading_progress_screen - local_world_load
- 맵로딩창(멀티) : world_loading_progress_screen - joining_multiplayer_external_server
- 인벤토리(C) : creative_inventory_screen
- 인벤토리(S) : survival_inventory_screen
- 죽었을때창 : death_screen
- 작은상자 : small_chest_screen
- 큰상자 : large_chest_screen
- 조합창 : crafting_screen
- 화로창 : furnace_screen
- 표지판창 : text_edit_screen
- 발사기창 : disapenser_screen
- 공급기창 : dropper_screen
- 모루창 : anvil_screen
- 양조기창 : brewing_stand_screen
- 인첸트창 : enchanting_screen
- 깔때기창 : hopper_screen
- 도전과제창(로그인X) : xbl_optional_signin_screen - gui_achievements
- 키보드레이아웃 : keyboard_layout_screen
- 컨트롤러레이아웃 : gamepad_layout_screen
- function playerExpLevelChangedHook(player, levelIsAdded) - 플레이어의 경험치가 변경 돼서 레벨이 올랐을 때 발동된다. player는 대상 플레이어의 엔티티 값, levelIsAdded는 레벨이 상승한 양이다.[23]
- function projectileHitBlockHook(projectile, blockX, blockY, blockZ, side) - 투사체(화살, 인첸트병 등)가 블럭에 닿았을 때 발동된다. projectile은 해당 엔티티 값, blockXYZ는 닿은 블럭의 좌표, side는 닿은 블럭의 부분(왼쪽, 오른쪽, 위, 아래)
- function projectileHitEntityHook(projectile, targetEntity) -위에 나온 function projectileHitBlockHook과 유사하지만, 블록이 아닌 엔티티에 투사체가 닿았을 때 발동된다. projectile은 투사체의 엔티티 값, targetEntity는 투사체가 닿은 엔티티의 엔티티 값이다.
2.10. 상수들
기본 값을 조금 더 편하게 사용하기 위해 만들어놓았다. 변수가 아닌, 상수이므로, 중간에 값을 바꿀 수 없다.Level.playSound();에서 사용되는 소리들은 상수목록에 없다. 애초에 그 소리들은 .apk 파일 내부에 들어있는 소리 파일들이다.
2.10.1. 채팅 색 상수
- ChatColor.AQUA : §b
- ChatColor.BEGIN : §
- ChatColor.BLACK : §0
- ChatColor.BLUE : §9
- ChatColor.BOLD : §l
- ChatColor.DARK_AQUA : §3
- ChatColor.DARK_BLUE : §1
- ChatColor.DARK_GRAY : §8
- ChatColor.DARK_GREEN : §2
- ChatColor.DARK_PURPLE : §5
- ChatColor.DARK_RED : §4
- ChatColor.GOLD : §6
- ChatColor.GRAY : §7
- ChatColor.GREEN : §a
- ChatColor.LIGHT_PURPLE : §d
- ChatColor.RED : §c
- ChatColor.RESET : §r
- ChatColor.WHITE : §f
- ChatColor.YELLOW : §e
+ §는 안드로이드 4.2.2 이상의 삼성 폰을 기준으로 키보드의 S 버튼을 길게누르면 사용할 수 있다. 유니코드 번호는 U+00A7. 컴퓨터에서는 'ㅁ + 한자 + 5'로 사용이 가능하다. 여담으로 §k를 사용하면 문자들이 막 돌아가는(?) 게 나온다. §k 앞에 색 상수를 이용해 색 입히기도 가능하다.Windows 8~10은 Win키 + .(마침표)로 쓰자.
2.10.2. 아이템 구분 상수
- ItemCategory.DECORATION : 2
- ItemCategory.FOOD : 4
- ItemCategory.INTERNAL : 0
- ItemCategory.MATERIAL : 1
- ItemCategory.TOOL : 3
2.10.3. 파티클 타입 상수
- ParticleType.angryVillager : 30
- ParticleType.bubble : 1
- ParticleType.cloud : 4
- ParticleType.crit : 2
- ParticleType.dripLava : 22
- ParticleType.dripWater : 21
- ParticleType.enchantmenttable : 32
- ParticleType.fallingDust : 23
- ParticleType.flame : 6
- ParticleType.happyVillager : 31
- ParticleType.heart : 15
- ParticleType.hugeexplosion : 13
- ParticleType.hugeexplosionSeed : 12
- ParticleType.ink : 27
- ParticleType.itemBreak : 10
- ParticleType.largeexplode : 5
- ParticleType.lava : 7
- ParticleType.mobFlame : 14
- ParticleType.note : 34
- ParticleType.portal : 18
- ParticleType.rainSplash : 29
- ParticleType.redstone : 9
- ParticleType.slime : 28
- ParticleType.smoke : 3
- ParticleType.smoke2 : 8
- ParticleType.snowballpoof : 11
- ParticleType.spell : 24
- ParticleType.spell2 : 25
- ParticleType.spell3 : 26
- ParticleType.splash : 19
- ParticleType.suspendedTown : 17
- ParticleType.terrain : 16
- ParticleType.waterWake : 20
2.10.4. Entity 타입 상수
참고: 아래의 Entity들의 숫자코드은 /give @p spawn_egg (아이템 개수) (데미지)[24] 이렇게 하면 스폰알을 얻을수 있었다. - 마크 0.16만 해당[25]- EntityType.ARROW (화살) : 80
- EntityType.BAT (박쥐) : 19
- EntityType.BLAZE (블레이즈) : 43
- EntityType.BOAT (배, 보트) : 90
- EntityType.CAVE_SPIDER (동굴 거미(독 거미)) : 40
- EntityType.CHICKEN (닭) : 10
- EntityType.COW (소) : 11
- EntityType.CREEPER (크리퍼) : 33
- EntityType.EGG (달걀) : 82
- EntityType.ENDERMAN (엔더맨) : 38
- EntityType.EXPERIENCE_ORB (경험치 구슬) : 69
- EntityType.EXPERIENCE_POTION (
경험치 포션인챈트 병) : 68 - EntityType.FALLING_BLOCK (떨어지는 블록. 모래, 자갈, 붉은 모래과 같이 중력의 영향을 받는 블록) : 66
- EntityType.FIREBALL (화염구
가스트가 쏘는 것) : 85 - EntityType.FISHING_HOOK (낚시 찌) : 77
- EntityType.GHAST (가스트) : 41
- EntityType.IRON_GOLEM (아이언 골렘) : 20
- EntityType.ITEM (아이템) : 64
- EntityType.LAVA_SLIME (마그마 큐브) : 42
- EntityType.LIGHTNING_BOLT (번개) : 93
- EntityType.MINECART (마인카트) : 84
- EntityType.MUSHROOM_COW (버섯소, 무쉬룸) : 16
- EntityType.OCELOT (오셀롯) : 22
- EntityType.PAINTING (그림) : 83
- EntityType.PIG (돼지) : 12
- EntityType.PIG_ZOMBIE (
돼지좀비좀비 피그맨) : 36 - EntityType.PLAYER (플레이어) : 63
Level.spawnMob();이 안 통하는 엔티티 - EntityType.PRIMED_TNT (점화된 TNT) : 65
- EntityType.RABBIT (토끼) : 18
- EntityType.SHEEP (양) : 13
- EntityType.SILVERFISH (
좀벌레실버피쉬) : 39 - EntityType.SKELETON (스켈레톤) : 34
- EntityType.SLIME (슬라임) : 37
- EntityType.SMALL_FIREBALL (블레이즈가 쏘는 화염구) : 94
- EntityType.SNOWBALL (눈덩이) : 81
- EntityType.SNOW_GOLEM (스노우 골렘) : 21
- EntityType.SPIDER (거미) : 35
- EntityType.SQUID (오징어) : 17
- EntityType.THROWN_POTION (던져진 포션) : 86
- EntityType.VILLAGER (
징징이주민) : 15 - EntityType.WOLF (늑대) : 14
- EntityType.ZOMBIE (좀비) : 32
- EntityType.ZOMBIE_VILLAGER (주민 좀비) : 44
다음은 위에 나오지 않은 엔티티들의 엔티티 타입 아이디이다.
삭제된 엔티티는 취소선표시
- 말 : 23
- 당나귀 : 24
- 노새 : 25
- 스켈레톤 말 : 26
- 좀비 말 : 27
- 북극곰 : 28
- 라마 : 29
- 앵무새 : 30
- 마녀 : 45
- 스트레이
야생동물길 잃은 몹: 46 - 허스크 : 47
- 위더 스켈레톤 : 48
- 가디언 : 49
- 엘더 가디언 : 50
NPC : 51NPC는 실수로 추가한 엔티티라서 0.16.0 베타 2에서 삭제되었으나, 심볼에는 아직 남아있다.- 위더 : 52
- 엔더 드래곤 : 53
- 셜커 : 54
- 엔더 마이트 : 55
- Agent : 56
1.0.0.x 시절에는 Learn to Code Mascot라는 이름으로 들어가있었다. - 우민 변명자 : 57
- 카메라 : 62
- 엔더의 눈 : 70
- 엔더 크리스탈 : 71
- 폭죽 : 72
- 셜커 총알 : 76
- 용 화염구 : 79
엔더드래곤이 날리는 화염구로 추정된다. - 엔더 진주 : 87
- 끈 매듭 : 88
- 위더가 날리는 머리 : 89
- 잔류형 물약 입자 : 95
0.14.x에서는 95번 엔티티가 카메라이다. - 깔때기 마인 카트 : 96
- TNT 마인 카트 : 97
- 창고 마인 카트 : 98
- 커맨드 블록 : 100
일단 심볼에는 들어있었다. - 라마의 침 : 102
- 소환사 덫 : 103
- 우민 소환사 : 104
- 벡스(Vex) : 105
- 복어 : 108
- 연어 : 109
- 열대어 : 111
- 대구 : 112
- 판다 : 113
- 주민 : 115
- 떠돌이 상인 : 118
- 여우 : 121
- 꿀벌
(넣을게~): 122
2.10.5. Entity 랜더러 타입 상수
- EntityRenderType.arrow : 25
- EntityRenderType.bat : 10
- EntityRenderType.blaze : 18
- EntityRenderType.boat : 35
- EntityRenderType.camera : 48
- EntityRenderType.chicken : 5
- EntityRenderType.cow : 6
- EntityRenderType.creeper : 22
- EntityRenderType.egg : 29
- EntityRenderType.enderman : 24
- EntityRenderType.expPotion : 45
- EntityRenderType.experienceOrb : 40
- EntityRenderType.fallingTile : 33
- EntityRenderType.fireball : 37
- EntityRenderType.fishHook : 26
- EntityRenderType.ghast : 17
- EntityRenderType.human : 3
- EntityRenderType.ironGolem : 42
- EntityRenderType.item : 4
- EntityRenderType.lavaSlime : 16
- EntityRenderType.lightningBolt : 41
- EntityRenderType.map : 50
- EntityRenderType.minecart : 34
- EntityRenderType.mushroomCow : 7
- EntityRenderType.ocelot : 43
- EntityRenderType.painting : 32
- EntityRenderType.pig : 8
- EntityRenderType.player : 27
- EntityRenderType.rabbit : 46
- EntityRenderType.sheep : 9
- EntityRenderType.silverfish : 21
- EntityRenderType.skeleton : 19
- EntityRenderType.slime : 23
- EntityRenderType.smallFireball : 38
- EntityRenderType.snowGolem : 44
- EntityRenderType.snowball : 28
- EntityRenderType.spider : 20
- EntityRenderType.squid : 36
- EntityRenderType.thrownPotion : 31
- EntityRenderType.tnt : 2
- EntityRenderType.unknownItem : 30
- EntityRenderType.villager : 12
- EntityRenderType.villagerZombie : 39
- EntityRenderType.witch : 47
- EntityRenderType.wolf : 11
- EntityRenderType.zombie : 14
- EntityRenderType.zombiePigman : 15
2.10.6. 갑옷 타입 상수
- ArmorType.boots : 3
- ArmorType.chestplate : 1
- ArmorType.helmet : 0
- ArmorType.leggings : 2
2.10.7. 포션 효과 상수
- MobEffect.absorption : 22
- MobEffect.blindness : 15
- MobEffect.confusion : 9
- MobEffect.damageBoost : 5
- MobEffect.damageResistance : 11
- MobEffect.digSlowdown : 4
- MobEffect.digSpeed : 3
- MobEffect.fireResistance : 12
- MobEffect.harm : 7
- MobEffect.heal : 6
- MobEffect.healthBoost : 21
- MobEffect.hunger : 17
- MobEffect.invisibility : 14
- MobEffect.jump : 8
- MobEffect.movementSlowdown : 2
- MobEffect.movementSpeed : 1
- MobEffect.nightVision : 16
- MobEffect.poison : 19
- MobEffect.regeneration : 10
- MobEffect.saturation : 23
- MobEffect.waterBreathing : 13
- MobEffect.weakness : 18
- MobEffect.wither : 20
MobEffect.effectIds : {1=movementSpeed, 2=movementSlowdown, 3=digSpeed, 4=digSlowdown, 5=damageBoost, 6=heal, 7=harm, 8=jump, 9=confusion, 10=regeneration, 11=damageResistance, 12=fireResistance, 13=waterBreathing, 14=invisibility, 15=blindness, 17=hunger, 16=nightVision, 19=poison, 18=weakness, 21=healthBoost, 20=wither, 23=saturation, 22=absorption}
2.10.8. 월드구분 상수
- DimensionId.NETHER : 1
- DimensionId.NORMAL : 0
2.10.9. Block Face 상수
이것은 useItem의 side랑 비슷하다 볼 수 있다. side가 반환하는 값이 해당 면에 해당하는 BlockFace 상수의 값.#!syntax javascript
if (side == BlockFace.UP) {
// 코드
}
- BlockFace.DOWN : 0
- BlockFace.EAST : 5
- BlockFace.NORTH : 2
- BlockFace.SOUTH : 3
- BlockFace.UP : 1
- BlockFace.WEST : 4
2.10.10. 인첸트 상수
- Enchantment.AQUA_AFFINITY : 7
- Enchantment.BANE_OF_ARTHROPODS : 11
- Enchantment.BLAST_PROTECTION : 3
- Enchantment.DEPTH_STRIDER : 8
- Enchantment.EFFICIENCY : 15
- Enchantment.FEATHER_FALLING : 2
- Enchantment.FIRE_ASPECT : 13
- Enchantment.FIRE_PROTECTION : 1
- Enchantment.FLAME : 21
- Enchantment.FORTUNE : 18
- Enchantment.INFINITY : 22
- Enchantment.KNOCKBACK : 12
- Enchantment.LOOTING : 14
- Enchantment.LUCK_OF_THE_SEA : 23
- Enchantment.LURE : 24
- Enchantment.POWER : 19
- Enchantment.PROJECTILE_PROTECTION : 4
- Enchantment.PROTECTION : 0
- Enchantment.PUNCH : 20
- Enchantment.RESPIRATION : 6
- Enchantment.SHARPNESS : 9
- Enchantment.SILK_TOUCH : 16
- Enchantment.SMITE : 10
- Enchantment.THORNS : 5
- Enchantment.UNBREAKING : 17
2.10.11. Use Animation 상수
- UseAnimation.bow : 4
- UseAnimation.normal : 0
2.10.12. EnchantType 상수
- EnchantType.all : 16383
- EnchantType.axe : 512
- EnchantType.book : 16383
- EnchantType.bow : 32
- EnchantType.fishingRod : 4096
- EnchantType.flintAndSteel : 256
- EnchantType.hoe : 64
- EnchantType.pickaxe : 1024
- EnchantType.shears : 128
- EnchantType.shovel : 2048
- EnchantType.weapon : 16
2.10.13. BlockRenderType 상수
- BlockRenderLayer.alpha : 4099
- BlockRenderLayer.alpha_seasons : 5
- BlockRenderLayer.alpha_single_side : 4
- BlockRenderLayer.blend : 6
- BlockRenderLayer.doubleside : 2
- BlockRenderLayer.far : 8
- BlockRenderLayer.opaque : 0
- BlockRenderLayer.opaque_seasons : 1
- BlockRenderLayer.seasons_far : 9
- BlockRenderLayer.seasons_far_alpha : 10
- BlockRenderLayer.water : 7
2.11. 네이티브 함수
Rhino Javascript Engine을 거치지 않고, 직접 JNI 함수로 접근하여 사용하는 함수이다. Rhino에서 Java 함수를 직접 호출하는 기능을 이용한 것이며, JNI를 사용하므로 BlockLauncher의 Java 클래스의 함수명을 사용하면 된다. [26]블록런처 1.12.2를 기준으로 덤프한 것이다.
최신버전은 아니지만 참고 하고 싶은 사람은 여기에서 참고해도 좋다. 블록런처 1.8.6[27]의 소스로 추정된다.
앞에다가 폴더 경로와 클래스명(.java 파일의 이름)을 붙여서 사용하면 된다. nativeSetTile();을 예로 들자면 net.zhuoweizhang.mcpelauncher.ScriptManager.nativeSetTile();과 같이 사용하면 되며, 아래에는 프로토타입으로만 적어놓았다.
- int nativeGetBrightness(int, int, int);
- void nativeBlockSetStepSound(int, int);
- void nativePlayerAddExperience(int);
- void initJustLoadedScript(org.mozilla.javascript.Context, org.mozilla.javascript.Script, java.lang.String);
- String nativeEntityGetNameTag(long);
- int nativeLevelGetDifficulty();
- int nativePlayerGetScore();
- void continueDestroyBlockCallback(int, int, int, int, float);
- int nativeBlockGetSecondPart(int, int, int, int);
- int nativeGetSlotInventory(int, int);
- boolean nativeEntityHasCustomSkin(long);
- int nativeItemGetUseAnimation(int);
- void nativeGetAllEntities();
- String nativeBiomeIdToName(int);
- void nativeShowProgressScreen();
- void handleChatPacketCallback(java.lang.String);
- void nativeExplode(float, float, float, float, boolean);
- boolean nativeIsSneaking(long);
- float nativePlayerGetExhaustion();
- void nativeDestroyBlock(int, int, int);
- void nativeItemSetUseAnimation(int, int);
- float nativeGetYaw(long);
- void nativeSetSneaking(long, boolean);
- void nativeAddFurnaceRecipe(int, int, int);
- void nativeAddShapedRecipe(int, int, int, java.lang.String[], int[]);
- void nativeSetMobHealth(long, int);
- void nativeMobAddEffect(long, int, int, int, boolean, boolean);
- long nativeGetLevel();
- int nativeGetData(int, int, int);
- void nativeSetGameType(int);
- boolean nativePlayerIsFlying();
- void nativeHurtTo(int);
- void removeScript(java.lang.String);
- void nativeSetSelectedSlotId(int);
- float nativeLevelGetRainLevel();
- String nativeGetItemName(int, int, boolean);
- boolean nativePlayerEnchant(int, int, int);
- float nativePlayerGetExperience();
- void nativePlayerSetItemCustomName(int, java.lang.String);
- void setupContext(org.mozilla.javascript.Context);
- void nativeMobSetArmorCustomName(long, int, java.lang.String);
- void nativeBlockSetExplosionResistance(int, float);
- Set getEnabledScripts();
- void nativeSetExitEnabled(boolean);
- void nativeBlockSetCollisionEnabled(int, boolean);
- void nativeSetVel(long, float, int);
- boolean reimportIfPossible(java.io.File);
- void nativeExtinguishFire(int, int, int, int);
- void nativePlayerSetHunger(long, float);
- void nativeSetOnFire(long, int);
- long nativeSpawnEntity(float, float, float, int, java.lang.String);
- int nativeGetItemMaxDamage(int);
- float nativeGetPitch(long);
- void blockEventCallback(int, int, int, int, int);
- int nativePlayerGetLevel();
- void nativeSetCameraEntity(long);
- void removeDeadEntries(java.util.Collection);
- ScriptableObject classConstantsToJSObject(java.lang.Class);
- int nativeEntityGetRider(long);
- void nativePlayerSetExperience(float);
- int nativeGetAnimalAge(long);
- void nativeSetFov(float, boolean);
- boolean nativeIsValidItem(int);
- void chatCallback(java.lang.String);
- void nativeBlockSetRedstoneConsumer(int, boolean);
- void levelEventCallback(int, int, int, int, int, int);
- void nativeLevelSetBiome(int, int, int);
- void nativeLeaveGame(boolean);
- void nativeArmorAddQueuedTextures();
- long nativePlayerGetPointedEntity();
- File getScriptFile(java.lang.String);
- long nativeGetTime();
- int nativeGetCarriedItem(int);
- String nativeGetSignText(int, int, int, int);
- void nativeBlockSetShape(int, float, float, float, float, float, float, int);
- void nativeClientMessage(java.lang.String);
- void nativeRecipeSetAnyAuxValue(int, boolean);
- void nativeSetBlockRenderShape(int, int);
- void nativeSpawnerSetEntityType(int, int, int, int);
- void nativeSetGameSpeed(float);
- int nativeGetArch();
- void loadScriptFromInstance(org.mozilla.javascript.Script, java.lang.String);
- void nativeAddItemFurnace(int, int, int, int, int, int, int);
- void init(android.content.Context);
- void nativeModPESetRenderDebug(boolean);
- String nativeGetLanguageName();
- int nativePlayerGetDimension();
- void nativeDefineBlock(int, java.lang.String, java.lang.String[], int[], int, boolean, int, int);
- void clearTextureOverrides();
- void nativeLevelSetLightningLevel(float);
- void nativeSetSignText(int, int, int, int, java.lang.String);
- void setLevelCallback(boolean, boolean);
- int nativeGetTile(int, int, int);
- void startDestroyBlockCallback(int, int, int, int);
- void nativePlayerSetSaturation(float);
- void nativeSetI18NString(java.lang.String, java.lang.String);
- boolean nativeIsValidCommand(java.lang.String);
- TextureRequests expandTexturesArray(java.lang.Object);
- String nativeGetI18NString(java.lang.String);
- void nativeAddItemChest(int, int, int, int, int, int, int);
- void nativeSetMobSkin(long, java.lang.String);
- void useItemOnCallback(int, int, int, int, int, int, int, int);
- void nativeZombieSetBaby(long, boolean);
- int nativeLevelGetBiome(int, int);
- void destroy();
- void nativeRideAnimal(long, long);
- int nativePlayerGetPointedBlock(int);
- void takeScreenshot(java.lang.String);
- void nativeBlockSetDestroyTime(int, float);
- void nativeModPESetDesktopGui(boolean);
- void nativeSetNightMode(boolean);
- void nativePlayerSetCanFly(boolean);
- String nativeLevelGetBiomeName(int, int);
- void entityRemovedCallback(long);
- void nativeRemoveItemBackground();
- void nativeLevelSetGrassColor(int, int, int);
- void nativeSetCape(long, java.lang.String);
- void tickCallback();
- InputStream getSoundInputStream(java.lang.String, long[]);
- void nativeSetPosition(long, float, float, float);
- void destroyBlockCallback(int, int, int, int);
- void nativeAddItemInventory(int, int, int);
- void nativeBlockSetLightOpacity(int, int);
- void nativeBlockSetFriction(int, float);
- void processDebugCommand(java.lang.String);
- void nativeDefineItem(int, java.lang.String, int, java.lang.String, int);
- void nativeDumpVtable(java.lang.String, int);
- int nativeGetMobMaxHealth(long);
- void nativeSetMobMaxHealth(long, int);
- void nativeSetAllowEnchantments(int, int, int);
- String nativeGetItemNameChest(int, int, int, int);
- void nativeSetTextParseColorCodes(boolean);
- void explodeCallback(long, float, float, float, float, boolean);
- int nativeGetMobHealth(long);
- float nativeLevelGetLightningLevel();
- int nativeGetItemCountFurnace(int, int, int, int);
- int nativeGetEntityTypeId(long);
- void nativeRemoveEntity(long);
- void reloadScript(java.io.File);
- int nativeMobGetArmor(long, int, int);
- float nativePlayerGetPointedVec(int);
- void nativeAddItemCreativeInv(int, int, int);
- void attackCallback(long, long);
- int nativeEntityGetRenderType(long);
- String nativePlayerGetItemCustomName(int);
- void nativeSetIsRecording(boolean);
- void nativeEntitySetTarget(long, long);
- void nativeSendChat(java.lang.String);
- void nativeForceCrash();
- int nativeGetItemEntityItem(long, int);
- void nativePlayerSetExhaustion(float);
- boolean nativeItemSetProperties(int, java.lang.String);
- void nativeShowTipMessage(java.lang.String);
- void nativeSetStonecutterItem(int, int);
- int nativeGetSelectedSlotId();
- void nativeMobSetArmor(long, int, int, int);
- void dummyThrowableHitEntityCallback();
- void setLevelFakeCallback(boolean, boolean);
- File getOriginalFile(java.io.File);
- void mobDieCallback(long, long);
- int nativeGetItemCountChest(int, int, int, int);
- void frameCallback();
- void entityAddedCallback(long);
- int nativeEntityGetRiding(long);
- long nativeEntityGetTarget(long);
- void nativeClearSlotInventory(int);
- void nativeBlockSetLightLevel(int, int);
- int nativeGetGameType();
- boolean nativePlayerCanFly();
- void nativeScreenChooserSetScreen(int);
- String nativeGetPlayerName(long);
- void nativeSetRot(long, float, float);
- String nativeMobGetArmorCustomName(long, int);
- void nativeLevelSetRainLevel(float);
- void nativeSetInventorySlot(int, int, int, int);
- float nativeBlockGetDestroyTime(int, int);
- void nativeSetUseController(boolean);
- int nativeGetItemFurnace(int, int, int, int);
- void nativePlayerSetFlying(boolean);
- File getTextureOverrideFile(java.lang.String);
- boolean nativeGetTextureCoordinatesForBlock(int, int, int, float[]);
- float nativeGetEntityLoc(long, int);
- void nativeEntitySetSize(long, float, float);
- void loadEnabledScriptsNames(android.content.Context);
- void nativePlaySound(float, float, float, java.lang.String, float, float);
- long nativeGetPlayerEnt();
- void callScriptMethod(java.lang.String, java.lang.Object[]);
- int nativeGetItemDataChest(int, int, int, int);
- void nativeSetupHooks(int);
- void runOnMainThread(java.lang.Runnable);
- void nativeLevelAddParticle(int, float, float, float, float, float, float, int);
- void nativeClearCapes();
- void loadScript(java.io.Reader, java.lang.String);
- float nativePlayerGetHunger(long);
- String getAllApiMethodsDescriptions();
- String nativeEntityGetMobSkin(long);
- void nativeMobRemoveEffect(long, int);
- void nativeRequestFrameCallback();
- void nativeSetItemNameChest(int, int, int, int, java.lang.String);
- int nativeSpawnerGetEntityType(int, int, int);
- void nativePrePatch(boolean, com.mojang.minecraftpe.MainActivity, boolean);
- void requestGraphicsReset();
- float nativeGetEntityVel(long, int);
- void setEnabledWithoutLoad(java.io.File, boolean);
- int nativeGetItemDataFurnace(int, int, int, int);
- void nativeBlockSetColor(int, int[]);
- void nativeDefineArmor(int, java.lang.String, int, java.lang.String, java.lang.String, int, int, int);
- void nativeItemSetStackedByData(int, boolean);
- JSONObject getOriginalLocations();
- void nativeSetPositionRelative(long, float, float, float);
- int nativeLevelGetGrassColor(int, int);
- long nativeDropItem(float, float, float, float, int, int, int);
- void nativeBlockSetRenderLayer(int, int);
- boolean isEnabled(java.io.File);
- void nativeSetItemMaxDamage(int, int);
- void nativePreventDefault();
- void throwableHitCallback(long, int, int, int, int, int, float, float, float, long);
- void nativeSelectLevel(java.lang.String, java.lang.String);
- float nativeBlockGetFriction(int);
- void nativeSetAnimalAge(long, int);
- void redstoneUpdateCallback(int, int, int, int, boolean, int, int);
- void nativeLevelSetDifficulty(int);
- void nativeSetTime(long);
- void nativeCloseScreen();
- void setOriginalLocation(java.io.File, java.io.File);
- void nativeDefinePlaceholderBlocks();
- boolean nativeGetTextureCoordinatesForItem(int, int, float[]);
- void nativeSetCarriedItem(long, int, int, int);
- int nativeGetBlockRenderShape(int);
- int nativeGetItemChest(int, int, int, int);
- void setEnabled(java.io.File, boolean);
- int nativeGetItemIdCount();
- void nativeEntitySetImmobile(long, boolean);
- void nativeSetSpawn(int, int, int);
- void nativeSetTile(int, int, int, int, int);
- void nativeSetItemCategory(int, int, int);
- void reportScriptError(net.zhuoweizhang.mcpelauncher.ScriptManager$ScriptState, java.lang.Throwable);
- boolean nativeLevelIsRemote();
- void nativeSetHandEquipped(int, boolean);
- boolean nativeLevelCanSeeSky(int, int, int);
- float nativeGetPlayerLoc(int);
- void nativePlayerSetLevel(int);
- boolean nativeZombieIsBaby(long);
- void eatCallback(int, float);
- boolean nativeSetEntityRenderType(long, int);
- void nativeMobRemoveAllEffects(long);
- void nativeOnGraphicsReset();
- void nativeJoinServer(java.lang.String, int);
- void nativeEntitySetNameTag(long, java.lang.String);
- float nativePlayerGetSaturation();
2.12. 유틸
Utils.java 파일에 들어있는 외부에서 접근이 가능한 객체들이다. 블록런처 1.12.2가 기준이다블록런처가 프로버전인지 확인하는 기능이나 해당 폴더의 내용을 전부 지우는
앞에다가 폴더 경로와 클래스명(.java 파일의 이름)을 붙여서 사용하면 된다. 프로버전인지 아닌지 확인하는 함수인 isPro();를 예로 들자면 net.zhuoweizhang.mcpelauncher.Utils.isPro();와 같이 사용하면 된다.
네이티브 함수 항목에서처럼 프로토 타입들로 적어두었다.
- void clearDirectory(java.io.File);
- void setContext(android.content.Context);
- long parseMemInfo();
- Field getDeclaredFieldRecursive(java.lang.Class, java.lang.String);
- int getMaxScripts();
- String getArchName(int);
- Set getEnabledScripts();
- void setupTheme(android.content.Context, boolean);
- boolean hasTooManyPatches();
- SharedPreferences getPrefs(int);
- void setLanguageOverride();
- boolean isSafeMode();
- String join(java.util.Collection, java.lang.String);
- int getMaxPatches();
- boolean hasExtrasPackage(android.content.Context);
- boolean isPro();
- int getElfArch(java.io.File);
- boolean hasTooManyScripts();
- Set getEnabledPatches();
- String joinArray(java.lang.Object[], java.lang.String);
2.13. 렌더링(모델링) 관련 함수
- Renderer.createHumanoidRenderer(); 새로운 렌더러를 생성한다. 플래이어 형태의 렌더러가 생성되며, 과거에는 스킨 오프셋이 다 맞추어져 있었으나, 지금은 아니다. 블록런처 1.17.5 기준으로 사용하면 블록런처가 팅긴다.
- Renderer.getModel(); 해당 렌더러의 모델을 가져온다.
- model.getPart("Part"); 해당 모델의 각 파츠를 얻는다.
- Head
- Body
- LeftArm
- RightArm
- LeftLeg
- RightLeg
- part.clear(); 해당 파츠의 모델링된 부분을 모두 지운다. 주로, Renderer.getPart();로 얻어온 파츠를 지울 때 사용한다.
- part.addBox(x, y, z, sizeX, sizeY, sizeZ); 해당 파츠에 박스를 추가한다. 박스는 한쪽 방향으로만 늘어나기 때문에, 기준점을 반대쪽으로 절반만큼 옮겨주어야 한다.
- part.setTextureOffset(x, y); 해당 렌더러를 적용할 엔티티에게 적용할 스킨의 오프셋을 설정한다. 각 인자들의 단위는 픽셀이다. 사용하지 않으면 0, 0으로 설정된다.
- part.setTextureSize(sizeX, sizeY); 해당 스킨의 크기를 설정한다. 확대/축소용으로 사용하며, 각 인자들의 단위는 픽셀이다. 사용하지 않으면 64×32[29]로 설정된다.
- part.setRotationPoint(x, y, z); 관절의 위치를 설정한다.
파츠의 종류는
가 있다
렌더링(모델링)을 하기위해서는 일단 새로운 렌더러를 만들어야 한다.
Renderer.createHumanoidRenderer();로 만든 뒤,
Renderer.getModel();을 이용하여 해당 렌더러의 모델을 가져온 다음,
model.getPart("Part");를 이용하여 해당 파츠를 불러와서,
part.clear();로 기존에 있던 파츠를 지우고,
part.setTextureSize(sizeX, sizeY);로 스킨의 비율을 조절하고(대부분 생략한다),
part.setTextureOffset(x, y);으로 스킨의 위치를 맞춘 다음에,
part.addBox(x, y, z, sizeX, sizeY, sizeZ);를 사용하여 새로운 박스를 추가한다.
아쉽게도 각도 조절은 없다.
하지만 스마트 무빙을 제작하던중에 픽셀화라는 기법이 나왔다.
이렇게 렌더러를 모델링 하고나면
Entity.setRenderType(ent, renderType);으로 적용시키면 되는데
주의할점이 renderType은 Renderer.renderType으로 적어줘야 제대로 renderType이 적용된다
이건 스킨 크기가 64×32인 경우를 기준으로 사람 모양 렌더러를 만드는 예제 소스이나, 현재 블록런처에서는 정상적으로 작동하지 않을 확률이 있다.
#!syntax javascript
var renderer = Renderer.createHumanoidRenderer(); //새로운 렌더러 생성
var model = renderer.getModel(); //그 렌더러의 모델을 가져오고,
var head = model.getPart("head"); //그 모델의 각 파츠를 가져온다.
var body = model.getPart("body");
var rArm = model.getPart("rightArm");
var lArm = model.getPart("leftArm");
var rLeg = model.getPart("rightLeg");
var lLeg = model.getPart("leftLeg");
head.clear(); //기존에 있던 파츠는 지우고,
body.clear();
rLeg.clear();
lLeg.clear();
rArm.clear();
lArm.clear();
head.setTextureOffset(0, 0); //각 파츠에 스킨 위치를 맞추고
head.addBox(-4, -8, -4, 8, 8, 8); //박스를 추가한다.
body.setTextureOffset(16, 16);
body.addBox(-4, 0, -2, 8, 12, 4);
rLeg.setTextureOffset(0, 16);
rLeg.addBox(-2, 0, -2, 4, 12, 4);
lLeg.setTextureOffset(0, 16);
lLeg.addBox(-2, 0, -2, 4, 12, 4);
lArm.setTextureOffset(40, 16);
lArm.addBox(-1, -2, -1.5, 4, 12, 4);
rArm.setTextureOffset(40, 16);
rArm.addBox(-3, -2, -1.5, 4, 12, 4);
3. 유용한 스크립트
- 에디터
- 팬동 에디터 - 원 제작자는 팬동이다. 0.10.5 이후 팬동이 이 스크립트 작업을 중단[30]함으로써 현재 아이린보드가 수정하여 배포하고 있다.[31] 현재 팬동에디터는 0.14.0을 기준으로 서버관리, 월드에딧, 개인적인 용도 등 엄청난 기능이 하나로 묶여있는 스크립트이다.
- Super Tool Kit - 이것은 분명 에디터인데, 무단수정 등을 통해 테러에 악용되고 있는 스크립트이다. 여담으로 제작자가 알파핵 개발진 중 한 명이다.
사실 팬동에디터도 테러에 악용되었던 적이 있다.Google Play에 해당 스크립트를 다운받는 앱이 올라와 있다. - 툰라온 월드 에디터 - 툰라온이 만든 월드 에디터. 기능이 다양하고 대칭, 회전 등의 고급 기능도 들어가 있어서 건축가들이 많이 애용하던 스크립트였다. 하지만 현재는 제작자인 툰라온이 갑자기 활동을 중단하면서 더 이상의 업데이트는 이루어 지지 않고 있다. 게다가 기존 버전도 오류가 엄청나게 많아서 사용하기에 벅차다.[32]
사실 군대 가있었다카더라. - 아이린보드 월드에딧 - 아이린보드[33]가 만든 GUI형 월드에딧. 기능이 다양하고 대칭, 회전 등의 고급 기능도 들어가 있으며 GUI로 손쉽게 조작할 수 있어 건축가들이 많이 애용하는 스크립트이다. 현재 아이린보드 블로그에서 공유가 진행 중이다. 최신버전인 1.2.X에도 적용되어 높은 호환성을 보이고 있다.
- 유틸
- 스마트 무빙 - 제작자는 버전마다 다르며 최초제작자는 리페이다. 리페 → 리페, 초크 → 리페, 초크, 멸종위기AB형, Dark, SY PlanP 순으로 합작이 되었다. 스마트무빙은 마인크래프트 포켓에디션 마인크래프트 GUI를 적용하였다. 현재 MK에 오픈소스로 공유되었고 0isback[34]이라는 사람이 오픈소스를 이어받아 제작중이다. 현재 애드온으로 다시 제작중.
- Too Many Items - 마인크래프트 0.7.x 시절부터 존재하던 스크립트이다.
사실 최신버전까지도 된다당시에는 혁명이였던 스크립트였으나, 현재의 사람들은 투매니 하면 대부분 애드온[35]을 떠올린다. 오른쪽 아래에 M 버튼이 있는 버전과 왼쪽 위에 작은 파란색 버튼이 있는 버전 이 두 가지가 있다. 대부분이 모르고 있지만, 투매니는 모드(.mod), 스크립트(.js), 애드온(.apk) 이 3가지 모두 존재하며, 투매니 스크립트와 투매니 애드온의 제작자[36]는 동일하다. - Player Administrator - 인디벨[37]이 만든 서버원 관리 스크립트이다. 기본적인 서버 관리 기능(플레이어 관리, 월드 설정 등)과 더불어 각종 편리 기능까지 구현 되어 있어서 나름 인지도를 알렸던 스크립트인데, 카더라에 따르면 서버를 여는 사람들 사이에서는 꼭 사용하는 스크립트라고 한다. 아무래도 당시 현존했던 서버 관리 스크립트 중에는 가장 괜찮았었으니.. 보통 플레이어 어드민 또는 PAD로 줄여서 부른다. 로그 기능도 있어서 많이 사용했었던 스크립트이다.[38] 원래는 CUI 방식이였으나, GUI 방식으로 변경되었다.[39] 현재 최신 버전은 2.0.3이다.[40] 마크 자체의 커맨드를 사용하는 방식으로 작동한다. 이전에는 단독 문서가 있었으나 홍보성 문서로 간주되어 삭제 되었다. 2019년 기준으론 개발자가 아예 ModPE에 손을 놓아서 2.0.3이 여전히 최신 버전이다.[41]
- Dark Cheater
- China Cheater - Gravity MineCraft가 Gravity Editor를 한참 만들고 있을때 개발자 모집글을 올렸는데 그때 Matin이 지원해서 면접아닌 면접(?)을 보면서 스크립트 대표작을 보여달라고 해서 얻은 Matin Cheater를 훔쳐다가 Dark Cheater를 모티브로 만들기 시작한 치터이다. China Cheater 이름의 유래는 Dark Tornado가 중국산 치터라고 부르기 시작하면서 China Cheater라고 이름이 지어졌다. (하지만 한국산이라서 치나치터, 차이나 치터 X) China Cheater는 Dark Cheater의 쓸데없는 기능 제거버전이라고 보면 된다. 요즘 업데이트가 뜸한건 기분탓.
Gravity Minecraft가 도망쳤다고 카더라 - 테러[42]
- 광역파괴 - 누군가가 Level.destroyBlock();이 서버에서 작동되는 것을 발견하고 뿌렸다. 악용 방지를 위해 더 이상 상세한 설명은 생략하며 일반적인 방법으로는 실행할 수 없다. 블럭 파괴 시 나오는 입자 때문에 순간 렉이 걸린다. 많이 하면 아예 멈춰버린다(...) 게다가 서바이벌 모드의 경우는 파괴 시 블럭이 드랍 되기 때문에 렉이 더 심해질 수 있다.
- 터치형 광역파괴 - 블럭을 터치할 시 발동. 이는 useItem 함수로 막을 순 있다.
- 버튼형 광역파괴 - GUI를 이용해 버튼을 누를 시 발동. 이는 막기가 어렵거나 불가능 하다.
- 고스트핵 - 제작자는 Kiiler BLS, Play 스토어에 다운가능한 앱이 있는데, 가끔 사라진다. 이 스크립트를 가지고 설치는 테러범들이 많은데, 이건 스크립트이다. 따라서 당연히 서버원이 키고 들어와서 사용하는 경우는 대부분의 기능이 작동하지 않는다. 그래도 테러 스크립트로 분류되어 서버장들의 머리를 아프게 하고 있다. 무엇보다 제작자가 개발을 중단했다.
친구로 블럭런처로 고스트핵 적용하고 들어가면 되는것이 좀있다. 크래이티브처럼 날기, 제트팩 등그런데, 개발자가 합작으로 스크립트 제작 앱[43]을 하나 만들었다. - 프리져핵 - 한 때 서버를 테러하고 다니는 테러범들과 테러단들 사이에서 점유율이 높은 편이였던 스크립트였으나, 지금은 그 때 만큼은 많이 보이지 않으며, 제작자가 스크립트 개발을 모두 잊어버렸다고 한다. 아마도 당시 다크 치터 측에서 위험하기 때문에 더 이상 서버 접속 시, 버튼 유지를 지원하지 않겠다고 하고[44], 고스트핵도 멀티 플레이에서 막혀서 점유율이 높아진 것으로 추정된다. 원격 차단 소스가 포함되어 있고, 난독화도 되어 있으니, 무단공유는 하지 말자.
- 알파핵 - 블록런처 1.12.2 이상을 지원하는 테러 스크립트들 중 최초로 공유[45]된 것이다. 도스 공격기가 포함되어 있어서, 테러 스크립트 + 해킹툴 이였으나, 도스 공격기가 삭제되었다고 카더라. 최초로 도스 공격이 가능한 스크립트라고 잘못 알고 있는 경우가 있는데, 도스 공격 기능이 있는 5번째 스크립트이다. 여담으로 일부 기능이 한국어를 지원하며, 알파핵 2.0이 출시되어있다.
- Vertex-Client-PE - 알파핵 개발자들 중 한 명이 제작에 참여한 스크립트이다. 5명 정도가 합작을 하였으며, UI는 PC의 노더스와 유사하나, 기능은 많지 않다. UI때문에 노더스핵이라고도 불린다. 퀄리티는 상대적으로 높은 편. .js가 아니라 .modpkg이며, 일부에서는 '위자드핵'이라고도 불린다.
- 존재하지 않지만, 테러범
툴키디들이 열심히 찾는 스크립트 - 강제 오피 스크립트 - 없다. 정확히는 스크립트도 사용하는 흡사 강제 오피는 존재한다. 어드민이 스크립트를 적용하면 그 스크립트가 어드민의 폰에 있는 PMMP 폴더를 건드려서 서버원이 앱을 사용하여 본인에게 OP를 부여할 수 있도록 하는 방식으로, '강제'가 아니고 무엇보다 DPMMP가 아니거나 어드민이 속지 않으면 사용할 수 없다. 즉, 서버원이 일방적으로 스크립트를 통해 본인에게 강제적으로 OP를 부여하는 스크립트는 없다. 물론, 플러그인 자체에 강제 오피가 심어져 있는 경우도 있다. 그러나 0.16.0 버전 부터 명령어가 추가 되어서 op 명령어도 추가 됐고 Level.executeCommand 메소드도 있으므로 가능성이 생겼다. 다만 서버에서 작동은 안 되지만 위의 광역파괴 처럼 다른 방법으로 작동 시키면 될지도 모른다.
4. 유용한 소스
- (void) Level.setTiles : (x1, y1, z1)의 좌표에서 부터 (x2, y2, z2)까지의 좌표까지 b의 아이디와 bd의 인덱스를 가진 블럭을 설치한다.
#!syntax javascriptLevel.setTiles = (x1, y1, z1, x2, y2, z2, b, bd) => {
for(let X = (x1 < x2 ? x1 : x2);X <= (x1 > x2 ? x1 : x2);X++) {
for(let Y = (y1 < y2 ? y1 : y2);Y <= (y1 > y2 ? y1 : y2);Y++) {
for(let Z= (z1 < z2 ? z1 : z2);Z <= (z1 > z2 ? z1 : z2);Z++) {
Level.setTile(X, Y, Z, b, bd);
}
}
}
return;
}
- (long Array) Player.getNearEntity : 플레이어로 부터 x, y, z만큼의 거리 안에 있는 모든 엔디티를 배열로 가져옵니다.
#!syntax javascript Player.getNearEntity = (x, y, z) => {
var ent = Entity.getAll();
var nearEnt = [];
for(let n = 0;n < ent.length;n++){
if((Math.abs(Player.getX()-Entity.getX(ent[n]))<x)&&(Math.abs(Player.getY()-Entity.getY(ent[n]))<y)&&(Math.abs(Player.getZ()-Entity.getZ(ent[n]))<z)&&ent[n]!=Player.getEntity()){
nearEnt.push(ent[n]);
}
}
return nearEnt;
}
- (long) Player.getClosestEntity : 플레이어로부터 가장 가까운 엔디티를 가져온다.
#!syntax javascript Player.getClosestEntity = () => {
var ent = Entity.getAll();
var closest = [Infinity, null];
for(let n = 0; n < ent.length; n++){
var dist = Math.sqrt(Math.pow(Player.getX() - Entity.getX(ent[n]), 2) + Math.pow(Player.getY() - Entity.getY(ent[n]), 2) + Math.pow(Player.getZ() - Entity.getZ(ent[n]), 2));
if(closest[0] > dist){
closest[0] = dist;
closest[1] = n;
}
}
return ent[closest[1]];
}
5. .modpkg
스크립트 파일과 텍스쳐팩을 한 파일 안에 넣어서 스크립트처럼 적용하는 것이다.확장자는 .modpkg이며, 일반 스크립트와 적용법이 같다. 과거, .modpkg 파일을 적용할 때 시간이 굉장히 오래 걸렸던 시절이 있다.
'고퀄 텍팩'이라고도 불리는 해상도가 높은 텍스쳐 파일을 사용하여 만드는 경우, 갤럭시 S8+ 누가 블록런처 버전 1.15.7 기준으로 오류가 발생했으니, 참고할 것.
5.1. 개요
비교적 최근데 나온 것으로, 무려 사운드[46],택스쳐팩,스크립트를 한꺼번에 적용할 수 있는 확장자다. 적용 방식은 스크립트와 같다. 사실 텍스쳐팩을 포함한다고 볼 수 있는 리소스팩의 경우, 소리 파일이나 언어 파일, 마크 내의 문구들도 수정이 가능하다. 즉, 스크립트 + 리소스팩.5.2. 제작법
폴더 내부에 script 폴더를 만들고, 그 안에 스크립트 파일을 넣고 압축하면 된다. 그리고 확장자는 .zip[47]에서 .modpkg 로 바꾸면 된다.텍스쳐를 사용하려는 경우 사용하려는 텍스쳐에 따라 다른 이름의 폴더를 만든다. 그리고 그 안에 텍스쳐를 넣는다. 텍스쳐 별 폴더 이름은 다음과 같다.
- 블록 : terrain-atlas
- 아이템 : items-opaque
- 방어구 : armor
- 몹 : mob
- GUI : gui
텍스쳐에 따라 텍스쳐 파일명이 달라진다. 어떤 텍스쳐는 파일명 뒤에 '_0', '_1' 등을 붙여야 하는 경우도 있다.
- 아이템 : 텍스쳐 이름 + 아이템 데미지(_0, _1 등)
- 방어구 : 방어구 이름 + 0일 경우 바지를 제외한 부분의 텍스쳐, 1일 경우 바지의 텍스쳐
- 몹 : 몹의 이름
- GUI : GUI의 이름
6. 여담
한국에서 카페 및 여러 블로그 등지에서 많이 배포된다. 직접 하나하나 찾는다면 실력자를 많이 볼 수 있다. 이외에는 블로그, 타 카페 등에서 공유한다.이 문서는 수정이 많이 필요한 문서이다. 아무나 와서 고칠 수는 있다만, 웬만하면 수정본을 복사하고 저장하는 것이 좋을 것이다.
예전 ModPE 스크립트는 PC에 비해 퀄리티가 낮았다. 하지만 점점 발전하며 아래와 같은 높은 퀄리티의 작품도 나오기 시작했다.
사실 이론상으로는 스크립트 만으로도 .modpkg가 구현이 가능하다. 이는 스크립트에 웹상에서 텍스쳐팩 파일을 받아서 적용하는 함수[48]가 있기 때문.
스크립트 개발이 가장 활발했던 시기는 2번째 시기이다. 1번째 시기는 블록런처가 처음 알려졌을때 기존의 자바스크립트나 안드로이드를 좀 만질줄 아는 사람이 ModPE 스크립트를 개발해 내 많은 사람들이 스크립트 개발을 시작했으며, 이때부터 스크립트를 만들기 시작한 사람 중 대작을 만들어낸 사람이 굉장히 많다. 2번째 시기는 마인크래프트 버전 0.13.X ~ 0.14.X 일 때가 제일 활발했다. 당시에는 마인크래프트 업데이트가상당히 느렸기 때문에 블록런처의 개발자인 주웨이 장이 개발을 더 집중적으로 할 수 있었고, 거의 모든 메서드가 정상적으로 작동돼서 완성도가 높은 스크립트가 어마어마하게 많이 나왔다.[49] 여담으로, BE 버전이 꾸준히 업데이트되어 JE 버전의 기능을 대거 수용하게 되기 전[50]까지만 해도 JE의 기능을 추가해 주는 스크립트들이 인기를 끌었다. 네더월드와 엔더월드는 물론이고 BE(당시 PE)에 없던 몹들과 블록, 기능들을 대거 추가시켰다. 심지어는 명령어와 명령 블록까지 있었다.
스폰알의 아이템 데미지가 해당 엔티티의 엔티티 타입 아이디이다. PC에서는 허스크의 엔티티가 좀비의 엔티티와 같고, 스트레이 / 위더 스켈레톤의 엔티티는 스켈레톤의 엔티티와 같으며, 좀비 말 / 해골 말 / 당나귀 / 노새의 엔티티는 일반 말과 같다. 참고로, PE에서도 스켈레톤과 위더 스텔레톤의 엔티티 타입 아이디가 0.14.3까지는 34로 동일했었다.
6.1. 동영상
저 영상은 5년 전 리뷰로 현재 ModPE 스크립트 수준은 퀄리티가 낮은 PC의 모드를 따라잡을 수 있는 수준으로 발전하게 되었다.[51]
[1] 닉네임은 500 ISE인데 언제부터인가 실명으로 더 자주 불리게 되었다.[2] 둘 다 스크립트라고 읽는다.[3] 진저브레드는 아직 Switch가 추가되기 전 버전이다.[4] 생성자 호출시 Context를 넘겨주면 정상적으로 작동한다.[5] 다만 현재 서비스가 종료되어서 사용하는 것은 권장하지 않다.[6] MCPE Master는 procCmd도 안된다는 소문이 있다.[7] 당연히 이 두개는 블록런처 네이티브 함수를 사용할 수 없다. 단, 툴박스는 예외적으로 callScriptMethod();가 사용 가능했었다. 디컴파일하면 보인다.[8] 이는 Level.setTile(); 같은 메소드들도 정상적으로 작동한다는 말이 아니라[9] Pocket Tool Patch[10] 1.1의 변경사항 때문에 업데이트가 어려워졌다고 한다.[11] 참고로 음수를 쓰면 아이템을 가져간다.[12] 인자가 실제 좌표를 적는것이다[13] 인자가 원래 위치값에서 더하는 값이 된다.[14] 쓰래드로 1밀리초씩 딜레이를줘서 쓰면 된다는 소문이 있다[15] 출처 링크[16] 명령어 실행 결과가 아니다.[17] 함수 호출 시 인자 생략 => undefined가 넘어옴 => boolean형으로 형변환 => false로 바뀜 => 팅김.[18] 스플릿 컨트롤 시 십자가 부분이 바라보고 있는 부분이지만 일반 컨트롤 시 마지막으로 터치한 위치가 바라보는 곳이 된다. 화면을 움직이려고 하는 스와이프도 포함. 참고로, 플레이어 시선의 각도를 잘 지지고 볶아서 레이캐스트처럼 앞으로 for문을 날리는 방식으로 구현이 가능하다.[19] 여기에는 효과에 따라 다른 값을 넣는다. 여기에 무엇을 넣어야 할 지는 아래쪽의 포션 효과 상수 목록을 참조하여라[20] 엔티티 코드라고도 불리나, 올바르지 않은 표현이다.[21] ScriptManager.java에는 계속 남아 있다. 단지, nativeSendChat();을 구현하는 부분의 소스가 없을 뿐이다. 심볼 안에 없다.[22] 만약 플레이 하고 싶은 스크린을 구하기를 원한다면 hud_screen을 쓰는것을 추천, in_game_play_screen은 게임자체가 돌아가는 월드 스크린이고 hud_screen은 GUI부분의 스크린이다. 따라서 다른스크린으로 왔다가 다시올때는 hud_screen만 호출이 되니 hud_screen을 쓰는것을 추천[23] 예를들어 레벨 10에서 12가 되었다면, levelIsAdded는 2가 반환된다.[24] 예: /give @p spawn_egg 64 33이라고 치면 64개의 크리퍼 스폰알을 얻는다.[25] 마크 0.17.0(1.0)에서는 얻을수 없는듯 하다. spawn_egg라는 아이템이 존재하지 않는다고 나온다 설명에 나왔다. 그냥 포켓인벤에디터 등으로 383번 아이템을 가져오면 된다.[26] 당연히 MCPE 마스터와 ToolBox에서는 사용할 수 없다. 단, 툴박스에서는 예외적으로 callScriptMethod(); 사용 가능.[27] 마인크래프트 pe 0.10.5를 지원하는 가장 높은 버전의 블록런처[28] 컴파일의 반대과정. 기계어를 프로그래밍 언어로 바꾸는 작업이다.[29] 원래 스킨 크기. 지금은 64×64인 경우도 있다.[30] 스크립트 자체를 접은 것 같다. 또는 군입대 문제로 추정.[31] 제작자 팬동이 블로그를 통해 모든 스크립트를 2차 수정 및 공유 허용을 하였다.[32] 이는 MCPE의 버전이 업데이트 되면서 호환 문제인 것으로 보인다.[33] 팔리기 전의 MCPE KOREA에서 나름 활발히 활동했던 스크립터이다.[34] 보통 공백이라고 부른다.[35] 현재는 Toolbox for Minecraft: PE 라는 이름으로 런처 및 ModPE 스크립트 인터프리터의 역할도 한다.[36] MrArm[37] 스크립트 뿐 아니라 다른 쪽에서도 활발히 활동 하는 프로그래머이다. 지금은 ModPE에 손을 아예 놓아서 인지 아예 업데이트가 없는 상태.[38] 한 번 로그 사용을 하면 웬만한 건 다 기록 되었다. 플레이어 접속, 아이템(블록) 설치/사용, 타격, 죽음, 폭발 등 스크립트로는 가져올 수 없는 아이피를 제외하면 기록할 수 있는 건 다 기록하도록 만들어서인지 테러범 잡기에도 수월했다.[39] 1.0.3 버전 까지는 직접 명령어를 치는 방식이였으나, 1.0.4부터 GUI로 변경되었다.[40] 원래 제작자는 2.0.0을 마지막 버전으로 하기로 계획했었다. 하지만 2.0.0버전을 이미 업로드 하고 나서 일부 기능들에 오류가 있다는 것을 뒤늦게 알아채는 바람에(...) 결국 2.0.x 버전으로 계속 업데이트 하게 되었다.[41] 손을 놓은 건 맞으나, 폰을 새로 바꾼 후 데이터를 옮기는 과정에서 스크립트 파일들을 빼고 옮겨버렸고, 미처 그걸 생각치 못하고 공장 초기화 까지 해버려서 가장 최근까지 작업했던 것들이 날라가 버렸다(...)[42] 블록런처가 업데이트되면서 ModPE 스크립트는 서버에서 작동할 수 없게 되었다. (LAN은 제외). 제작자의 허용 없이 해당 스크립트들을 파는 사람들이 있으니, 주의할 것. 대부분 개발자의 블로그나 깃허브, 트위터 등을 뒤적거리면 찾을 수 있다.[43] 원래, 한국 Google Play에서는 뜨지 않았으나 언제인지 뜨게 되었다[44] 지금은 다시 지원하고 있다.[45] 공유가 기준이지, 완성이 기준인 것은 아니다.[46] android.media.MediaPlayer나 android.media.SoundPool가 아니라, Level.playSound(); 부분이다[47] 압축을 할 때, 보안을 강화하려는 등의 이유로 암호를 걸어놓으면 적용할 수 없다.[48] ModPE.overrideTexture();[49] 밑의 스마트무빙 모드는 6.0 이라 부르는데 0.9.x 시절이고 0.13.x 시절에는 국내 카페 MK 에서 공유한 0isback 이 만든 스마트 무빙 1.0~1.1 이 엄청난 인기를 끌었다. 스마트 무빙 6.0 도 이 버전에서 적용이 되었지만 버그가 아주 많았다.. 1.1은 자바 에디션의 그랩과 그랩 사용 시 나오는 화살표와 스프린트 사용 시 뜨는 번개 표시, 슈퍼점프에 이어 여우무빙 까지 구현한 당시 혁신적인 모드. 1.1 버전까지 공유하고 1.6 엔 모션과 더 많은 기능을 추가했지만 일부 테스터들에게만 공유하고 업뎃으로 인한 각종 코드 변환으로 개발 중단.. 인 줄 알았으나 1.2.x 까지 적용되는 모드를 새로 개발, 공유하고 중단. 1.1 버전은 현재 카페가 바뀌면서 다운로드 글은 비공개 상태이지만 후자는 현재까지도 블로그에서 공유 중이다.[50] 위에서 말한 2번째 시기도 여기에 포함된다.[51] 저 모드는 스마트무빙모드.[52] 다만 최근 버전에는 리소스팩, 행동팩이 추가되어서 스크립트와 병행하여 사용하면 봐줄만 한 퀄리티는 나올 수 있다.