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:
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
54
trees-features-addon/trees_features_BP/manifest.json
Normal file
54
trees-features-addon/trees_features_BP/manifest.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
trees-features-addon/trees_features_BP/pack_icon.png
Normal file
BIN
trees-features-addon/trees_features_BP/pack_icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 44 KiB |
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
113
trees-features-addon/trees_features_BP/scripts/main.js
Normal file
113
trees-features-addon/trees_features_BP/scripts/main.js
Normal 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.");
|
||||
});
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
11
trees-features-addon/trees_features_BP/texts/en_US.lang
Normal file
11
trees-features-addon/trees_features_BP/texts/en_US.lang
Normal 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
|
||||
@@ -0,0 +1 @@
|
||||
["en_US"]
|
||||
Reference in New Issue
Block a user