feat(datapacks): add ironchest recipes and datapack sync automation

- Add crafting recipes for copper, iron, gold, and diamond chests using IronChest mod
- Remove vanilla copper chest recipe to prevent conflicts
- Introduce `.env.example` for local world configuration
- Add `bash/sync-datapacks-to-world.sh` script to mirror datapacks to Minecraft world saves
  - Supports one-time sync and watch mode for real-time updates
  - Uses `rsync` for efficient file synchronization
This commit is contained in:
2026-07-21 16:44:58 +03:00
parent fec88fe91b
commit 3c3997ec7d
7 changed files with 132 additions and 5 deletions

2
.env.example Normal file
View File

@ -0,0 +1,2 @@
# Локальный мир для синхронизации datapacks (bash/sync-datapacks-to-world.sh)
LOCAL_WORLD="Новый мир"

67
bash/sync-datapacks-to-world.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/bash
#
# Зеркальная синхронизация ./datapacks → ./saves/$LOCAL_WORLD/datapacks
# LOCAL_WORLD берётся из .env (см. .env.example).
#
# Использование:
# bash/sync-datapacks-to-world.sh # один раз
# bash/sync-datapacks-to-world.sh --watch # следить за изменениями
#
set -euo pipefail
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
REPO_ROOT="${SCRIPT_DIR}/.."
ENV_FILE="${REPO_ROOT}/.env"
DATAPACKS_SRC="${REPO_ROOT}/datapacks/"
if [[ -f "${ENV_FILE}" ]]; then
set -a
# shellcheck disable=SC1090
source "${ENV_FILE}"
set +a
fi
LOCAL_WORLD="${LOCAL_WORLD:-Новый мир}"
DATAPACKS_DST="${REPO_ROOT}/saves/${LOCAL_WORLD}/datapacks/"
sync_once() {
if [[ ! -d "${DATAPACKS_SRC}" ]]; then
echo "Ошибка: не найдена папка ${DATAPACKS_SRC}"
exit 1
fi
mkdir -p "${DATAPACKS_DST}"
echo "[$(date '+%H:%M:%S')] ${DATAPACKS_SRC}${DATAPACKS_DST}"
rsync -a --delete "${DATAPACKS_SRC}" "${DATAPACKS_DST}"
echo "[$(date '+%H:%M:%S')] готово"
}
watch_mode() {
if ! command -v inotifywait &> /dev/null; then
echo "Ошибка: inotifywait не найден (пакет inotify-tools)"
exit 1
fi
sync_once
echo "Watching ${DATAPACKS_SRC} for changes..."
while inotifywait -r -e modify,create,delete,move "${DATAPACKS_SRC}" &> /dev/null; do
sync_once
done
}
case "${1:-}" in
--watch|-w)
watch_mode
;;
--help|-h)
echo "Usage: $(basename "$0") [--watch]"
;;
"")
sync_once
;;
*)
echo "Неизвестный аргумент: $1"
exit 1
;;
esac

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"ISI",
"III"
],
"key": {
"I": "minecraft:copper_ingot",
"S": "minecraft:chest"
},
"result": {
"id": "ironchest:copper_chest"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"ISI",
"III"
],
"key": {
"I": "minecraft:diamond",
"S": "ironchest:gold_chest"
},
"result": {
"id": "ironchest:diamond_chest"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"ISI",
"III"
],
"key": {
"I": "minecraft:gold_ingot",
"S": "ironchest:iron_chest"
},
"result": {
"id": "ironchest:gold_chest"
}
}

View File

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"ISI",
"III"
],
"key": {
"I": "minecraft:iron_ingot",
"S": "ironchest:copper_chest"
},
"result": {
"id": "ironchest:iron_chest"
}
}

View File

@ -1,7 +1,5 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
"minecraft:copper_ingot"
],
"result": {"id": "minecraft:copper_chest", "count": 0}
}
"ingredients": [],
"result": {"item": "minecraft:air", "count": 0}
}