마인크래프트/포켓에디션/ModPE 개발

1 개요

300px

마인크래프트 포켓에디션의 런처인 블록런처(BlockLauncher)의 제3세대 모드로, 프로그래밍 초보자도 쉽게 제작할 수 있는 모드이다.

개발자는 Treebl. 블록런처의 개발자인 주웨이 장(Zhuowei Zhang)[1]가 블록런처에 ModPE 기능을 넣으면서 주웨이가 만든 것이라고 아는 사람들이 많다. ModPE 불러오기 메뉴에 'Treebl 의 공식 레포'가 있는 것이 이 때문.

1세대는 PTPatch[2] 모드, 2세대는 Add-On(애드온)[3], 3세대는 ModPE 스크립트, 줄여서 스크립트라고 불리기도 한다. 3세대 모드인 ModPE 스크립트는 1세대의 장점, 2세대의 장점을 합쳐 쉽고 정교하게 만들 수 있다. 가능한 영역은 애드온이 스크립트보다 넓다. 애초에 애드온은 MCPE의 메소드를 직접 후킹하는 거라 절대적으로 자유도가 높다.

이런 ModPE 스크립트를 제작하는 사람들을 스크립터라고 부르며 높은 퀄리티의 작품을 생산하는 사람들은 대부분 포럼에 가입되어있다. 포럼은 전세계가 사용하고 이용자도 훨씬 많으니 어떻게 보면 당연한 것.

ModPE 스크립트JavaScript 기반으로 만들어졌다. 또한 Rhino 엔진을 기반으로 돌아가기 때문에 안드로이드 뷰를 사용할 수 있다. 참고로 android.widget.PopupWindow와 android.widget.Switch는 진저브레드(2.3.x) 이하에서 사용할 수 없다.

ModPE 는 블럭런처가 브릿지 역할을 하여 ModPE -> BlockLauncher (ScriptManager) -> 블럭런처 네이티브 함수 -> MCPE 함수를 거쳐서 가기 때문에 처리속도가 느리다. 복잡한 작업하면서 ModPE 에 속도에 기대하는 것은 하지 않는 것이 정신건강에 좋을 것이다. 게다가 자바스크립트 자체가 인터프리터를 쓰다보니 더더욱 속도는 안습. 속도를 바란다면 MCPE 를 직접 만지는 애드온을 파는게 좋다. 직접 네이티브를 호출하자! public들이 많다! 테러 하기 좋은 것들은 private이다...으앙! 자바 리플렉션으로 private사용도 먹히지않는다! 망했다 근데, 사실 자바 리플렉션이 먹힌다고 한다.

MCPE Master라는 앱으로도 스크립트를 사용할 수 있으나, 100% 구동되지는 않는다. MCPE Master에서는 블록런처와는 달리, 스크립트를 애드온이라고 불렀으나, 지금은 ModPE라고 부른다. MCPE Master는 procCmd도 안된다. 통칭 '툴박스'라고 불리는 앱으로도 스크립트 사용은 가능하다.

해외에서는 스크립트라는 명칭 대신 js mod, ModPE Script 등으로 불린다. 모드(.mod)와 스크립트(.js)를 한국과는 달리 철저하게(?) 구분하지 않는 듯 싶으며, 해외에서 .mod는 PTPatch라고 불린다.

마인크래프트 0.16 호환버전 블록런처가 나왔다! 하지만 무료버전이다. 유료버전은 앙대!

2 메소드

ModPE의 메소드는 중복되는것이 여러개있다. 무엇을 선택하든 상관없다.
하지만 이 문서에서는 setTile() -> Level.setTile(); 과같이 부모가 있는 메소드를 쓰는것을 권장한다.

2.1 기본 메소드

  • addItemInventory(ItemId, ItemCount, ItemDamage); 인벤토리에 아이템 추가. 서바이벌모드에서 자주쓰이며 인벤토리에 아이템을 추가한다 음수도 사용 가능[4]
  • bl_setMobSkin(par1Object, par2String); 미 사용 = Entity.setMobSkin(entity, skin);
  • bl_spawnMob(par1double, par2double, par3double, par4int, par5String); 미 사용 = Level.spawnMob(x, y, z, entity, skin);
  • 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좌표 반환
  • getTile(x, y, z); 좌표의 블럭아이디 반환
  • getYaw(entity); 엔티티의 좌우값 반환 = Entity.getYaw(entity); 추천. 인자 생략시 플레이어의 좌우값 바환.
  • preventDefault(); 이벤트 취소. 일부 이벤트 함수에서 서버원이 그 이벤트를 발생시키는 경우 작동하지 않음.
  • print(Message); 토스트 메시지를 띄움
  • rideAnimal(rider, animal); 동물을 태움 rider가 animal을 탐. 블록런처 1.11 ~ 1.11.1에서 사용시 아무 일도 일어나지 않거나 팅긴다.
  • setNightMode(boolean); 항상 밤
  • setPosition(ent, x, y, z); 엔티티의 위치 변환[5] = Entity.setPosition(ent, x, y, z); 추천. 서버원에게 사용시 작동하지 않는다,
  • setPositionRelative(Entity, AddX, AddY, AddZ); 엔티티의 위치 변환[6] = Entity.setPositionRelative(AddX, AddY, AddZ); 추천
  • setRot(Entity, yaw, pitch); 엔티티의 상하 좌우값 변경 그러나 잘안된다[7] = Entity.setRot(yaw, pitch); 추천
  • setTile(x, y, z, id, damage); 블럭 설치 메소드
  • setVelX(Entity, value); 엔티티를 X방향으로 value 값만큼 속도를 준다 = Entity.setVelX(Entity, value); 추천
  • setVelY(Entity, value); 엔티티를 Y방향으로 value 값만큼 속도를 준다 = Entity.setVelY(Entity, value); 추천
  • setVelZ(Entity, value); 엔티티를 Z방향으로 value 값만큼 속도를 준다 = Entity.setVelZ(Entity, value); 추천
  • 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.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();에 의한 items-opaque.png 파일을 원상태로 되돌려놓는다.
  • ModPE.saveData(name, value); 해당 내용에 해당 값을 저장한다. 변수와 달리 블록런처를 종료해도 저장되며, 스크립트 간 공유는 불가능.고수들은 그냥 파일 입출력을 사용한다.
  • ModPE.selectLevel(mapFolder); 해당 맵으로 이동한다. 일정 확률로 팅기며, 맵의 이름이 아닌, 폴더명(Level.getWorldDir();로 확인 가능)이 기준이다.
  • ModPE.setCamera(entity); 시야를 해당 엔티티의 시야로 바꾼다. 블록 설치나 파괴 가능.
  • ModPE.setFoodItem(itemId, texture, textureIndex, par4int, itemName, par6int); 음식 추가
  • ModPE.setFov(fov); 플레이어의 시야를 fov로 설정한다. 음수 가능.
  • ModPE.setGameSpeed(tickForSecond); 게임속도를 설정한다. 초당 몇 틱이 흐를지 결정. 20틱이 1초이다.
  • ModPE.setGuiBlocks(par1String); 아이템이 인벤토리 핫바에 보이는 이미지를 바꿀때 쓴다. 근데 왜 인자가 1개지
  • ModPE.setItem(itemId, texture, textureIndex, itemName, par5int); 아이템을 추가한다. (ModPE.setItem(아이템 코드, 아이템 텍스쳐, 아이템 텍스쳐 데미지, 아이템 이름, 한 슬롯에 넣을 수 있는 최대 개수); 와 같은 형식 이런식으로 쓰니 뭔가 길다)
  • 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(par1int, par2double, par3double, par4double, par5double, par6double, par7double, par8int);왜 설명이 없는진 모르겠지만 알아서 실험해보기 바란ㄷ...
  • Level.biomeIdToName(par1int); 바이옴의 아이디를 이름으로 출력한다. 자세한건 실험해보길 바란ㄷ...
  • Level.destroyBlock(x, y, z, shouldDrop); 해당 위치의 블록을 파괴한다. function destroyBlock을 호출하지 않으며, 0.12.1 이상에서는 shouldDrop이 false여도 블록이 드롭된다(shouldDrop이 true이면 드롭, false이면 드롭X).
  • Level.dropItem(x, y, z, height, id, amound, damage); 해당 위치에 해당 아이템이 height만큼 위로 튀어나오면서 드롭된다. 멀티를 지원하는 스크립트에서 addItemInventory 대용으로 사용된다
  • Level.explode(x, y, z, onFire); explode();와 동일. onFire에 true를 넣으면 폭발시, 불이 붙고 false면 붙지 않는다.
  • Level.getAddress(); 서버에 접속하고 있으면 그 서버의 아이피를 딴다.
  • 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(par1int, par2int, par3int, par4int);
  • Level.getFurnaceSlotCount(par1int, par2int, par3int, par4int);
  • Level.getFurnaceSlotData(par1int, par2int, par3int, par4int);
  • Level.getGameMode(); 게임 모드를 불러옴. 서바이벌은 0, 크리에이티브는 1.
  • Level.getGrassColor(x, z);
  • Level.getSignText(x, y, z, line); 해당 위치에 있는 표지판의 line번째 줄의 내용을 가져옴. line은 0부터 시작.
  • Level.getTile(x, y, z); getTile();과 동일.
  • Level.getTime(); 현재의 마크 시간을 불러옴.
  • Level.getWorldDir(); 현재 들어가 있는 맵의 폴더명을 불러옴.
  • Level.getWorldName(); 현재 들어가 있는 맵의 이름을 불러옴
  • Level.playSound(x, y, z, par4String, par5double, par6double);
  • Level.playSoundEnt(par1Object, par2String, par3double, par4double);
  • Level.setChestSlot(x, y, z, slot, id, damage, amount); 해당 위치에 있는 창고의 해당 슬롯의 아이템을 설정함. 블록런처 1.9.7에서 오류 발생. 다른 함수들과 달리 개수보다 데미지가 먼저나옴.
  • Level.setFurnaceSlot(par1int, par2int, par3int, par4int, par5int, par6int, par7int);
  • Level.setGameMode(gameMode); 게임모드 설정. 서바이벌은 0, 크리에이티브는 1.
  • Level.setGrassColor(x, z, par3int);
  • Level.setNightMode(value); 아마도 value로 시간을 고정한다.
  • Level.setSignText(x, y, z, line, value); 해당 위치에 있는 표지판의 line번째 줄의 내용을 value로 설정. line은 0부터 시작.
  • Level.setSpawn(par1int, par2int, par3int);
  • Level.setSpawnerEntityType(par1int, par2int, par3int, par4int);
  • Level.setTile(par1int, par2int, par3int, par4int, par5int); setTile();과 동일.
  • Level.setTime(time); 시간 설정.
  • Level.spawnChicken(par1double, par2double, par3double, par4String);
  • Level.spawnCow(par1double, par2double, par3double, par4String);
  • Level.spawnMob(x, y, z, entityType, skin); 해당 위치에 해당 엔티티 타입 아이디를 가진 엔티티를 해당 스킨을 씌워서 소환. 스킨 생략 시, 기존의 스킨으로 스폰됨. 화염구 등의 일부 엔티티에는 통하지 않고, 스킨 설정역시 일부 엔티티들에게는 적용이 안됨.

2.4 Player 메소드

  • Player.addItemCreativeInv(id, damage, count); id damge count순으로 넣는다. 크리에이티브 인벤토리에 아이템을 추가한다
  • Player.addItemInventory(id, damage, count); addItemInventory();와 동일
  • Player.canFly(); 플레이어의 공중 부양 가능 여부를 불리언 값으로 가져온다.
  • Player.clearInventorySlot(slot); 인벤토리 슬롯의 아이템을 제거한다
  • Player.getArmorSlot(slot); 플레이어가 입은 갑옷의 아이디를 반환한다
  • Player.getArmorSlotDamage(slot); 플레이어가 입은 갑옷의 데미지를 반환한다
  • Player.getCarriedItem(); 플레이어가 든 아이템을 반환
  • Player.getCarriedItemCount(); 플레이어가 든 아이템 개수를 반환
  • Player.getCarriedItemData(); 플레이어가 든 아이템 데미지를 반환
  • Player.getDimension(); 플레이어가 있는 월드를 반환 (오버월드, 지옥)
  • Player.getEntity(); 플레이어 엔티티 반환. getPlayerEnt();와 동일.
  • Player.getInventorySlot(slot); 인벤토리 슬롯의 아이템 반환
  • Player.getInventorySlotCount(slot); 인벤토리 슬롯의 갯수 반환
  • Player.getInventorySlotData(slot); 인벤토리 슬롯의 데미지 반환
  • Player.getName(entity); 플레이어의 이름을 반환한다 닭 아이디를 넣으면 어떻게 될까? Not a Player가 나오지 않을까?
  • Player.getPointedBlockData(); 플레이어가 바라보고있는 블럭의 데이터를 반환한다[8]
  • Player.getPointedBlockId(); 플레이어가 바라보고있는 블럭의 아이디를 반환한다
  • Player.getPointedBlockSide(); 플레이어가 바라보고있는 블럭의 면을 반환한다
  • Player.getPointedBlockX(); 플레이어가 바라보고있는 블럭의 x좌표를 반환한다
  • Player.getPointedBlockY(); 플레이어가 바라보고있는 블럭의 y좌표를 반환한다
  • Player.getPointedBlockZ(); 플레이어가 바라보고있는 블럭의 z좌표를 반환한다
  • Player.getPointedEntity(); 플레이어가 바라보고있는 블럭의 엔티티를 반환한다
  • Player.getSelectedSlotId(); 플레이어가 선택한 슬롯을 반환한다
  • Player.getX(); 플레이어의 x좌표를 반환한다
  • Player.getY(); 플레이어의 y좌표를 반환한다
  • Player.getZ(); 플레이어의 z좌표를 반환한다
  • Player.isFlying(); 플레이어가 날고있는지 반환한다
  • Player.isPlayer(entity); 엔티티가 플레이어인지 반환한다
  • Player.setArmorSlot(slot, id, damage); 플레이어에게 갑옷을 입히게 한다
  • Player.setCanFly(boolean); 플레이어를 공중 부양 가능 여부를 설정한다
  • Player.setFlying(boolean); 플레이어를 공중 부양 여부를 설정한다
  • Player.setHealth(value); 플레이어의 체력을 설정한다. 0.12.1부터는 서버원에게 사용 시 바로 반영되지 않는다.
  • Player.setSelectedSlotId(slot); 플레이어의 슬롯을 설정한다.
  • Player.enchant(slot, enchant, power); 해당 슬롯에 있는 아이템을 해당 강도로 인첸트한다.
  • Player.getEnchant(slot); 해당 슬롯에 있는 아이템에 한 인첸트를 배열로 반환한다.

2.5 Entity 메소드

  • Entity.addEffect(ent, mobEffect, par3int, par4int, par5boolean, par6boolean); 왜 이건 설명이 없지
  • Entity.getAll(); 맵 전체의 엔티티를 배열로 불러온다.
  • Entity.getAnimalAge(ent); 엔티티의 나이를 가져온다. 되는지는 모르겠다.
  • Entity.getEntityTypeId(ent); 엔티티의 엔티티 타입 아이티를 가져온다
  • Entity.getHealth(ent); 엔티티의 체력을 가져온다.
  • Entity.getItemEntityCount(ent); 드롭된 아이템의 개수를 가져온다.
  • Entity.getItemEntityData(ent); 드롭된 아이템의 데이터를 가져온다.
  • Entity.getItemEntityId(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.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는 틱단위.
  • Entity.setCape(ent, skin); 미작동
  • Entity.setCarriedItem(par1Object, par2int, par3int, par4int);
  • Entity.setCollisionSize(par1Object, par2double, par3double);
  • Entity.setFireTicks(ent, sec); 해당 엔티티를 sec초 동안 태운다.
  • Entity.setHealth(ent, value); 해당 엔티티의 체력을 value로 설정한다. 0.12.1 부터는 서버원에게 사용시 바로 반영되지 않는다.
  • Entity.setMobSkin(par1Object, par2String);
  • Entity.setNameTag(ent, name); 엔티티의 이름을 바꾼다. 플레이어일경우 채팅이름은 안바뀌지만 머리위 이름표는 바뀐다. 채팅이름 바꾸려면 function chatHook이랑 Entity.getNameTag이랑 채팅함수를 쓰면 된..
  • 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); pitch, yaw였던가 엔티티의 시야를 바꾼다 setRot와 동일하게 잘작동되지않는다.
  • Entity.setSneaking(ent, isSneak); 엔티티를 숙이기 한다. 근데, 플레이어일 경우 됐다가 다시 풀린다.
  • 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);
  • Item.addFurnaceRecipe(par1int, par2int, par3int);
  • Item.addShapedRecipe(par1int, par2int, par3int, par4Scriptable, par5Scriptable);
  • Item.defineArmor(par1int, par2String, par3int, par4String, par5String, par6int, par7int, par8int);
  • Item.defineThrowable(par1int, par2String, par3int, par4String, par5int); 무려 던질 수 있는 아이템을 추가할 수 있다! ModPE.setItem과 사용법이 같다.
  • Item.getName(itemId, itemDamage, par3boolean);
  • Item.isValidItem(itemId); 해당 아이템 아이디를 가진 아이템이 존재하는지를 반환한다.
  • Item.setCategory(par1int, par2int, par3int); 아이템의 분류(장식 블록, 건축 블록, 도구 등)를 설정한다.
  • Item.setHandEquipped(itemId, isEquipment); 아이템을 들고 있을 때, 도구처럼 들고 있을 지를 설정한다.
  • Item.setMaxDamage(itemId, damage); 아이템의 내구도를 설정한다.
  • Item.setProperties(itemId,{"foil":true or false}); 인첸트가 적용 된 아이템에 있는 빛나는 효과 처럼 설정한다.

2.7 Block 메소드

  • Block.defineBlock(id, par2String, par3Object, par4Object, par5Object, par6Object); 블럭을 추가한다. 알아서 실험해보기 바란ㄷ..
  • Block.getAllBlockIds(); 모든 블럭의 아이디를 반환한다.
  • Block.getRenderType(id); 블럭 렌더러 타입을 반환한다.
  • Block.setColor(id, array); 블럭의 전체적 색감을 변경한다 array는 [0xFFFFFF] 처럼 int 형이 들어가야하며 배열의 개수에따라 데미지가 달라진다.
  • Block.setDestroyTime(id, time); 블럭을 부수는 시간을 변경한다. time을 -1로 하면 베드락처럼 캐지지 않는다
  • Block.setExplosionResistance(id, Resistance); 블럭이 폭발 데미지에서 버티는강도를 정한다. Block.setDestroyTime();과는 달리 -1을 넣으면 잘 터진다.근데 이게 너무 잘터진다
  • 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을 입력하면 픽셀단위로 수정이 가능하다.

2.8 Server 메소드

  • Server.getAddress(); 서버의 ip 주소를 반환한다. 도메인 서버의 경우에도 ip로 반환한다. 본격 ping 없이 도메인 서버의 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에서는 서버장이 사용하는 경우, 네이티브센드챗을 사용하여도 일부 기종에서 작동하지 않는다. 이 경우는 clientMessage();를 함께 사용하면 작동한다. 그리고 최신버전에서 고쳐졌다.

2.9 이벤트 리스너

기본 지급하는 콜백 함수들이다. 일부 함수들은 멀티플레이를 지원하지 않는다. '이벤트 함수'등으로 불리는 경우도 있으나, '이벤트 리스너'가 정확한 명칭이다.

  • function attackHook(attacker, victim) '플레이어가 때릴 시 호출'이였으나, 지금은 몹들이 때리는 경우도 호출되는 듯 하다.
  • function chatHook(str) 해당 스크립트를 적용한 플레이어가 채팅을 했을때 호출된다. 과거에는 채팅의 내용이 /로 시작하면 proCmd만 호출되고 chatHook은 호출되지 않았다.
  • function procCmd(cmd) 해당 스크립트를 적용한 플레이어가 커맨드(/로 시작)를 쳤을때 호출된다. (/ 뒤에 나오는 문자열이 저장된다.) MCPE Master에서는 미작동인것 같다.
  • function destroyBlock(x, y, z, side) 블럭을 부수었을 때 호출된다.
  • 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 explodeHook(entity, x, y, z, power, onFire) 폭발 하였을때 호출된다 0.12.X버전 이후로 고장
  • function serverMessageReceiveHook(str) 서버메시지를 받았을때 호출된다 예를들어 'XXX가 서버에 들어왔습니다' 라던지...
  • function chatReceiveHook(str, sender) 플레이어(서버원 포함)가 채팅했을때 호출된다. 채팅 내용이 /로 시작하는 경우는 호출되지 않는다. sender는 해당 플레이어의 Client Id가 아닌, 닉네임이다.
  • function leaveGame() 월드를 나갔을때 호출된다.
  • function deathHook(murderer, victim) 엔티티가 죽었을때 호출된다.
  • function selectLevelHook() 레벨을 선택했을때 호출된다.
  • function newLevel() 레벨에 들어갔을때 호출된다. function selectLevelHook()과 다른점은 function selectLevelHook()은 선택즉시 호출하지만, function newLevel()은 완전히 로드가 끝났을때 호출된다.
  • function startDestroyBlock(x, y, z, side) 블럭을 부수기 시작할 때 호출된다.
  • function modTick() 1초당 20번 호출된다. 게임 스피드를 조작할시 바뀐다. 20틱이 1초이다. 정확히는 1틱 마다 호출.
  • function useItem(x, y, z, itemid, blockid, side, itemDamage, blockDamage) 블럭을 터치했을때 호출된다. 0.11.1 이상부터 서버원이 문을 터치한 경우는 호출되지 않는다.
  • function levelEventHook() 인자 모름
  • function redstoneUpdateHook(x, y, z, newCurrent, someBooleanIDontKnow음?, blockId, blockData) 특정 블록에 레드스톤 신호가 갔을 때 발동되는 함수이다. 참고로 블록에 레드스톤 신호가 가게끔 설정하는 것은 Block.setRedstoneConsumer(blockId,boolean)이다. 이거 설정 안 해두면 이 이벤트 리스너는 절대로 발동하지 않는다. 오류라고 샷건치지 마시길! x, y, z는 특정 블록의 위치를 갖고온다. newCurrent는 레드스톤 신호의 세기로서, 대부분 newCurrent > 0 (레드스톤 신호 On) 으로 쓰거나 newCurrent == 0 (레드스톤 신호 Off) 으로 쓴다. someBooleanIDontKnow에 대해 아는 사람은 추가 바람.어떤 스크립트에서는 someBooleanIDontKnow를 worldLoading으로 적어놓기도 한것을 필자가 보았으나, 기능이 무엇인지는 알지 못한다. blockId와 blockData는 각각 블록의 아이디와 블록의 데이터 (데미지)이다.
  • function screenChangeHook(screenName) 1.13rc1에 추가된 리스너로, 이름 그대로 화면이 바뀌면 호출된다. 아래는 screenName으로 반환되는 것들이다. 별게 다있다
    • 메인화면 : start_screen
    • 채팅창 : chat_screen
    • 게임화면 : in_game_screen
    • 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
    • 맵삭제창 : confirm_screen
    • 맵나갈때창 : leave_level_screen
    • 맵로딩창(싱글) : progress_screen - local_world_load
    • 인벤토리(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

2.10 상수들

기본 값을 좀더 편하게 알기위해 만들어놓았다. 변수가 아닌, 상수이기 때문에, 중간에 값을 바꿀 수 없다.
엔티티 아이디는 개인적으로 그냥 정수값 외우는게 더편하다. 몇 개는 안나와있다.

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'로 사용이 가능하다.

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 타입 상수

  • 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 (징징이 NPC주민) : 15
  • EntityType.WOLF (늑대) : 14
  • EntityType.ZOMBIE (좀비) : 32
  • EntityType.ZOMBIE_VILLAGER (주민 좀비) : 44


다음은 위에 나오지 않은 엔티티들의 엔티티 타입 아이디이다.

  • 당나귀 : 23
  • 노새 : 24
  • 말 : 25
  • 스켈레톤 말 : 26
  • 좀비 말 4기수의 따까리 : 27
  • 마녀 : 45
  • 스트레이야생동물 길 잃은 몹 : 46
  • 허스크 : 47
  • 위더 스켈레톤 : 48
  • 가디언 : 49
  • 엘더 가디언 : 50
  • NPC : 51 NPC는 실수로 추가한 엔티티라서 0.16.0 베타 2에서 삭제되었다.
  • 카메라 : 95
  • 깔대기 마인 카트 : 96
  • TNT 마인 카트 : 97
  • 창고 마인 카트 : 98

카메라는 마인크래프트 0.14.X의 이스터에그로써, 다른 버전에서는 카메라가 없..

스폰알의 아이템 데미지가 해당 엔티티의 엔티티 타입 아이디라고 카더라. 안믿기면 심볼 뜯어보던가

PC에서는 허스크의 엔티티가 좀비의 엔티티와 같고, 스트레이 / 위더 스켈레톤의 엔티티는 스켈레톤의 엔티티와 같으며, 좀비 말 / 해골 말 / 당나귀 / 노새의 엔티티는 일반 말과 같다. 사실 스켈레톤과 위더 스텔레톤의 엔티티 타입 아이디도 0.14.3까지는 34으로 동일했다.

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 상수의 값.


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 클래스의 함수명을 사용하면 된다.
블록런처 1.12.2를 기준으로 덤프한 것이다.

최신버전은 아니지만 참고 하고 싶은 사람은 여기에서 참고해도 좋다. 블록런처 1.8.6[9]의 소스로 추정된다.

앞에다가 폴더 경로와 클래스명(.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();

뭔지 모르는건 알아서 실험해보기 바란다.
테러에 악용되는 함수들의 접근 지정자가 전부 public에서 private로 바뀌어서, 더 이상 접근할 수도 없고, 목록에 나오지 않는다. 목록에 뜨지 않는 것은 디컴파일[10]을 하면 알 수 있다.

2.12 유틸

Utils.java 파일에 들어있는 외부에서 접근이 가능한 객체들이다. 블록런처 1.12.2가 기준이다
블록런처가 프로버전인지 확인하는 기능(그런데 이건 사용한 스크립트가 있을까?)이나 해당 폴더의 내용을 전부 지우는히잌 악용하지 말자 함수도 있다.
앞에다가 폴더 경로와 클래스명(.java 파일의 이름)을 붙여서 사용하면 된다. clearDirectory();을 예로 들자면 net.zhuoweizhang.mcpelauncher.Utils.clearDirectory();과 같이 사용하면 된다. 그대로 적어놓고 오류뜬다고 하는 사람들은 없겠지..?

  • 리턴값의_자료형 함수명(인자들의 자료형);

위의 형식으로 적어놓았다.

  • 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(); 로 만들수있다
이제 랜더러를 만들었으면 수정을 해야하는데

Renderer.getPart("Part");로 각 파츠를 얻는다
파츠의 종류는

  • Head
  • Body
  • LeftArm
  • RightArm
  • LeftLeg
  • RightLeg

이것들이 있다 모자 랜더러를 아시는 분은 추가바람

Renderer.getPart로 각파츠를 얻으면 이제 그 파츠를 수정해야한다
part.clear(); 로 그 파츠의 모델링된 부분을 모두 지울수 있다.
part.addBox(x, y, z, sizeX, sizeY, sizeZ); 로 파츠에 박스를 추가할수있다.
part.setTextureOffset(x, y); 로 추가한 박스의 이미지를 씌울수있다
이걸 적용할 엔티티의 스킨의 좌표값이 인자이다.

아쉽게도 각도 조절은 없다
하지만 스마트 무빙을 제작하던중에 픽셀화라는 기법이 나왔다.
시간이되면 추가바람 사실 스마트무빙 제작 인원이긴한데 랜더링은(...)

이렇게 랜더러를 모델링 하고나면
Entity.setRenderType(ent, renderType);으로 적용시키면 되는데

주의할점이 renderType은 Renderer.renderType으로 적어줘야 제대로 renderType이 적용된다

비교적 객체지향적으로 만들었구만 주웨이

3 유용한 스크립트

  • 에디터
    • 팬동 에디터 - 원 제작자는 팬동. 0.10.5 이후 팬동이 이 스크립트 작업을 중단[11]함으로써 현재 Irenebode가 계속해서 제작중이다. 현재 팬동에디터는 0.14.0을 기준으로 서버관리, 월드에딧, 개인적인 용도 등 엄청난 기능이 하나로 묶여있는 스크립트이다.
    • Super Tool Kit - 이건 분명 에디터인데, 테러 세력에서 무단수정이나, 서버에서 newLevel 부활 등을 통해, 테러에 악용되고 있는 스크립트이다. 여담으로 제작자가 알파핵 개발진 중 한 명이다. 사실 팬동에디터도 테러에 악용되었던 적이 있다. Play 스토어에 해당 스크립트를 다운받는 앱이 올라와 있다.
  • 유틸
    • 스마트 무빙 - 제작자는 버전마다 다르며 최초제작자는 리페이다. 리페 -> 리페, 초크 -> 리페, 초크, 멸종위기AB형, Dark, SY PlanP 순으로 합작이되었다. 스마트무빙은 마인크래프트 PE 마인크래프트 GUI를 적용하였다. 현재 [[::: MK :::|MK]] 에 오픈소스로 공유되었고 0isback이라는 사람이 오픈소스를 이어받아 제작중이다. 현재 애드온으로 다시 제작중.
    • Too Many Items - 마인크래프트 0.7.x 시절부터 존재하던 스크립트. 당시에는 혁명이였던 스크립트이나, 현재의 사람들은 투매니 하면 대부분 애드온을 떠올린다. 오른쪽 아래에 M 버튼이 있는 버전과 왼쪽 위에 작은 파란색 버튼이 있는 버전 이 두 가지가 있다. 대부분이 모르고 있지만, 투매니는 모드(.mod), 스크립트(.js), 애드온(.apk) 이 3가지 모두 존재하며, 투매니 스크립트와 투매니 애드온의 제작자[12]는 동일하다.
    • Player Administrator - 인디벨이 만든 서버원 관리 스크립트. 플레이어 어드민 또는 PAD로 줄여서 불리기도 한다. 원래는 CUI 방식이였으나, GUI 방식으로 변경되었다. 현재 최신 버전은 1.3.1.
  • 테러
    • 광역파괴 - 누군가가 Level.destroyBlock();이 서버에서 작동되는 것을 발견하고 뿌렸다. 악용 방지를 위해 더 이상 상세한 설명은 생략하며 일반적인 방법으로는 실행할 수 없다.
    • 고스트핵 - 제작자는 Kiiler BLS, Play 스토어에 다운가능한 앱이 있는데, 가끔 사라진다. 이 스크립트를 가지고 설치는 테러범들이 많은데, 이건 스크립트이다. 따라서 당연히 서버원이 키고 들어와서 사용하는 경우는 대부분의 기능이 작동하지 않는다. 그래도 테러 스크립트로 분류되어 서버장들의 머리를 아프게 하고 있다. 무엇보다 제작자가 개발을 중단했다. 그런데, 개발자가 합작으로 스크립트 제작 앱[13]을 하나 만들었다. 어쩐지 고스트핵 소스가 앱 개발을 하듯이 되어있더라...[14]
    • 프리져핵 - 현재 테러 세력에서 점유율이 높은 편인 스크립트. 아마도 다크 치터 측에서 위험하기 때문에 더 이상 서버 접속 시, 버튼 유지를 지원하지 않겠다고 하고[15], 고스트핵도 멀티 플레이에서 막혀서 점유율이 높아진 것으로 추정된다. 원격 차단 소스가 포함되어 있고, 난독화도 되어 있으니, 무단공유는 하지 말자.
    • 알파핵 - 테러 스크립트 + 해킹툴. 도스 공격기[16]의 기능이 포함되어 있기 때문에, 공유는 불법이나, 개나소나 다 뿌리고 다닌다. 그러다가 다 같이 철컹철컹당한거임. 최초로 도스 공격이 가능한 스크립트라고 잘못 알고 있는 경우가 있는데, 도스 공격 기능이 있는 5번째 스크립트이다. 여담으로 일부 기능이 한국어를 지원한다.
    • Vertex-Client-PE - 알파핵 개발자들 중 한 명이 제작에 참여한 스크립트이다. 5명 정도가 합작을 하였으며, UI는 PC의 노더스와 유사하나, 기능은 많지 않다. UI때문에 노더스핵이라고도 불린다. 퀄리티는 상대적으로 높은 편. .js가 아니라 .modpkg이며, 일부에서는 '위자드핵'이라고도 불린다.
    • Open Hack
  • 존재하지 않지만, 테러범들이 열심히 찾는 스크립트
    • 강제오피 스크립트 - 그런 거 없다. 정확히는 스크립트도 사용하는 흡사 강제 오피는 존재한다. 어드민이 스크립트를 적용하면 그 스크립트가 어드민의 폰에 있는 PMMP 폴더를 건들여서 서버원이 앱을 사용하여 본인에게 OP를 부여할 수 있도록 하는 방식으로, '강제'가 아니고 무엇보다 DPMMP가 아니거나 어드민이 속지 않으면 사용할 수 없다. 즉, 서버원이 일방적으로 스크립트를 통해 본인에게 강제적으로 OP를 부여하는 스크립트는 없다. 물론, 플러그인 자체에 강제 오피가 심어져 있는 경우도 있다.

4 .modpkg

Js파일과텍스쳐팩이합쳐서 스크립트적용하는곳에적용하는것

4.1 개요

비교적 최근데 나온 것으로, 무려 사운드[17],택스쳐팩,스크립트한꺼번에 적용할 수 있는 확장자다. 적용 방식은 스크립트와 같다. 사실 텍스쳐팩을 포함한다고 볼 수 있는 리소스팩의 경우, 소리 파일이나 언어 파일, 마크 내의 문구들도 수정이 가능하다. 즉, 스크립트 + 리스스팩.

4.2 제작법

텍스쳐팩(리소스팩) 내부에 script 폴더를 만들고, 그 안에다가 스크립트 파일을 넣으면 된다. 그리고 확장자는 .zip에서 .modpkg 로 바꾸면 된다.

5 여담

한국에서 카페 및 여러 블로그 등지에서 많이 배포된다. 직접 하나하나 찾는다면 실력자를 많이 볼 수 있다. 이외에는 블로그, 타 카페 등에서 공유한다.

이 문서는 수정이 많이 필요한 문서이다. 아무나 와서 고칠 수는 있다만, 웬만하면 수정본을 복사하고 저장하는 것이 좋을 것이다.

예전 ModPE 스크립트는 PC에 비해 퀄리티가 낮았다.
하지만 점점 발전하며 아래와 같은 높은 퀄리티의 작품도 나오기 시작했다.

사실 이론상으로는 스크립트 만으로도 .modpkg가 구현이 가능하다. 이는 스크립트에 웹상에서 텍스쳐팩 파일을 받아서 적용하는 함수[18]가 있기 때문. 잘 오용하면 이론상으로는 다른 파일들도 적용할 수 있다. 근데, 이건 어디까지나 이론상. 실제로는 적용만 된다. 스킨 파일이나 GUI 파일들은 스크립트가 적용되었음을 인식하는데, 다른 파일(아이템, 터레인 등)은 적용되어있어도 없다고 빼애액 거린다.

위에서 말한 흡강오는 사실 1분이면 만들 수 있는데, 팔고 다니는 사람들이 있다.

5.1 동영상

저 영상은 1년 전 리뷰로 현재 ModPE 스크립트 수준은 퀄리티가 낮은 PC의 모드를 따라잡을 수 있는 수준으로 발전하게 되었다.[19] 그래도 아직은 PC의 모드를 따라잡기에는 모자란 퀄리티이다
  1. 닉네임은 500 ISE인데 언제부터인가 실명으로 더 자주 불리게 되었다.
  2. Pocket Tool Patch. 블록런처에서도 적용 가능.
  3. MCPE 0.16.0에서 추가된 Add-ons와는 다른 것이다. 블록런처에서 적용하는 애드온(Add-On)은 심볼에 후킹을 해서 메소드를 구현, C++로 만드는 '앱'이며, 마인크래프트에서 적용하는 애드온(Add-ons)는 마인크래프트 .apk 파일 내부에 있는 json 파일을 수정하는 것이다. 즉, Add-ons는 텍스쳐팩(리소스팩)의 확장.
  4. 참고로 음수를 쓰면 아이템을 가져간다.
  5. 인자가 실제 좌표를 적는것이다
  6. 인자가 원래 위치값에서 더하는 값이된다
  7. 쓰래드로 1밀리초씩 딜레이를줘서 쓰면 된다는 소문이 있다
  8. 스플릿 컨트롤 시 십자가 부분이 바라보고 있는 부분이지만 일반 컨트롤 시 마지막으로 터치한 위치가 바라보는 곳이 된다. 화면을 움직이려고 하는 스와이프도 포함.
  9. 마인크래프트 pe 0.10.5를 지원하는 가장 높은 버전의 블록런처
  10. 컴파일의 반대과정. 기계어를 프로그래밍 언어로 바꾸는 작업이다.
  11. 스크립트 자체를 접은 것 같다.
  12. MrArm
  13. 왜인지는 모르겠으나, 갑자기 Play 스토어에서 뜨지 않는다. 앱 이름은 ModPE IDE. 그 모서리가 둥근 파란색 사각형 아이콘에 흰 색으로 ModPE라고 쓰여있는 어플.
  14. 하지만 Bark Free Edition(Pro도 있음)이라는 스크립트 만들기 앱이 있다.
  15. 지금은 다시 지원하고 있다.
  16. 콜백 이름은 function ddos인데, 정작 기능은 도스 공격기이다.
  17. android.media.MediaPlayer가 아니라, Level.playSound(); 부분이다
  18. ModPE.overrideTexture();
  19. 저 모드는 스마트무빙모드.