6 Planting a garden
From within R, you can get a record of recent events, like block hits. You can take advantage of this to place blocks at the places you hit. This tutorial shows how to plant random flowers at every spot you hit. It then expands on these ideas to show how to make ice towers.
6.1 Connect with a Minecraft server
First, you need to connect to a Minecraft server, which you can do with the mc_connect
function:
6.2 Create a dataframe with recent hits
The getBlockHits
function will pull a dataframe with recent hits made by players in the Minecraft world. This dataframe will only include hits that were made by an iron sword and with a right click.
Go into the game, make sure you have an iron sword, and use the right click to hit some blocks around you. Go back into R and create a dataframe with those hits using:
x y z block player
1 10 0 8 2 5799549
2 10 0 8 2 5799549
3 10 0 8 2 5799549
The getBlockHits
function will return hits from all players. You just want hits that you made. You can use functions in the dplyr
library to filter the returned dataset just to those you made. You will need to know what your player ID is, but once you do, you can use filter
to get down to just the rows of the hits dataframe where the player id equals your ID using the logical statement player == [your player ID]
:
Now you know where your character made hits. The next step is to place flowers there. To start, let’s make a dataframe with several of the different flowers available in Minecraft. To do this, we can filter the mc_items
dataframe that comes with the miner
dataset to just the rows with certain types of flowers:
data(mc_items)
flowers <- mc_items %>%
filter(name %in% c("Sunflower", "Lilac", "Rose Bush", "Peony",
"Blue Orchid", "Red Tulip", "Pink Tulip",
"Oxeye Daisy"))
flowers
name id style
1 Blue Orchid 38 1
2 Red Tulip 38 4
3 Pink Tulip 38 7
4 Oxeye Daisy 38 8
5 Sunflower 175 0
6 Lilac 175 1
7 Rose Bush 175 4
8 Peony 175 5
Now, you can use a loop. This will loop through every row of the hits dataframe. For each hit, it will randomly pick one of the flower types and place it at that block:
for(i in 1:nrow(hit_locs)){
this_flower <- sample_n(flowers, 1)
setBlock(hit_locs$x[i], hit_locs$y[i], hit_locs$z[i],
id = this_flower$id, style = this_flower$style)
}
If you go back into your Minecraft world, you should see flowers where you made your hits, like this:
6.3 Build ice towers
Expanding on this, instead of just adding in flowers, you could make full towers. The setBlocks
function lets you fill a cuboid space with a single type of blocks. If you have a dataframe of hit locations named hit_locs
, as in the previous example, you can add ice towers with random heights between 1 and 4 units at each location using the following loop:
6.4 Write a function to do this interactively
You can expand on this idea and write a function that will “listen” to your Minecraft world from R and build ice towers as you make block hits.
ice_towers <- function(player_id, delay = 0.2){
while(TRUE){
latest_events <- miner::getBlockHits()
if(nrow(latest_events) == 0) next
latest_events <- latest_events %>%
dplyr::filter(player == player_id) %>%
dplyr::distinct()
if(nrow(latest_events) == 0) next
for(i in 1:nrow(latest_events)){
tower_height <- sample(1:4, size = 1)
miner::setBlocks(latest_events$x[i], latest_events$y[i], latest_events$z[i],
latest_events$x[i], latest_events$y[i] + tower_height, latest_events$z[i],
id = 212)
}
Sys.sleep(delay)
}
}
You can set this function to run from within your R session with a call like:
Then you can go inside your Minecraft world, and you should be able to make ice towers anywhere you hit with a right click with an iron sword.