150 lines
4.5 KiB
Python
150 lines
4.5 KiB
Python
# GrovePi Minecraft Controller
|
|
# This is a custom controller for Minecraft, made using the GrovePi.
|
|
# In this example, we show you how to build your own custom Minecraft controller
|
|
# with the GrovePi.
|
|
# See more about the GrovePi at http://dexterindustries.com/grovepi
|
|
# A great reference we used is the MagPi's Essentials Minecraft Guide: https://www.raspberrypi.org/magpi-issues/Essentials_Minecraft_v1.pdf
|
|
'''
|
|
Software Setup:
|
|
Before we begin, run the following commands to setup:
|
|
sudo apt-get install minecraft-pi
|
|
sudo pip3 install python3-xlib
|
|
sudo pip3 install pyautogui
|
|
|
|
Hardware Setup:
|
|
Setup the GrovePi on the Raspberry Pi.
|
|
Connect a touch Sensor to port A0.
|
|
Connect a Joystick to port A2.
|
|
Connect a touch sensor to Port D3.
|
|
Connect a touch sensor to Port D4.
|
|
|
|
To run:
|
|
1. Start Minecraft on the Pi.
|
|
2. Start a world.
|
|
3. Start Python3 (IDLE).
|
|
4. Open this file (GrovePi-Controller.py)
|
|
5. Click "Run" --> "Run Module"
|
|
6. Click back into Minecraft.
|
|
'''
|
|
|
|
import mcpi.minecraft as minecraft
|
|
import grovepi
|
|
import time
|
|
import mcpi.block as block
|
|
import pyautogui as pag
|
|
|
|
# Setup the four sensors.
|
|
touch_sensor1 = 4 # This will be the Build Key
|
|
touch_sensor2 = 3 # This will be the Destroy Key
|
|
touch_sensor3 = 14 # This will be the Fly Key.
|
|
|
|
# This will be the joystick.
|
|
xPin = 16 # Port A2
|
|
yPin = 17 # Port A2
|
|
|
|
grovepi.pinMode(xPin, "INPUT")
|
|
grovepi.pinMode(yPin, "INPUT")
|
|
|
|
grovepi.pinMode(touch_sensor1, "INPUT")
|
|
grovepi.pinMode(touch_sensor2, "INPUT")
|
|
grovepi.pinMode(touch_sensor3, "INPUT")
|
|
|
|
flying = 0;
|
|
|
|
# Creat a minecraft entity. We'll reference this through the entire program.
|
|
mc = minecraft.Minecraft.create()
|
|
|
|
# unpress() - This function unpresses all keys.
|
|
def unpress():
|
|
for key in ['s','w','a','d',' ']:
|
|
pag.keyUp(key)
|
|
|
|
# move() - This function presses the key "direction"
|
|
def move(direction):
|
|
unpress()
|
|
pag.keyDown(direction)
|
|
|
|
#build - This function builds a square block of "size" size.
|
|
def build(p):
|
|
size = 5
|
|
mc.setBlocks(p.x+1, p.y+1, p.z+1, (p.x + size), (p.y + size), (p.z + size), block.STONE.id)
|
|
print("Build!")
|
|
|
|
#destroy - This function destroys a square block of "size" size.
|
|
def destroy(p):
|
|
size = 5
|
|
mc.setBlocks(p.x+1, p.y+1, p.z+1, (p.x + size), (p.y + size), (p.z + size), block.AIR.id)
|
|
print("Destroy!")
|
|
|
|
# fly - This starts and stops the flying mode.
|
|
def fly():
|
|
pag.keyDown(' ')
|
|
pag.keyUp(' ')
|
|
pag.keyDown(' ')
|
|
pag.keyUp(' ')
|
|
print("Flying!")
|
|
|
|
# We do the following loop over and over.
|
|
while True:
|
|
|
|
p = mc.player.getTilePos() # Get the position of our person in Minecraft.
|
|
|
|
try:
|
|
|
|
# Read the three keys.
|
|
# Touch Sensor 1: Build something if it's touched.
|
|
if(grovepi.digitalRead(touch_sensor1)):
|
|
build(p)
|
|
# Touch Sensor 2: Destroy something if it's touched.
|
|
if(grovepi.digitalRead(touch_sensor2)):
|
|
destroy(p)
|
|
# Touch Sensor 3: Start or stop flying if it's been touched.
|
|
if(grovepi.digitalRead(touch_sensor3)):
|
|
#The variable flying is whether we're flying or not.
|
|
if(flying == 0):
|
|
flying = 1
|
|
fly()
|
|
else:
|
|
flying = 0
|
|
|
|
|
|
# Read the joystick. We do that with the two pins x and y.
|
|
x = grovepi.analogRead(xPin)
|
|
y = grovepi.analogRead(yPin)
|
|
|
|
# Check to see if the joystick has been pressed down.
|
|
click = 1 if x >= 1020 else 0
|
|
print(str(x) + ", " + str(y))
|
|
|
|
# Check to see if we've been put into flying mode. If we have, we can teleport ourselves!
|
|
if(flying):
|
|
jump = 5 # This is the jump size, how far we're going to jump in each direction.
|
|
playerPosition = mc.player.getPos() # Get our persons position in Minecraft.
|
|
|
|
# Now we'll take the joystick values and jump in the direction it tells us to.
|
|
if(x < 400):
|
|
mc.player.setPos(playerPosition.x+jump, playerPosition.y, playerPosition.z)
|
|
|
|
# Here we will make sure that the click and the x-axis reading are not confused.
|
|
elif(x > 600 and (click == 0)):
|
|
mc.player.setPos(playerPosition.x-jump, playerPosition.y, playerPosition.z)
|
|
|
|
elif(y > 600):
|
|
mc.player.setPos(playerPosition.x, playerPosition.y+jump, playerPosition.z)
|
|
|
|
elif(y < 400):
|
|
mc.player.setPos(playerPosition.x, playerPosition.y-jump, playerPosition.z)
|
|
|
|
# If we didn't read anything, unpress the buttons.
|
|
else:
|
|
unpress()
|
|
|
|
# If the joystick is clicked, we fly up one spot.
|
|
if(click):
|
|
pag.keyUp(' ')
|
|
pag.keyDown(' ')
|
|
|
|
|
|
except IOError:
|
|
print("Error")
|
|
|