본문 바로가기

Python with Minecraft

#2. 마인크래프트 파이썬 API

마인크래프트 게임 안에서 블록을 만든다거나 게임 플레이어의 위치를 변경하는 등과 같은 프로그램을 만들기 위해서는 마인크래프트 파이썬 API를 이용해야합니다. 즉, API에서 제공하는 기능만을 파이썬 프로그램으로 구현할 수 있는 것입니다.


그래서, 이번에는 어떤 API들이 있는지 살펴보도록 하겠습니다.


  마인크래프트 파이썬 API 구조


 파이썬 파일

클래스 

 설명

 minecraft.py

 Minecraft

camera 

 카메라 각도와 위치를 변경

 player

 플레이어의 위치 가져오기 및 변경하기

 entity

 entity들의 위치를 가져오기 및 변경하기

 events

 게임에서 발생하는 이벤트 가져오기

 block.py

 Block

 블록 정의(특히 블록 타입)

 event.py

 BlockEvent

 블록 이벤트 정의

 vec3.py

 Vec3

 3차원 벡터 관리(x, y, z 좌표)

 connection.py

 -

 API에서 사용되는 내부 모듈

 util.py

 -

 API에서 사용되는 내부 모듈


  호환성


모든 함수와 블록 타입이 모든 버전의 API에서 가능하지 않습니다. 크게 PC버전과 라즈베리파이 버전으로 나뉘는데 다음과 같은 아이콘으로 표기하도록 하겠습니다.


 

Minecraft: Pi 버전에서 사용 가능

 

RaspberryJuice(PC 버전)에서 사용 가능



  Minecraft 클래스


마인크래프트 게임과 상호작용하는 메인 클래스로서 게임과의 연결, 게임 플레이어에 대한 변경, 블록에 대한 변경 그리고 이벤트 감지 등과 같은 함수들을 포함하고 있습니다.


 .create(address = "localhost", port = 4711) → Minecraft object

▶ Minecraft(address, port)에 연결을 생성

#use default address and port
mc = minecraft.Minecraft.create()
#specify ip address and port
mc = minecraft.Minecraft.create("192.168.1.1", 4711)

 .getBlock(x, y, z) → id:int

▶ 주어진 x, y, z 좌표값에 위치한 블록 타입 가져오기

#retrieves the block type for the block at 0,0,0

blockType = mc.getBlock(0,0,0)

 .getBlocks(x0, y0, z0, x1, y1, z1) → [id:int]

▶ 주어진 2개의 좌표 사이에 존재하는 블록들을 리스트로 가져오기

#get the block id's in a cuboid
blocks = mc.getBlocks(-1,-1,-1,1,1,1)
for block in blocks:
    print block

 .getBlockWithData(x, y, z) → Block

▶ 주어진 좌표 x, y, z에 위치한 블록 데이터 가져오기

#retrieves a block object for the block at 0,0,0
blockObj = mc.getBlockWithData(0,0,0)

 .setBlock(x, y, z, blockType, blockData)

▶ 주어진 좌표 x, y, z에 data 타입의 블록 생성하기

#sets a block at an x, y, z co-ordinate to a particular type
mc.setBlock(0,0,0,block.DIRT.id)
#sets a block to a particular type and 'subtype'
mc.setblock(0,0,0,block.WOOD.id, 1)

 .setBlocks(x0, y0, z0, x1, y1, z1, blockType, blockData)

▶ 2개의 좌표 사이 공간을 주어진 블록 타입의 블록들로 가득 채우기

#sets many blocks at a time, filling the gap between 2 sets of x, y, z co-ordinates
mc.setBlocks(-1, -1, -1, 1, 1, 1, block.STONE.id)

 .getHeight(x, z) → int

▶ 높이(y 좌표값) 구하기

 y = mc.getHeight(0,0)

 .getPlayerEntityIds() → [id:int]

▶ 접속한 게임 플레이어들의 entity ID값들 가져오기

#get the entity id's of the players connected to the game
entityIds = mc.getPlayerEntityIds()
for entityId in entityIds:
    print entityId

 .getPlayerEntityId(playerName) → [id:int]

▶ 주어진 이름의 플레이어에 대한 entity ID 가져오기

#get the entity id of a name player 'martinohanlon'
entityId = mc.getPlayerEntityId("martinohanlon")
print entityId

 .saveCheckpoint()

▶ world를 복구할 수 있는 체크포인트 저장하기

mc.saveCheckpoint()

 .restoreCheckpoint()

▶ 체크포인트 상태의 world로 복구하기

 .postToChat(message)

▶ 게임 체팅 창에 메세지를 포스팅

mc.postToChat("Hello Minecraft World")

 .setting(setting, status)

▶ keys: world_immutable, nametags_visible

#change world immutable to True
mc.setting("world_immutable", True)
#change nametags_visible setting to False
mc.setting("nametags_visible", False)


  Minecraft.player 클래스


 .getPos()

▶ 플레이어의 좌표값을 실수값인 Vec3 타입으로 가져오기

#get players position as floats
playerPos = mc.player.getPos()

 .setPos(x, y, z)

▶ 플레이어의 위치를 좌표값 (x, y, z)로 이동하기

#get players position as floats
mc.player.setPos(0.0,0.0,0.0)

 .getTilePos()

▶ 플레이어가 현재 서 있는 tile의 위치 가져오기

#get the position of the tile the players is on
playerTile = mc.player.getTilePos()

 .setTilePos(x, y, z)

▶ 플레이어를 tile의 위치로 이동하기

#set the position of the tile the player is on
mc.player.setTilePos(0,0,0)

 .setting(setting, status)

▶ keys: autojump

#change the autojump setting to True
mc.player.setting("autojump", True)

 .getRotation() → [angle:float]

▶ 플레이어의 회전 각도(0 ~ 360) 가져오기

#get the rotation of the player
angle = mc.player.getRotation()
print angle

 .getPitch() → [pitch:float]

▶ 플레이어에 대한 피치 각도(-90 ~ 90) 가져오기

#get the pitch for the player
pitch = mc.player.getPitch()
print pitch

 .getDirection() → [Vec3]

▶ 플레이어의 방향 벡터 가져오기

#get the player's direction
direction = mc.player.getDirection()
print direction


  Minecraft.entity 클래스


entity 함수들은 게임에서 entity 또는 플레이어들과 상호작용하기 위해서 .getPlayerEntityIds() 함수와 함께 사용합니다. 이 함수들은 멀티플레이어 게임에서 유용합니다.


#get the entity id's of the players connected to the game
entityIds = mc.getPlayerEntityIds()
1stEntityId = entityIds[0]
2ndEntityId = entityIds[1]
...


 .getPos(entityId)

#get first entity position as floats
entityPos = mc.entity.getPos(entityId)

 .setPos(entityId, x, y, z)

#set the players position as floats
mc.entity.setPos(entityId,0.0,0.0,0.0)

 .getTilePos(entityId)

#get the position of the tile the entity is on
entityTile = mc.entity.getTilePos(entityId)

 .setTilePos(entityId, x, y, z)

#set the position of the tile the entity is on
mc.entity.setTilePos(entityId,0,0,0)

 .getRotation(entityId) → [angle:float]

#get the rotation of an entity

angle = mc.entity.getRotation(entityId)
print angle

 .getPitch(entityId→ [pitch:float]

#get the pitch for an entity
pitch = mc.entity.getPitch(entityId)
print pitch

 .getDirection(entityId→ [Vec3]

#get an entities direction

direction = mc.entity.getDirection()
print direction


  Minecraft.camera 클래스


 .setNormal(entityId)

▶ 카메라 모드를 normal 마인크래프트 뷰로 설정하기

#set camera mode to normal for a specific player
mc.camera.setNormal(entityId)

 .setFixed()

▶ 카메라 모드를 fixed(고정) 뷰로 설정하기

#set camera mode to fixed 
mc.camera.setFixed()

 .setFollow(entityId)

▶ 카메라 모드를 entity를 따르도록 설정하기

#set camera mode to follow for a specific player
mc.camera.setFollow(entityId)

 .setPos(x, y, z)

▶ 카메라 entity 위치를 x, y, z 좌표로 설정하기

#set camera position to a specific position of x, y, z
mc.camera.setPos(0,0,0)


  Minecraft.events 클래스


 .pollBlockHits() → [BlockEvent]

▶ 블록 깨뜨리기(검에 의해서 발생)

#get block event hits that have occured since the last time the function was run
blockEvents = mc.events.pollBlockHits()
for blockEvent in blockEvents:
    print blockEvent

 .pollChatPosts() → [ChatEvent]

#get chat post events (messages) since the last time the function was run
chatEvents = mc.events.pollChatPosts()
for chatEvent in chatEvents:
    print chatEvents

 .clearAll()

 

▶ 모든 과거 이벤트 삭제하기

#clear all events that have happened since the events where last got
mc.events.clearAll()