feat(addons): hemp plant, wild cherry tree, naturalist-lite

New addons:
- hemp-addon: silverlabs:hemp_crop (5 ages, indoor sun-lamp grown vs
  outdoor sky-lit), shears harvest, cauldron tincture, brownie food,
  bonemeal, sun-lamp redstone-lit block (light_dampening: 0 so crops
  beneath stay lit), grass-seed bootstrap, wandering-trader buyback,
  pillager raid stealing.
- trees-features-addon: ods_orch wild cherry tree — log/leaves/planks/
  stripped/sapling/fruit blocks with seasonal fruit states, structure-
  spawn worldgen.
- naturalist-lite-addon: 13-mob subset of Naturalist (deer, fox, owl,
  skunk, snake, hedgehog, red panda, capybara, elephant, kangaroo,
  moose, tiger, firefly), trimmed for Switch joinability.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 22:00:06 +01:00
parent b9e3380f6c
commit 7c8cd5b075
984 changed files with 192691 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_fruit_down",
"menu_category": { "category": "none" },
"states": {
"ods_orch:fruits_state": { "values": { "min": 0, "max": 5 } }
}
},
"components": {
"minecraft:destructible_by_mining": { "seconds_to_destroy": 0.2 },
"minecraft:destructible_by_explosion": { "explosion_resistance": 0.2 },
"minecraft:collision_box": false,
"minecraft:selection_box": { "origin": [-6, 0, -6], "size": [12, 12, 12] },
"minecraft:geometry": "minecraft:geometry.cross",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_fruit_down",
"render_method": "alpha_test"
}
}
}
}
}

View File

@@ -0,0 +1,25 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_fruit_side",
"menu_category": { "category": "none" },
"states": {
"ods_orch:fruits_state": { "values": { "min": 0, "max": 5 } }
}
},
"components": {
"minecraft:destructible_by_mining": { "seconds_to_destroy": 0.2 },
"minecraft:destructible_by_explosion": { "explosion_resistance": 0.2 },
"minecraft:collision_box": false,
"minecraft:selection_box": { "origin": [-6, 0, -6], "size": [12, 12, 12] },
"minecraft:geometry": "minecraft:geometry.cross",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_fruit_side",
"render_method": "alpha_test"
}
}
}
}
}

View File

@@ -0,0 +1,48 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_leaves",
"menu_category": {
"category": "nature",
"group": "itemGroup.name.leaves"
},
"states": {
"ods_orch:decay_state": {
"values": {
"min": 0,
"max": 2
}
},
"ods_orch:fruits_state": {
"values": {
"min": 0,
"max": 5
}
}
}
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 0.2
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 0.2
},
"minecraft:flammable": {
"destroy_chance_modifier": 30,
"catch_chance_modifier": 60
},
"minecraft:light_dampening": 1,
"minecraft:map_color": "#9d7fc4",
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_leaves",
"render_method": "alpha_test",
"ambient_occlusion": false
}
}
}
}
}

View File

@@ -0,0 +1,53 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_log",
"menu_category": {
"category": "nature",
"group": "itemGroup.name.log"
},
"states": {
"ods_orch:decay_state": {
"values": {
"min": 0,
"max": 2
}
},
"ods_orch:fruits_state": {
"values": {
"min": 0,
"max": 5
}
}
},
"traits": {
"minecraft:placement_direction": {
"enabled_states": [
"minecraft:facing_direction"
]
}
}
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 2
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 2
},
"minecraft:flammable": {
"destroy_chance_modifier": 5,
"catch_chance_modifier": 5
},
"minecraft:map_color": "#5b3a29",
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_log",
"render_method": "opaque"
}
}
}
}
}

View File

@@ -0,0 +1,24 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_planks"
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 2.0
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 3.0
},
"minecraft:map_color": "#edd3da",
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_planks",
"render_method": "alpha_test"
}
}
}
}
}

View File

@@ -0,0 +1,25 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_sapling",
"menu_category": {
"category": "nature",
"group": "itemGroup.name.sapling"
}
},
"components": {
"minecraft:destructible_by_mining": { "seconds_to_destroy": 0 },
"minecraft:destructible_by_explosion": { "explosion_resistance": 0 },
"minecraft:collision_box": false,
"minecraft:selection_box": { "origin": [-6, 0, -6], "size": [12, 12, 12] },
"minecraft:geometry": "minecraft:geometry.cross",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_sapling",
"render_method": "alpha_test"
}
}
}
}
}

View File

@@ -0,0 +1,39 @@
{
"format_version": "1.21.0",
"minecraft:block": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_stripped_log",
"menu_category": {
"category": "nature",
"group": "itemGroup.name.log"
},
"traits": {
"minecraft:placement_direction": {
"enabled_states": [
"minecraft:facing_direction"
]
}
}
},
"components": {
"minecraft:destructible_by_mining": {
"seconds_to_destroy": 2
},
"minecraft:destructible_by_explosion": {
"explosion_resistance": 2
},
"minecraft:flammable": {
"destroy_chance_modifier": 5,
"catch_chance_modifier": 5
},
"minecraft:map_color": "#a87a5e",
"minecraft:geometry": "minecraft:geometry.full_block",
"minecraft:material_instances": {
"*": {
"texture": "ods_orch_wild_cherry_tree_stripped_log",
"render_method": "opaque"
}
}
}
}
}

View File

@@ -0,0 +1,20 @@
{
"format_version": "1.21.0",
"minecraft:item": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_sapling_placer",
"menu_category": {
"category": "nature",
"group": "itemGroup.name.sapling"
}
},
"components": {
"minecraft:max_stack_size": 64,
"minecraft:icon": "ods_orch_wild_cherry_tree_sapling_placer",
"minecraft:block_placer": {
"block": "ods_orch:wild_cherry_tree_sapling",
"use_on": ["minecraft:grass_block", "minecraft:dirt", "minecraft:podzol", "minecraft:coarse_dirt", "minecraft:moss_block", "minecraft:mud", "minecraft:rooted_dirt"]
}
}
}
}

View File

@@ -0,0 +1,54 @@
{
"format_version": 2,
"header": {
"name": "Trees Lite (Wild Cherry)",
"description": "Hand-crafted wild cherry tree pack: log, planks, leaves, sapling, fruit. 3 mcstructure variants from More Trees Add-On.",
"uuid": "17e143de-4d3e-4086-a8a7-bb27c20fff48",
"version": [
1,
0,
0
],
"min_engine_version": [
1,
21,
0
]
},
"modules": [
{
"type": "data",
"uuid": "38e2acc9-bdcb-4784-b0d2-b90075032513",
"version": [
1,
0,
0
]
},
{
"type": "script",
"language": "javascript",
"uuid": "7bc85674-bdf8-4de6-ab03-b153ed485bf3",
"version": [
1,
0,
0
],
"entry": "scripts/main.js"
}
],
"dependencies": [
{
"uuid": "8b6f60d5-866a-47a3-9a83-afe867dfd57d",
"version": [
1,
0,
3
]
},
{
"module_name": "@minecraft/server",
"version": "1.17.0"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,19 @@
{
"format_version": "1.21.0",
"minecraft:recipe_shapeless": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_planks_from_log"
},
"tags": ["crafting_table"],
"unlock": [
{ "item": "ods_orch:wild_cherry_tree_log" }
],
"ingredients": [
{ "item": "ods_orch:wild_cherry_tree_log" }
],
"result": {
"item": "ods_orch:wild_cherry_tree_planks",
"count": 4
}
}
}

View File

@@ -0,0 +1,19 @@
{
"format_version": "1.21.0",
"minecraft:recipe_shapeless": {
"description": {
"identifier": "ods_orch:wild_cherry_tree_planks_from_stripped_log"
},
"tags": ["crafting_table"],
"unlock": [
{ "item": "ods_orch:wild_cherry_tree_stripped_log" }
],
"ingredients": [
{ "item": "ods_orch:wild_cherry_tree_stripped_log" }
],
"result": {
"item": "ods_orch:wild_cherry_tree_planks",
"count": 4
}
}
}

View File

@@ -0,0 +1,113 @@
import { world, system } from "@minecraft/server";
const SAPLING_BLOCK = "ods_orch:wild_cherry_tree_sapling";
const LOG = "ods_orch:wild_cherry_tree_log";
const LEAVES = "ods_orch:wild_cherry_tree_leaves";
const FLOWER = "ods_orch:wild_cherry_tree_fruit_side";
function rand(n) { return Math.floor(Math.random() * n); }
function chance(p) { return Math.random() < p; }
// Build a wisteria tree procedurally. Variant 0/1/2 = subtle canopy width tweaks.
// Roughly 25% larger than the prior 5-tall structures: 7-block trunk, 7x7 base canopy.
function buildWisteria(dim, x, y, z, variant) {
const cmds = [];
const trunkH = 6 + (variant === 1 ? 1 : 0); // 6 or 7
const wide = variant === 2 ? 4 : 3; // half-extent of widest canopy ring
const mid = wide - 1;
const narrow = mid - 1;
// Clear sapling tile, then place trunk.
cmds.push(`setblock ${x} ${y} ${z} air`);
for (let dy = 0; dy < trunkH; dy++) {
cmds.push(`setblock ${x} ${y + dy} ${z} ${LOG}`);
}
const canopyBase = y + trunkH - 2; // canopy starts 2 below the very top so the trunk pokes up
// Wide ring (full square minus corners)
fillSquareRing(cmds, x, canopyBase, z, wide, true);
fillSquareRing(cmds, x, canopyBase + 1, z, wide, true);
// Mid ring
fillSquareRing(cmds, x, canopyBase + 2, z, mid, false);
// Narrow cap
fillSquareRing(cmds, x, canopyBase + 3, z, narrow, false);
cmds.push(`setblock ${x} ${canopyBase + 4} ${z} ${LEAVES} [] replace air`);
// Hanging wisteria flower tassels: drop FLOWER blocks 1-3 below the wide ring edges.
const edgeOffsets = [
[-wide, 0], [wide, 0], [0, -wide], [0, wide],
[-mid, -mid], [-mid, mid], [mid, -mid], [mid, mid],
[-wide, -1], [-wide, 1], [wide, -1], [wide, 1],
[-1, -wide], [1, -wide], [-1, wide], [1, wide],
];
for (const [dx, dz] of edgeOffsets) {
if (!chance(0.7)) continue;
const drop = 1 + rand(3); // 1-3 blocks
for (let i = 1; i <= drop; i++) {
cmds.push(`setblock ${x + dx} ${canopyBase - i} ${z + dz} ${FLOWER} [] replace air`);
}
}
return cmds;
}
// Fill a hollow square (or solid) ring of LEAVES at level y with given half-extent r.
// `clipCorners` true = drop the four extreme corners for a softer outline.
function fillSquareRing(cmds, cx, cy, cz, r, clipCorners) {
const x1 = cx - r, x2 = cx + r;
const z1 = cz - r, z2 = cz + r;
cmds.push(`fill ${x1} ${cy} ${z1} ${x2} ${cy} ${z2} ${LEAVES} replace air`);
if (clipCorners) {
cmds.push(`setblock ${x1} ${cy} ${z1} air`);
cmds.push(`setblock ${x2} ${cy} ${z1} air`);
cmds.push(`setblock ${x1} ${cy} ${z2} air`);
cmds.push(`setblock ${x2} ${cy} ${z2} air`);
}
}
function growSapling(block, player) {
const dim = block.dimension;
const { x, y, z } = block.location;
const variant = rand(3);
const cmds = buildWisteria(dim, x, y, z, variant);
let i = 0;
// Throttle to ~30 commands per tick to avoid command-rate spikes.
const step = () => {
const end = Math.min(i + 30, cmds.length);
for (; i < end; i++) {
try { dim.runCommand(cmds[i]); } catch (_) {}
}
if (i < cmds.length) system.runTimeout(step, 1);
else if (player) player.sendMessage("§5[Trees] §7A wisteria blooms.");
};
step();
}
// Bonemeal usage on sapling → grow tree
world.beforeEvents.playerInteractWithBlock.subscribe((event) => {
const block = event.block;
if (!block || block.typeId !== SAPLING_BLOCK) return;
const stack = event.itemStack;
if (!stack || stack.typeId !== "minecraft:bone_meal") return;
event.cancel = true;
const player = event.player;
system.run(() => {
growSapling(block, player);
// Consume one bonemeal
try {
const inv = player.getComponent("minecraft:inventory")?.container;
if (inv) {
const sel = player.selectedSlotIndex;
const cur = inv.getItem(sel);
if (cur && cur.typeId === "minecraft:bone_meal") {
if (cur.amount > 1) { cur.amount -= 1; inv.setItem(sel, cur); }
else { inv.setItem(sel, undefined); }
}
}
} catch (_) {}
});
});
system.run(() => {
world.sendMessage("§5[Trees] §7Wisteria pack loaded.");
});

View File

@@ -0,0 +1,11 @@
pack.name=Trees Lite (Wild Cherry)
pack.description=Hand-crafted wild cherry tree pack.
tile.ods_orch:wild_cherry_tree_log.name=Wild Cherry Log
tile.ods_orch:wild_cherry_tree_stripped_log.name=Stripped Wild Cherry Log
tile.ods_orch:wild_cherry_tree_planks.name=Wild Cherry Planks
tile.ods_orch:wild_cherry_tree_leaves.name=Wild Cherry Leaves
tile.ods_orch:wild_cherry_tree_sapling.name=Wild Cherry Sapling
tile.ods_orch:wild_cherry_tree_fruit_side.name=Wild Cherry Cluster
tile.ods_orch:wild_cherry_tree_fruit_down.name=Wild Cherry Hanging
item.ods_orch:wild_cherry_tree_sapling_placer.name=Wild Cherry Sapling

View File

@@ -0,0 +1 @@
["en_US"]

View File

@@ -0,0 +1,10 @@
{
"format_version": "1.21.0",
"ods_orch:wild_cherry_tree_log": { "sound": "wood" },
"ods_orch:wild_cherry_tree_stripped_log": { "sound": "wood" },
"ods_orch:wild_cherry_tree_planks": { "sound": "wood" },
"ods_orch:wild_cherry_tree_leaves": { "sound": "grass" },
"ods_orch:wild_cherry_tree_sapling": { "sound": "grass" },
"ods_orch:wild_cherry_tree_fruit_side": { "sound": "moss_block" },
"ods_orch:wild_cherry_tree_fruit_down": { "sound": "moss_block" }
}

View File

@@ -0,0 +1,29 @@
{
"format_version": 2,
"header": {
"name": "Trees Lite Resources",
"description": "Textures, models, and particles for the wild cherry tree pack.",
"uuid": "8b6f60d5-866a-47a3-9a83-afe867dfd57d",
"version": [
1,
0,
3
],
"min_engine_version": [
1,
21,
0
]
},
"modules": [
{
"type": "resources",
"uuid": "eb47190a-a556-4892-b894-4f4e6028c82d",
"version": [
1,
0,
3
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1,11 @@
pack.name=Trees Lite (Wild Cherry)
pack.description=Hand-crafted wild cherry tree pack.
tile.ods_orch:wild_cherry_tree_log.name=Wild Cherry Log
tile.ods_orch:wild_cherry_tree_stripped_log.name=Stripped Wild Cherry Log
tile.ods_orch:wild_cherry_tree_planks.name=Wild Cherry Planks
tile.ods_orch:wild_cherry_tree_leaves.name=Wild Cherry Leaves
tile.ods_orch:wild_cherry_tree_sapling.name=Wild Cherry Sapling
tile.ods_orch:wild_cherry_tree_fruit_side.name=Wild Cherry Cluster
tile.ods_orch:wild_cherry_tree_fruit_down.name=Wild Cherry Hanging
item.ods_orch:wild_cherry_tree_sapling_placer.name=Wild Cherry Sapling

View File

@@ -0,0 +1 @@
["en_US"]

View File

@@ -0,0 +1,7 @@
{
"resource_pack_name": "trees_features_RP",
"texture_name": "atlas.items",
"texture_data": {
"ods_orch_wild_cherry_tree_sapling_placer": { "textures": "textures/ods/orch/items/wild_cherry_tree_sapling_placer" }
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

View File

@@ -0,0 +1,15 @@
{
"resource_pack_name": "trees_features_RP",
"texture_name": "atlas.terrain",
"padding": 8,
"num_mip_levels": 4,
"texture_data": {
"ods_orch_wild_cherry_tree_log": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_log" },
"ods_orch_wild_cherry_tree_stripped_log": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_stripped_log" },
"ods_orch_wild_cherry_tree_planks": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_planks" },
"ods_orch_wild_cherry_tree_leaves": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_leaves" },
"ods_orch_wild_cherry_tree_sapling": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_sapling" },
"ods_orch_wild_cherry_tree_fruit_side": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_fruit_side" },
"ods_orch_wild_cherry_tree_fruit_down": { "textures": "textures/ods/orch/blocks/wild_cherry_tree_fruit_down" }
}
}