diff --git a/.gitignore b/.gitignore index 5e34b04..17be9b9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ build/ dist/ pyncraft.egg-info -build.txt \ No newline at end of file +build.txt +*.pyc \ No newline at end of file diff --git a/README.md b/README.md index 7b78d95..bcac2f6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,152 @@ -A Python API to Minecraft that works with the [FruitJuice](https://github.com/jdeast/FruitJuice) Bukkit plugin to enable a python and/or scratch programming interface. +# PynCraft -See [FruitJuice/README_server_setup.md](https://github.com/jdeast/FruitJuice/blob/master/README_server_setup.md) for instructions to set up your own python/scratch server that works on java or bedrock. \ No newline at end of file +A Python API to Minecraft that works with the +[FruitJuice](https://github.com/jdeast/FruitJuice) +PaperMC plugin to enable a python and/or scratch programming interface. It can +also use the `RCON` protocol to issue Minecraft commands from python. + +## Server Setup + +See [FruitJuice/server_setup/README_ssetup.md](https://github.com/jdeast/FruitJuice/blob/master/server_setup/README_setup.md) +for instructions for setting up a python/scratch server that works on java +or bedrock using Docker. It runs on Minecraft version 1.20.6, but can +be accessed from newer clients (1.21 as of May 2025) using the +[ViaVersion](https://viaversion.com/index.html) plugin. In addition to +`FruitJuice`, the server supports the `RCON` (remote console) protocol. + +Don't worry-- it's pretty easy. You can skip this step if someone has +already configured a FruitJuice server for you. In that case, you just +need to get its IP address or URL. + +## Development Environment + +You will need to set up some software for coding. + +### Python + +You will need a recent (3.9 or higher) version of python running on your +computer. One easy way to install it is from this link: + +https://www.python.org/downloads/ + +### Visual Studio Code (VSCode) + +VSCode is a free Integrated Development Environment (IDE) application that +may be used for developing code. It has a lot of nice features, like +an editor that colors your python code and checks for errors, a debugger, +an integrated terminal, a Docker plugin and tools for connecting to Docker +containers so you can write code for them while they're running. It even +has AI built in to help you write code! It's free-- give it a try! + +Download VSCode for your operating system +[from here](https://code.visualstudio.com/download). +Launch VSCode, then "Open Directory" and pick (or create) `minecraft/code` +in your home directory. You will then need to install extensions to make +it work with python and Jupyter notebooks. + + +On the left edge, you will see a column of icons. From the top, they are: +
git| \n", + " | angle | \n", + "x | \n", + "y | \n", + "z | \n", + "string | \n", + "rotation | \n", + "degrees | \n", + "radians | \n", + "coord.x | \n", + "coord.y | \n", + "coord.z | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "0.0 | \n", + "0.0 | \n", + "0 | \n", + "-10000.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 1 | \n", + "7.5 | \n", + "1305.0 | \n", + "0 | \n", + "-9914.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 2 | \n", + "15.0 | \n", + "2588.0 | \n", + "0 | \n", + "-9659.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 3 | \n", + "22.5 | \n", + "3827.0 | \n", + "0 | \n", + "-9239.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 4 | \n", + "30.0 | \n", + "5000.0 | \n", + "0 | \n", + "-8660.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 5 | \n", + "37.5 | \n", + "6088.0 | \n", + "0 | \n", + "-7934.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 6 | \n", + "45.0 | \n", + "7071.0 | \n", + "0 | \n", + "-7071.0 | \n", + "north | \n", + "0 | \n", + "0.0 | \n", + "0.000000 | \n", + "0.0 | \n", + "0.0 | \n", + "-1.0 | \n", + "
| 7 | \n", + "52.5 | \n", + "7934.0 | \n", + "0 | \n", + "-6088.0 | \n", + "east | \n", + "4 | \n", + "90.0 | \n", + "1.570796 | \n", + "1.0 | \n", + "0.0 | \n", + "0.0 | \n", + "
| 8 | \n", + "60.0 | \n", + "8660.0 | \n", + "0 | \n", + "-5000.0 | \n", + "east | \n", + "4 | \n", + "90.0 | \n", + "1.570796 | \n", + "1.0 | \n", + "0.0 | \n", + "0.0 | \n", + "
| 9 | \n", + "67.5 | \n", + "9239.0 | \n", + "0 | \n", + "-3827.0 | \n", + "east | \n", + "4 | \n", + "90.0 | \n", + "1.570796 | \n", + "1.0 | \n", + "0.0 | \n", + "0.0 | \n", + "
| 10 | \n", + "75.0 | \n", + "9659.0 | \n", + "0 | \n", + "-2588.0 | \n", + "east | \n", + "4 | \n", + "90.0 | \n", + "1.570796 | \n", + "1.0 | \n", + "0.0 | \n", + "0.0 | \n", + "
| 11 | \n", + "82.5 | \n", + "9914.0 | \n", + "0 | \n", + "-1305.0 | \n", + "east | \n", + "4 | \n", + "90.0 | \n", + "1.570796 | \n", + "1.0 | \n", + "0.0 | \n", + "0.0 | \n", + "
| \n", + " | x | \n", + "y | \n", + "z | \n", + "material | \n", + "state | \n", + "
|---|---|---|---|---|---|
| 0 | \n", + "11 | \n", + "92 | \n", + "-11 | \n", + "AIR | \n", + "\n", + " |
| 1 | \n", + "11 | \n", + "91 | \n", + "-11 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=1 | \n", + "
| 2 | \n", + "11 | \n", + "90 | \n", + "-11 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 3 | \n", + "11 | \n", + "89 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 4 | \n", + "11 | \n", + "88 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 5 | \n", + "11 | \n", + "87 | \n", + "-11 | \n", + "DIORITE | \n", + "\n", + " |
| 6 | \n", + "11 | \n", + "86 | \n", + "-11 | \n", + "DIORITE | \n", + "\n", + " |
| 7 | \n", + "11 | \n", + "85 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 8 | \n", + "11 | \n", + "84 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 9 | \n", + "11 | \n", + "83 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 10 | \n", + "11 | \n", + "82 | \n", + "-11 | \n", + "DIRT | \n", + "\n", + " |
| 11 | \n", + "11 | \n", + "81 | \n", + "-11 | \n", + "STONE | \n", + "\n", + " |
| 12 | \n", + "11 | \n", + "80 | \n", + "-11 | \n", + "STONE | \n", + "\n", + " |
| \n", + " | x | \n", + "y | \n", + "z | \n", + "material | \n", + "state | \n", + "
|---|---|---|---|---|---|
| 0 | \n", + "9 | \n", + "91 | \n", + "-13 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 1 | \n", + "9 | \n", + "91 | \n", + "-12 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 2 | \n", + "9 | \n", + "91 | \n", + "-11 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 3 | \n", + "9 | \n", + "91 | \n", + "-10 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 4 | \n", + "9 | \n", + "91 | \n", + "-9 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 5 | \n", + "9 | \n", + "92 | \n", + "-13 | \n", + "SHORT_GRASS | \n", + "\n", + " |
| 7 | \n", + "9 | \n", + "92 | \n", + "-11 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=2 | \n", + "
| 9 | \n", + "9 | \n", + "92 | \n", + "-9 | \n", + "PINK_PETALS | \n", + "facing=west,flower_amount=3 | \n", + "
| 10 | \n", + "10 | \n", + "91 | \n", + "-13 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 11 | \n", + "10 | \n", + "91 | \n", + "-12 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 12 | \n", + "10 | \n", + "91 | \n", + "-11 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 13 | \n", + "10 | \n", + "91 | \n", + "-10 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 14 | \n", + "10 | \n", + "91 | \n", + "-9 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "
| 17 | \n", + "10 | \n", + "92 | \n", + "-11 | \n", + "PINK_PETALS | \n", + "facing=east,flower_amount=4 | \n", + "
| 18 | \n", + "10 | \n", + "92 | \n", + "-10 | \n", + "PINK_PETALS | \n", + "facing=east,flower_amount=1 | \n", + "
| 19 | \n", + "10 | \n", + "92 | \n", + "-9 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=1 | \n", + "
| 20 | \n", + "11 | \n", + "91 | \n", + "-13 | \n", + "OXEYE_DAISY | \n", + "\n", + " |
| 22 | \n", + "11 | \n", + "91 | \n", + "-11 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=1 | \n", + "
| 23 | \n", + "11 | \n", + "91 | \n", + "-10 | \n", + "SHORT_GRASS | \n", + "\n", + " |
| 32 | \n", + "12 | \n", + "91 | \n", + "-11 | \n", + "DANDELION | \n", + "\n", + " |
| 33 | \n", + "12 | \n", + "91 | \n", + "-10 | \n", + "DANDELION | \n", + "\n", + " |
| 42 | \n", + "13 | \n", + "91 | \n", + "-11 | \n", + "DANDELION | \n", + "\n", + " |
| 43 | \n", + "13 | \n", + "91 | \n", + "-10 | \n", + "PINK_PETALS | \n", + "facing=north,flower_amount=3 | \n", + "
| 44 | \n", + "13 | \n", + "91 | \n", + "-9 | \n", + "SHORT_GRASS | \n", + "\n", + " |
| \n", + " | x | \n", + "y | \n", + "z | \n", + "material | \n", + "state | \n", + "result | \n", + "command | \n", + "
|---|---|---|---|---|---|---|---|
| 0 | \n", + "-192 | \n", + "138 | \n", + "-274 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -192 138 -274 minecraft:grass_block[snowy=false] | \n", + "
| 1 | \n", + "-192 | \n", + "138 | \n", + "-273 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -192 138 -273 minecraft:grass_block[snowy=false] | \n", + "
| 2 | \n", + "-192 | \n", + "138 | \n", + "-272 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -192 138 -272 minecraft:grass_block[snowy=false] | \n", + "
| 3 | \n", + "-192 | \n", + "138 | \n", + "-271 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -192 138 -271 minecraft:grass_block[snowy=false] | \n", + "
| 4 | \n", + "-192 | \n", + "138 | \n", + "-270 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -192 138 -270 minecraft:grass_block[snowy=false] | \n", + "
| 5 | \n", + "-192 | \n", + "139 | \n", + "-274 | \n", + "SHORT_GRASS | \n", + "\n", + " | success | \n", + "setblock -192 139 -274 minecraft:short_grass | \n", + "
| 7 | \n", + "-192 | \n", + "139 | \n", + "-272 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=2 | \n", + "success | \n", + "setblock -192 139 -272 minecraft:pink_petals[facing=south,flower_amount=2] | \n", + "
| 9 | \n", + "-192 | \n", + "139 | \n", + "-270 | \n", + "PINK_PETALS | \n", + "facing=west,flower_amount=3 | \n", + "success | \n", + "setblock -192 139 -270 minecraft:pink_petals[facing=west,flower_amount=3] | \n", + "
| 10 | \n", + "-191 | \n", + "138 | \n", + "-274 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -191 138 -274 minecraft:grass_block[snowy=false] | \n", + "
| 11 | \n", + "-191 | \n", + "138 | \n", + "-273 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -191 138 -273 minecraft:grass_block[snowy=false] | \n", + "
| 12 | \n", + "-191 | \n", + "138 | \n", + "-272 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -191 138 -272 minecraft:grass_block[snowy=false] | \n", + "
| 13 | \n", + "-191 | \n", + "138 | \n", + "-271 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -191 138 -271 minecraft:grass_block[snowy=false] | \n", + "
| 14 | \n", + "-191 | \n", + "138 | \n", + "-270 | \n", + "GRASS_BLOCK | \n", + "snowy=false | \n", + "success | \n", + "setblock -191 138 -270 minecraft:grass_block[snowy=false] | \n", + "
| 17 | \n", + "-191 | \n", + "139 | \n", + "-272 | \n", + "PINK_PETALS | \n", + "facing=east,flower_amount=4 | \n", + "success | \n", + "setblock -191 139 -272 minecraft:pink_petals[facing=east,flower_amount=4] | \n", + "
| 18 | \n", + "-191 | \n", + "139 | \n", + "-271 | \n", + "PINK_PETALS | \n", + "facing=east,flower_amount=1 | \n", + "success | \n", + "setblock -191 139 -271 minecraft:pink_petals[facing=east,flower_amount=1] | \n", + "
| 19 | \n", + "-191 | \n", + "139 | \n", + "-270 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=1 | \n", + "success | \n", + "setblock -191 139 -270 minecraft:pink_petals[facing=south,flower_amount=1] | \n", + "
| 20 | \n", + "-190 | \n", + "138 | \n", + "-274 | \n", + "OXEYE_DAISY | \n", + "\n", + " | success | \n", + "setblock -190 138 -274 minecraft:oxeye_daisy | \n", + "
| 21 | \n", + "-190 | \n", + "138 | \n", + "-273 | \n", + "AIR | \n", + "\n", + " | success | \n", + "setblock -190 138 -273 minecraft:air | \n", + "
| 22 | \n", + "-190 | \n", + "138 | \n", + "-272 | \n", + "PINK_PETALS | \n", + "facing=south,flower_amount=1 | \n", + "success | \n", + "setblock -190 138 -272 minecraft:pink_petals[facing=south,flower_amount=1] | \n", + "
| 23 | \n", + "-190 | \n", + "138 | \n", + "-271 | \n", + "SHORT_GRASS | \n", + "\n", + " | success | \n", + "setblock -190 138 -271 minecraft:short_grass | \n", + "
| 24 | \n", + "-190 | \n", + "138 | \n", + "-270 | \n", + "AIR | \n", + "\n", + " | success | \n", + "setblock -190 138 -270 minecraft:air | \n", + "
| 32 | \n", + "-189 | \n", + "138 | \n", + "-272 | \n", + "DANDELION | \n", + "\n", + " | success | \n", + "setblock -189 138 -272 minecraft:dandelion | \n", + "
| 33 | \n", + "-189 | \n", + "138 | \n", + "-271 | \n", + "DANDELION | \n", + "\n", + " | success | \n", + "setblock -189 138 -271 minecraft:dandelion | \n", + "
| 40 | \n", + "-188 | \n", + "138 | \n", + "-274 | \n", + "AIR | \n", + "\n", + " | success | \n", + "setblock -188 138 -274 minecraft:air | \n", + "
| 41 | \n", + "-188 | \n", + "138 | \n", + "-273 | \n", + "AIR | \n", + "\n", + " | success | \n", + "setblock -188 138 -273 minecraft:air | \n", + "
| 42 | \n", + "-188 | \n", + "138 | \n", + "-272 | \n", + "DANDELION | \n", + "\n", + " | success | \n", + "setblock -188 138 -272 minecraft:dandelion | \n", + "
| 43 | \n", + "-188 | \n", + "138 | \n", + "-271 | \n", + "PINK_PETALS | \n", + "facing=north,flower_amount=3 | \n", + "success | \n", + "setblock -188 138 -271 minecraft:pink_petals[facing=north,flower_amount=3] | \n", + "
| x | \n", + "-2 | \n", + "-1 | \n", + "0 | \n", + "1 | \n", + "2 | \n", + "
|---|---|---|---|---|---|
| y | \n", + "\n", + " | \n", + " | \n", + " | \n", + " | \n", + " |
| -2 | \n", + "\n", + " | 9 | \n", + "10 | \n", + "9 | \n", + "\n", + " |
| -1 | \n", + "9 | \n", + "\n", + " | \n", + " | \n", + " | 9 | \n", + "
| 0 | \n", + "10 | \n", + "\n", + " | \n", + " | \n", + " | 10 | \n", + "
| 1 | \n", + "9 | \n", + "\n", + " | \n", + " | \n", + " | 9 | \n", + "
| 2 | \n", + "\n", + " | 9 | \n", + "10 | \n", + "9 | \n", + "\n", + " |
| x | \n", + "-2.5 | \n", + "-1.5 | \n", + "-0.5 | \n", + "0.5 | \n", + "1.5 | \n", + "2.5 | \n", + "
|---|---|---|---|---|---|---|
| y | \n", + "\n", + " | \n", + " | \n", + " | \n", + " | \n", + " | \n", + " |
| -2.5 | \n", + "\n", + " | 6 | \n", + "10 | \n", + "10 | \n", + "6 | \n", + "\n", + " |
| -1.5 | \n", + "6 | \n", + "7 | \n", + "\n", + " | \n", + " | 7 | \n", + "6 | \n", + "
| -0.5 | \n", + "10 | \n", + "\n", + " | \n", + " | \n", + " | \n", + " | 10 | \n", + "
| 0.5 | \n", + "10 | \n", + "\n", + " | \n", + " | \n", + " | \n", + " | 10 | \n", + "
| 1.5 | \n", + "6 | \n", + "7 | \n", + "\n", + " | \n", + " | 7 | \n", + "6 | \n", + "
| 2.5 | \n", + "\n", + " | 6 | \n", + "10 | \n", + "10 | \n", + "6 | \n", + "\n", + " |