update recipes for Minecraft 1.21.3, fedora automation
This commit is contained in:
parent
8041d3f2d1
commit
c78974b11d
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
loot_randomizer/loot_table/
|
loot_randomizer/loot_table/
|
||||||
loot_randomizer/*.zip
|
loot_randomizer/*.zip
|
||||||
mcrecipescrambler/
|
mcrecipescrambler/
|
||||||
build/
|
build/
|
||||||
|
data/
|
||||||
|
18
Makefile
Normal file
18
Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
.PHONY: all
|
||||||
|
|
||||||
|
all: clean setup build
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -rf build/
|
||||||
|
|
||||||
|
setup:
|
||||||
|
@mkdir -p data/
|
||||||
|
@mkdir -p build/
|
||||||
|
|
||||||
|
build: recipes
|
||||||
|
|
||||||
|
recipes:
|
||||||
|
@./scripts/build.sh true false _recipes
|
||||||
|
|
||||||
|
loot:
|
||||||
|
@./scripts/build.sh false true _loot
|
@ -4,7 +4,7 @@ Trent keeps asking me for randomizers, so I'm automating the process now so it's
|
|||||||
|
|
||||||
## DOING THE THING
|
## DOING THE THING
|
||||||
1. First, run `$ prep.cmd` to clone the `mcrecipescrambler` repository
|
1. First, run `$ prep.cmd` to clone the `mcrecipescrambler` repository
|
||||||
2. Go to `%appdata%\.minecraft\versions\1.21.1` in Windows, then use 7-Zip to open the `.jar` file as an archive
|
2. Go to `%appdata%\.minecraft\versions\1.21.1` in Windows (`/home/alan/.var/app/com.mojang.Minecraft/.minecraft/` linux flatpak), then use 7-Zip to open the `.jar` file as an archive
|
||||||
3. Copy the contents of `recipe` from the `.jar` into `mcrecipescrambler/crafting_files` (make directory as necessary)
|
3. Copy the contents of `recipe` from the `.jar` into `mcrecipescrambler/crafting_files` (make directory as necessary)
|
||||||
4. Copy the contents of `loot_table` from the `.jar` into `loot_randomizer/loot_table` (can right-click directory and click **Copy to...**)
|
4. Copy the contents of `loot_table` from the `.jar` into `loot_randomizer/loot_table` (can right-click directory and click **Copy to...**)
|
||||||
5. Run `build_double.cmd pack_name` in terminal
|
5. Run `build_double.cmd pack_name` in terminal
|
||||||
|
1
config/blacklist.txt
Normal file
1
config/blacklist.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
crafting_table
|
10
config/packnames.txt
Normal file
10
config/packnames.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
smoothie
|
||||||
|
milkshake
|
||||||
|
butter
|
||||||
|
chocolate
|
||||||
|
cookie
|
||||||
|
pudding
|
||||||
|
biscuit
|
||||||
|
pancake
|
||||||
|
reindeer
|
||||||
|
doughball
|
18
config/packnames_extra.txt
Normal file
18
config/packnames_extra.txt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
smoothie
|
||||||
|
milkshake
|
||||||
|
butter
|
||||||
|
ice-cream
|
||||||
|
chocolate
|
||||||
|
cakedough
|
||||||
|
cookie
|
||||||
|
pudding
|
||||||
|
biscuit
|
||||||
|
brownie
|
||||||
|
orange-soda
|
||||||
|
milk
|
||||||
|
creamer
|
||||||
|
banana
|
||||||
|
syrup
|
||||||
|
pancake
|
||||||
|
reindeer
|
||||||
|
doughball
|
@ -22,11 +22,11 @@ else:
|
|||||||
datapack_filename = datapack_name + '.zip'
|
datapack_filename = datapack_name + '.zip'
|
||||||
|
|
||||||
print('Generating datapack...')
|
print('Generating datapack...')
|
||||||
|
|
||||||
file_list = []
|
file_list = []
|
||||||
remaining = []
|
remaining = []
|
||||||
|
|
||||||
for dirpath, dirnames, filenames in os.walk('loot_table'):
|
for dirpath, dirnames, filenames in os.walk('../data/loot_table'):
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
file_list.append(os.path.join(dirpath, filename))
|
file_list.append(os.path.join(dirpath, filename))
|
||||||
remaining.append(os.path.join(dirpath, filename))
|
remaining.append(os.path.join(dirpath, filename))
|
||||||
@ -47,7 +47,7 @@ for from_file in file_dict:
|
|||||||
|
|
||||||
zip.writestr(os.path.join('data/minecraft/', file_dict[from_file]), contents)
|
zip.writestr(os.path.join('data/minecraft/', file_dict[from_file]), contents)
|
||||||
|
|
||||||
zip.writestr('pack.mcmeta', json.dumps({'pack':{'pack_format':48, 'description':datapack_desc}}, indent=4))
|
zip.writestr('pack.mcmeta', json.dumps({'pack':{'pack_format':57, 'description':datapack_desc}}, indent=4))
|
||||||
zip.writestr('data/minecraft/tags/functions/load.json', json.dumps({'values':['{}:reset'.format(datapack_name)]}))
|
zip.writestr('data/minecraft/tags/functions/load.json', json.dumps({'values':['{}:reset'.format(datapack_name)]}))
|
||||||
zip.writestr('data/{}/functions/reset.mcfunction'.format(datapack_name), 'tellraw @a ["",{"text":"Loot table randomizer by SethBling","color":"green"}]')
|
zip.writestr('data/{}/functions/reset.mcfunction'.format(datapack_name), 'tellraw @a ["",{"text":"Loot table randomizer by SethBling","color":"green"}]')
|
||||||
|
|
79
python/scramble_recipes.py
Normal file
79
python/scramble_recipes.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import zipfile
|
||||||
|
import copy
|
||||||
|
from random import shuffle, choice
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Check arguments
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
datapack_path = "scrambler.zip"
|
||||||
|
print("Using default datapack name: ./scrambler.zip")
|
||||||
|
else:
|
||||||
|
datapack_path = sys.argv[1]
|
||||||
|
|
||||||
|
try:
|
||||||
|
blacklist = list(map(lambda s: s.strip(), open(
|
||||||
|
"../config/blacklist.txt", "r").readlines()))
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("No blacklist detected, ignoring...")
|
||||||
|
blacklist = []
|
||||||
|
all_data = {} # key is the filename, value is the object data.
|
||||||
|
for file_handler in os.scandir('../data/recipe/'):
|
||||||
|
(basename, ext) = os.path.splitext(file_handler.name)
|
||||||
|
if ext == ".json":
|
||||||
|
file_data = json.load(open(file_handler.path, "r"))
|
||||||
|
# Some special recipes don't have a result...
|
||||||
|
# And we don't files in the blacklist too!
|
||||||
|
if file_data.get("result") is None or basename in blacklist:
|
||||||
|
continue
|
||||||
|
all_data[file_handler.name] = file_data
|
||||||
|
|
||||||
|
random_data = copy.deepcopy(all_data)
|
||||||
|
|
||||||
|
# Create the zip file and write the pack.mcmeta
|
||||||
|
try:
|
||||||
|
zip_file = zipfile.ZipFile(datapack_path, "x", zipfile.ZIP_DEFLATED, False)
|
||||||
|
except FileExistsError:
|
||||||
|
print(f'{datapack_path} already exists.')
|
||||||
|
exit()
|
||||||
|
|
||||||
|
data_folder = os.path.join("data", "minecraft", "recipe")
|
||||||
|
zip_file.writestr("pack.mcmeta", json.dumps({
|
||||||
|
"pack": {
|
||||||
|
"pack_format": 57,
|
||||||
|
"description": "Scramble all the recipes!"
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
# Iterate over all the files and pop a random item from 'random_data',
|
||||||
|
# assigning its result value to the current file.
|
||||||
|
for i, (filename, obj) in enumerate(all_data.items()):
|
||||||
|
# I need to find a better way...
|
||||||
|
random_item = random_data.pop(choice(list(random_data.keys())))
|
||||||
|
random_result = random_item.get("result")
|
||||||
|
obj_result = obj.get("result")
|
||||||
|
# Crafting recipes need an object for the result and everything else needs a string.
|
||||||
|
# We have to convert them if the types between the current file and the random item are different.
|
||||||
|
if type(random_result) == type(obj_result):
|
||||||
|
obj["result"] = random_item["result"]
|
||||||
|
# Case where we need a str but the random item is an object
|
||||||
|
elif type(random_result) == dict and type(obj_result) == str:
|
||||||
|
obj["result"] = random_item["result"]["id"]
|
||||||
|
else: # Case where we need an object but the random item is a str
|
||||||
|
obj["result"] = {
|
||||||
|
"item": random_item["result"]
|
||||||
|
}
|
||||||
|
|
||||||
|
zip_file.writestr(os.path.join(data_folder, filename), json.dumps(obj))
|
||||||
|
# Progress bar :D
|
||||||
|
# Thanks : https://gist.github.com/sibosutd/c1d9ef01d38630750a1d1fe05c367eb8
|
||||||
|
percent = 100.0*(i+1)/len(all_data.items())
|
||||||
|
sys.stdout.write('\r')
|
||||||
|
sys.stdout.write("Completed: [{:{}}] {:>3}%"
|
||||||
|
.format('='*int(percent/(100.0/20)),
|
||||||
|
20, int(percent)))
|
||||||
|
sys.stdout.flush()
|
||||||
|
zip_file.close()
|
||||||
|
print()
|
||||||
|
print("Done!")
|
51
scripts/build.sh
Executable file
51
scripts/build.sh
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
DORECIPES=$1
|
||||||
|
DOLOOT=$2
|
||||||
|
APPEND=$3
|
||||||
|
|
||||||
|
for fn in `cat config/packnames.txt`; do
|
||||||
|
PACKNAME="$fn$APPEND"
|
||||||
|
PACK="build/$PACKNAME"
|
||||||
|
echo "generating $PACK"
|
||||||
|
mkdir -p $PACK
|
||||||
|
|
||||||
|
PATHLOOT="python/random_loot.zip"
|
||||||
|
PATHRECIPES="python/scrambler.zip"
|
||||||
|
|
||||||
|
# Do randomization
|
||||||
|
if [ "$DOLOOT" = true ]; then
|
||||||
|
cd python/ && python random_loot.py
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
if [ "$DORECIPES" = true ]; then
|
||||||
|
cd python/ && python scramble_recipes.py
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wait for Filesystem to catch up
|
||||||
|
echo "generated packs, waiting"
|
||||||
|
sleep 0.3
|
||||||
|
|
||||||
|
# Extract generated zip files
|
||||||
|
echo "extracting files"
|
||||||
|
if [ -f $PATHLOOT ]; then
|
||||||
|
7z x $PATHLOOT -o$PACK -r -y
|
||||||
|
fi
|
||||||
|
if [ -f $PATHRECIPES ]; then
|
||||||
|
7z x $PATHRECIPES -o$PACK -r -y
|
||||||
|
|
||||||
|
# rename recipes to recipe, to support 1.21 format
|
||||||
|
mv $PACK/data/minecraft/recipes $PACK/data/minecraft/recipe
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Zip it all up
|
||||||
|
echo "zipping datapack"
|
||||||
|
cd build/
|
||||||
|
7z a -tzip $PACKNAME.zip $PACKNAME/*
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# rm -rf $PACK
|
||||||
|
rm -rf $PATHLOOT
|
||||||
|
rm -rf $PATHRECIPES
|
||||||
|
done
|
Loading…
Reference in New Issue
Block a user