Added palm trees (for growing bananas) and a palm wood type

This commit is contained in:
Sollace 2023-05-23 18:49:56 +01:00
parent f2349199a5
commit 614ceb9213
58 changed files with 1051 additions and 14 deletions

File diff suppressed because one or more lines are too long

View file

@ -10,14 +10,17 @@ import com.minelittlepony.unicopia.server.world.UTreeGen;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
import net.fabricmc.fabric.api.object.builder.v1.block.FabricMaterialBuilder;
import net.fabricmc.fabric.api.registry.FlammableBlockRegistry;
import net.fabricmc.fabric.api.registry.StrippableBlockRegistry;
import net.minecraft.block.*;
import net.minecraft.block.AbstractBlock.Settings;
import net.minecraft.entity.EntityType;
import net.minecraft.item.*;
import net.minecraft.sound.BlockSoundGroup;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.registry.Registry;
import net.minecraft.registry.Registries;
import net.minecraft.world.BlockView;
@ -45,6 +48,17 @@ public interface UBlocks {
Block ZAP_BULB = register("zap_bulb", new FruitBlock(FabricBlockSettings.of(Material.GOURD, MapColor.GRAY).strength(500, 1200).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false));
Block ZAP_APPLE = register("zap_apple", new FruitBlock(FabricBlockSettings.of(Material.GOURD, MapColor.GRAY).sounds(BlockSoundGroup.AZALEA_LEAVES), Direction.DOWN, ZAP_LEAVES, FruitBlock.DEFAULT_SHAPE, false));
Block PALM_LOG = register("palm_log", createLogBlock(MapColor.OFF_WHITE, MapColor.SPRUCE_BROWN), ItemGroups.BUILDING_BLOCKS);
Block PALM_WOOD = register("palm_wood", createWoodBlock(MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS);
Block PALM_PLANKS = register("palm_planks", new Block(Settings.of(Material.WOOD, MapColor.OFF_WHITE).strength(2, 3).sounds(BlockSoundGroup.WOOD)), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_PALM_LOG = register("stripped_palm_log", createLogBlock(MapColor.OFF_WHITE, MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS);
Block STRIPPED_PALM_WOOD = register("stripped_palm_wood", createWoodBlock(MapColor.OFF_WHITE), ItemGroups.BUILDING_BLOCKS);
Block PALM_LEAVES = register("palm_leaves", createLeavesBlock(BlockSoundGroup.GRASS), ItemGroups.BUILDING_BLOCKS);
Block BANANAS = register("bananas", new FruitBlock(FabricBlockSettings.of(Material.GOURD, MapColor.YELLOW).sounds(BlockSoundGroup.WOOD).hardness(3), Direction.DOWN, PALM_LEAVES, VoxelShapes.fullCube()));
Block WEATHER_VANE = register("weather_vane", new WeatherVaneBlock(FabricBlockSettings.of(Material.METAL, MapColor.BLACK).requiresTool().strength(3.0f, 6.0f).sounds(BlockSoundGroup.METAL).nonOpaque()), ItemGroups.TOOLS);
Block GREEN_APPLE_LEAVES = register("green_apple_leaves", new FruitBearingBlock(FabricBlockSettings.copy(Blocks.OAK_LEAVES),
@ -102,8 +116,19 @@ public interface UBlocks {
static void bootstrap() {
StrippableBlockRegistry.register(ZAP_LOG, STRIPPED_ZAP_LOG);
StrippableBlockRegistry.register(PALM_LOG, STRIPPED_PALM_LOG);
StrippableBlockRegistry.register(ZAP_WOOD, STRIPPED_ZAP_WOOD);
StrippableBlockRegistry.register(PALM_WOOD, STRIPPED_PALM_WOOD);
TRANSLUCENT_BLOCKS.add(WEATHER_VANE);
TintedBlock.REGISTRY.add(PALM_LEAVES);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LEAVES, 30, 60);
FlammableBlockRegistry.getDefaultInstance().add(PALM_LOG, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(PALM_WOOD, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_LOG, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_WOOD, 5, 5);
FlammableBlockRegistry.getDefaultInstance().add(PALM_PLANKS, 5, 20);
FlammableBlockRegistry.getDefaultInstance().add(BANANAS, 5, 20);
UBlockEntities.bootstrap();
}
@ -112,6 +137,18 @@ public interface UBlocks {
return false;
}
static PillarBlock createLogBlock(MapColor topMapColor, MapColor sideMapColor) {
return new PillarBlock(AbstractBlock.Settings.of(Material.WOOD, state -> state.get(PillarBlock.AXIS) == Direction.Axis.Y ? topMapColor : sideMapColor).strength(2).sounds(BlockSoundGroup.WOOD));
}
static PillarBlock createWoodBlock(MapColor mapColor) {
return new PillarBlock(AbstractBlock.Settings.of(Material.WOOD, mapColor).strength(2).sounds(BlockSoundGroup.WOOD));
}
static LeavesBlock createLeavesBlock(BlockSoundGroup soundGroup) {
return new LeavesBlock(AbstractBlock.Settings.of(Material.LEAVES).strength(0.2F).ticksRandomly().sounds(soundGroup).nonOpaque().allowsSpawning(UBlocks::canSpawnOnLeaves).suffocates(UBlocks::never).blockVision(UBlocks::never));
}
static Boolean canSpawnOnLeaves(BlockState state, BlockView world, BlockPos pos, EntityType<?> type) {
return type == EntityType.OCELOT || type == EntityType.PARROT;
}

View file

@ -136,7 +136,11 @@ public interface URenderers {
color = BiomeColors.getFoliageColor(view, pos);
}
return ((TintedBlock)state.getBlock()).getTint(state, view, pos, color);
if (state.getBlock() instanceof TintedBlock block) {
return block.getTint(state, view, pos, color);
}
return color;
};
ColorProviderRegistry.BLOCK.register(tintedProvider, TintedBlock.REGISTRY.stream().toArray(Block[]::new));

View file

@ -0,0 +1,98 @@
package com.minelittlepony.unicopia.server.world;
import java.util.function.BiConsumer;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.block.UBlocks;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.intprovider.IntProvider;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.TestableWorld;
import net.minecraft.world.gen.feature.TreeFeatureConfig;
import net.minecraft.world.gen.foliage.FoliagePlacer;
import net.minecraft.world.gen.foliage.FoliagePlacerType;
public class FernFoliagePlacer extends FoliagePlacer {
public static final Codec<FernFoliagePlacer> CODEC = RecordCodecBuilder.create(instance -> fillFoliagePlacerFields(instance).apply(instance, FernFoliagePlacer::new));
public static final FoliagePlacerType<FernFoliagePlacer> TYPE = Registry.register(Registries.FOLIAGE_PLACER_TYPE, Unicopia.id("fern_foliage_placer"), new FoliagePlacerType<>(CODEC));
public FernFoliagePlacer(IntProvider radius, IntProvider offset) {
super(radius, offset);
}
@Override
protected FoliagePlacerType<?> getType() {
return TYPE;
}
@Override
protected void generate(TestableWorld world, BiConsumer<BlockPos, BlockState> placer, Random random,
TreeFeatureConfig config, int trunkHeight, TreeNode node, int foliageHeight, int radius, int offset) {
BlockPos center = node.getCenter();
// central leaves blob
for (int y = offset; y >= offset - foliageHeight; --y) {
int rad = Math.max(radius + node.getFoliageRadius() - 3 - y / 2, 0);
generateSquare(world, placer, random, config, center, rad, y, node.isGiantTrunk());
}
BlockPos.Mutable pos = new BlockPos.Mutable();
int fanY = 0;
for (int outset = 1; outset < 6; outset++) {
for (int j = 0; j < 2; j++) {
if (outset < 4) {
// diagonal frons
for (int z = 0; z < 2; z++) {
placeFoliageBlock(world, placer, random, config, pos.set(center, outset, fanY, outset + z));
placeFoliageBlock(world, placer, random, config, pos.set(center, outset, fanY, -outset + z));
placeFoliageBlock(world, placer, random, config, pos.set(center, -outset + z, fanY, outset));
placeFoliageBlock(world, placer, random, config, pos.set(center, -outset + z, fanY, -outset));
}
}
// adjacent frons
placeFoliageBlock(world, placer, random, config, pos.set(center, outset, fanY, 0));
placeFoliageBlock(world, placer, random, config, pos.set(center, 0, fanY, outset));
placeFoliageBlock(world, placer, random, config, pos.set(center, 0, fanY, -outset));
placeFoliageBlock(world, placer, random, config, pos.set(center, -outset, fanY, 0));
if (j != 0 || outset % 2 != 0) break;
fanY--;
}
// fruit
if (outset == 1) {
BlockState fruitState = UBlocks.BANANAS.getDefaultState();
if (random.nextInt(5) == 0) {
placer.accept(pos.set(center, outset, fanY - 1, 0), fruitState);
}
if (random.nextInt(5) == 0) {
placer.accept(pos.set(center, -outset, fanY - 1, 0), fruitState);
}
if (random.nextInt(5) == 0) {
placer.accept(pos.set(center, 0, fanY - 1, outset), fruitState);
}
if (random.nextInt(5) == 0) {
placer.accept(pos.set(center, 0, fanY - 1, -outset), fruitState);
}
}
}
}
@Override
public int getRandomHeight(Random random, int trunkHeight, TreeFeatureConfig config) {
return 1;
}
@Override
protected boolean isInvalidForLeaves(Random random, int dx, int y, int dz, int radius, boolean giantTrunk) {
return dx == radius && dz == radius && (random.nextInt(2) == 0 || y == 0);
}
}

View file

@ -1,8 +1,9 @@
package com.minelittlepony.unicopia.server.world;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import com.minelittlepony.unicopia.block.UBlocks;
@ -65,6 +66,7 @@ public record Tree (
private Block logType = Blocks.OAK_LOG;
private Block leavesType = Blocks.OAK_LEAVES;
private Optional<Identifier> saplingId = Optional.empty();
private BiFunction<SaplingGenerator, Block.Settings, SaplingBlock> saplingConstructor = SaplingBlock::new;
private final TrunkPlacer trunkPlacer;
private final FoliagePlacer foliagePlacer;
@ -73,7 +75,7 @@ public record Tree (
private Optional<Predicate<BiomeSelectionContext>> selector = Optional.empty();
private Optional<PlacementModifier> countModifier = Optional.empty();
private Optional<Supplier<TreeFeatureConfig.Builder>> configSupplier = Optional.empty();
private Function<TreeFeatureConfig.Builder, TreeFeatureConfig.Builder> configParameters = Function.identity();
private Optional<TwoLayersFeatureSize> size = Optional.empty();
private Builder(Identifier id, TrunkPlacer trunkPlacer, FoliagePlacer foliagePlacer) {
@ -97,6 +99,11 @@ public record Tree (
return this;
}
public Builder sapling(BiFunction<SaplingGenerator, Block.Settings, SaplingBlock> constructor) {
saplingConstructor = constructor;
return this;
}
public Builder count(int count, float extraChance, int extraCount) {
countModifier = Optional.of(PlacedFeatures.createCountExtraModifier(count, extraChance, extraCount));
return this;
@ -107,8 +114,8 @@ public record Tree (
return this;
}
public Builder shape(Supplier<TreeFeatureConfig.Builder> shape) {
this.configSupplier = Optional.of(shape);
public Builder configure(Function<TreeFeatureConfig.Builder, TreeFeatureConfig.Builder> shape) {
this.configParameters = shape;
return this;
}
@ -119,18 +126,17 @@ public record Tree (
public Tree build() {
RegistryKey<ConfiguredFeature<?, ?>> configuredFeatureId = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, id);
Tree tree = new Tree(id, configSupplier.map(Supplier::get)
.orElseGet(() -> new TreeFeatureConfig.Builder(
Tree tree = new Tree(id, configParameters.apply(new TreeFeatureConfig.Builder(
BlockStateProvider.of(logType),
trunkPlacer,
BlockStateProvider.of(leavesType),
foliagePlacer,
size.get()
).forceDirt()), configuredFeatureId, selector.map(selector -> {
)), configuredFeatureId, selector.map(selector -> {
RegistryKey<PlacedFeature> i = RegistryKey.of(RegistryKeys.PLACED_FEATURE, id);
BiomeModifications.addFeature(selector, GenerationStep.Feature.VEGETAL_DECORATION, i);
return i;
}), saplingId.map(id -> UBlocks.register(id, new SaplingBlock(new SaplingGenerator() {
}), saplingId.map(id -> UBlocks.register(id, saplingConstructor.apply(new SaplingGenerator() {
@Override
protected RegistryKey<ConfiguredFeature<?, ?>> getTreeFeature(Random rng, boolean flowersNearby) {
return configuredFeatureId;

View file

@ -4,12 +4,17 @@ import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.block.UBlocks;
import net.minecraft.block.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.intprovider.ConstantIntProvider;
import net.minecraft.util.math.intprovider.UniformIntProvider;
import net.minecraft.registry.Registries;
import net.minecraft.registry.tag.BiomeTags;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.world.BlockView;
import net.minecraft.world.gen.feature.TreeFeatureConfig;
import net.minecraft.world.gen.foliage.BlobFoliagePlacer;
import net.minecraft.world.gen.foliage.JungleFoliagePlacer;
import net.minecraft.world.gen.stateprovider.BlockStateProvider;
import net.minecraft.world.gen.trunk.StraightTrunkPlacer;
import net.minecraft.world.gen.trunk.UpwardsBranchingTrunkPlacer;
@ -26,6 +31,7 @@ public interface UTreeGen {
3
)
)
.configure(TreeFeatureConfig.Builder::forceDirt)
.log(UBlocks.ZAP_LOG)
.leaves(UBlocks.ZAP_LEAVES)
.sapling(Unicopia.id("zapling"))
@ -36,12 +42,32 @@ public interface UTreeGen {
Tree GREEN_APPLE_TREE = createAppleTree("green_apple", UBlocks.GREEN_APPLE_LEAVES, 2);
Tree SWEET_APPLE_TREE = createAppleTree("sweet_apple", UBlocks.SWEET_APPLE_LEAVES, 3);
Tree SOUR_APPLE_TREE = createAppleTree("sour_apple", UBlocks.SOUR_APPLE_LEAVES, 5);
Tree BANANA_TREE = Tree.Builder.create(Unicopia.id("banana_tree"),
new StraightTrunkPlacer(4, 5, 3),
new FernFoliagePlacer(ConstantIntProvider.create(4), ConstantIntProvider.create(0))
)
.farmingCondition(6, 0, 8)
.log(UBlocks.PALM_LOG)
.leaves(UBlocks.PALM_LEAVES)
.sapling(Unicopia.id("palm_sapling")).sapling((generator, settings) -> {
return new SaplingBlock(generator, settings) {
@Override
protected boolean canPlantOnTop(BlockState floor, BlockView world, BlockPos pos) {
return floor.isIn(BlockTags.SAND);
}
};
})
.configure(builder -> builder.dirtProvider(BlockStateProvider.of(Blocks.SAND)))
.biomes(selector -> selector.hasTag(BiomeTags.IS_BEACH) || selector.hasTag(BiomeTags.IS_JUNGLE))
.count(2, 0.01F, 1)
.build();
static Tree createAppleTree(String name, Block leaves, int preferredDensity) {
return Tree.Builder.create(Unicopia.id(name + "_tree"),
new StraightTrunkPlacer(4, 6, 2),
new BlobFoliagePlacer(ConstantIntProvider.create(3), ConstantIntProvider.create(0), 3)
)
.configure(TreeFeatureConfig.Builder::forceDirt)
.farmingCondition(1, preferredDensity - 2, preferredDensity)
.log(Blocks.OAK_LOG)
.leaves(leaves)

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/bananas"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/palm_leaves"
}
}
}

View file

@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "unicopia:block/palm_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "unicopia:block/palm_log"
},
"axis=z": {
"model": "unicopia:block/palm_log_horizontal",
"x": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/palm_planks"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/palm_sapling"
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/palm_wood"
}
}
}

View file

@ -0,0 +1,16 @@
{
"variants": {
"axis=x": {
"model": "unicopia:block/stripped_palm_log_horizontal",
"x": 90,
"y": 90
},
"axis=y": {
"model": "unicopia:block/stripped_palm_log"
},
"axis=z": {
"model": "unicopia:block/stripped_palm_log_horizontal",
"x": 90
}
}
}

View file

@ -0,0 +1,7 @@
{
"variants": {
"": {
"model": "unicopia:block/stripped_palm_wood"
}
}
}

View file

@ -140,6 +140,13 @@
"block.unicopia.zap_leaves": "Zap Apple Leaves",
"block.unicopia.zap_apple": "Zap Apple",
"block.unicopia.zap_bulb": "Unripened Zap Apple",
"block.unicopia.palm_sapling": "Palm Sapling",
"block.unicopia.palm_log": "Palm Log",
"block.unicopia.palm_wood": "Palm Wood",
"block.unicopia.palm_planks": "Palm Planks",
"block.unicopia.stripped_palm_log": "Stripped Palm Log",
"block.unicopia.stripped_palm_wood": "Stripped Palm Wood",
"block.unicopia.palm_leaves": "Palm Leaves",
"block.unicopia.apple_pie": "Apple Pie",
"block.unicopia.weather_vane": "Weather Vane",

View file

@ -0,0 +1,350 @@
{
"textures": {
"bananas": "unicopia:block/bananas",
"particle": "#bananas"
},
"elements": [
{
"from": [3, 1, 4],
"to": [13, 11, 14],
"faces": {
"north": {"uv": [0.25, 0.25, 10.25, 10.25], "texture": "#bananas"},
"east": {"uv": [1.25, 0.25, 11.25, 10.25], "texture": "#bananas"},
"south": {"uv": [2.25, 0.25, 12.25, 10.25], "texture": "#bananas"},
"west": {"uv": [3.25, 0.25, 13.25, 10.25], "texture": "#bananas"},
"up": {"uv": [4.25, 0.25, 14.25, 10.25], "texture": "#bananas"},
"down": {"uv": [5.25, 0.25, 15.25, 10.25], "texture": "#bananas"}
}
},
{
"from": [8, -3, 5],
"to": [10, 3, 7],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [10, 0, 6],
"to": [12, 6, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [10, 4, 7],
"to": [12, 10, 9],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [8, 4, 7],
"to": [10, 10, 9],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [12, 5, 10],
"to": [14, 11, 12],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [7, 0, 6],
"to": [9, 6, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [8, 5, 2],
"to": [10, 11, 4],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [6, -2, 4],
"to": [8, 4, 6],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [10, -3, 6],
"to": [12, 3, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [11, 2, 4],
"to": [13, 8, 6],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [13, 5, 6],
"to": [15, 11, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [5, 5, 14],
"to": [11, 11, 16],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [1, 5, 6],
"to": [3, 11, 11],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [4, 2, 3],
"to": [6, 8, 5],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [5, 2, 6],
"to": [7, 8, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [7, -10, 9],
"to": [9, -1, 11],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [9, -7, 10],
"to": [11, -1, 12],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [9, -3, 11],
"to": [11, 3, 13],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [7, -3, 11],
"to": [9, 3, 13],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [11, -1, 9],
"to": [13, 5, 11],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [6, -7, 10],
"to": [8, 2, 12],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [7, -8, 6],
"to": [9, -2, 8],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [5, -9, 8],
"to": [7, -3, 10],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [9, -10, 7],
"to": [11, -1, 9],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [10, -6, 8],
"to": [12, 1, 10],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [9, -5, 5],
"to": [11, 1, 7],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [6, 0, 3],
"to": [8, 6, 5],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [4, -5, 5],
"to": [6, 1, 7],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [3, -5, 7],
"to": [5, 1, 9],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
},
{
"from": [4, -3, 9],
"to": [6, 3, 11],
"faces": {
"north": {"uv": [0, 6, 2, 12], "texture": "#bananas"},
"east": {"uv": [2, 6, 4, 12], "texture": "#bananas"},
"south": {"uv": [0, 0, 2, 6], "texture": "#bananas"},
"west": {"uv": [2, 0, 4, 6], "texture": "#bananas"},
"down": {"uv": [2, 12, 0, 14], "texture": "#bananas"}
}
}
]
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/leaves",
"textures": {
"all": "unicopia:block/palm_leaves"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "minecraft:block/cube_column",
"textures": {
"end": "unicopia:block/palm_log_top",
"side": "unicopia:block/palm_log"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "minecraft:block/cube_column_horizontal",
"textures": {
"end": "unicopia:block/palm_log_top",
"side": "unicopia:block/palm_log"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "unicopia:block/palm_planks"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cross",
"textures": {
"cross": "unicopia:item/palm_sapling"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "unicopia:block/palm_log"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "minecraft:block/cube_column",
"textures": {
"end": "unicopia:block/stripped_palm_log_top",
"side": "unicopia:block/stripped_palm_log"
}
}

View file

@ -0,0 +1,7 @@
{
"parent": "minecraft:block/cube_column_horizontal",
"textures": {
"end": "unicopia:block/stripped_palm_log_top",
"side": "unicopia:block/stripped_palm_log"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "unicopia:block/stripped_palm_log"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/palm_leaves"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/palm_log"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/palm_planks"
}

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "unicopia:item/palm_sapling"
}
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/palm_wood"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/stripped_palm_log"
}

View file

@ -0,0 +1,3 @@
{
"parent": "unicopia:block/stripped_palm_wood"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -1,6 +1,7 @@
{
"replace": false,
"values": [
"unicopia:palm_leaves",
"unicopia:zap_leaves",
"unicopia:green_apple_leaves",
"unicopia:sweet_apple_leaves",

View file

@ -1,6 +1,10 @@
{
"replace": false,
"values": [
"unicopia:palm_log",
"unicopia:palm_wood",
"unicopia:stripped_palm_log",
"unicopia:stripped_palm_wood",
"unicopia:zap_log",
"unicopia:zap_wood",
"unicopia:stripped_zap_log",

View file

@ -0,0 +1,9 @@
{
"replace": false,
"values": [
"unicopia:palm_log",
"unicopia:palm_wood",
"unicopia:stripped_palm_log",
"unicopia:stripped_palm_wood"
]
}

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"unicopia:palm_planks"
]
}

View file

@ -1,6 +1,7 @@
{
"replace": false,
"values": [
"unicopia:palm_leaves",
"unicopia:zap_leaves",
"unicopia:green_apple_leaves",
"unicopia:sweet_apple_leaves",

View file

@ -1,6 +1,10 @@
{
"replace": false,
"values": [
"unicopia:palm_log",
"unicopia:palm_wood",
"unicopia:stripped_palm_log",
"unicopia:stripped_palm_wood",
"unicopia:zap_log",
"unicopia:zap_wood",
"unicopia:stripped_zap_log",

View file

@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"unicopia:palm_planks"
]
}

View file

@ -0,0 +1,40 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"functions": [
{
"add": false,
"count": {
"type": "minecraft:uniform",
"max": 12.0,
"min": 6.0
},
"function": "minecraft:set_count"
},
{
"enchantment": "minecraft:fortune",
"formula": "minecraft:binomial_with_bonus_count",
"function": "minecraft:apply_bonus",
"parameters": {
"extra": 3,
"probability": 0.5714286
}
}
],
"name": "unicopia:banana"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,135 @@
{
"type": "minecraft:block",
"pools": [
{
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:alternatives",
"children": [
{
"type": "minecraft:item",
"conditions": [
{
"condition": "minecraft:alternative",
"terms": [
{
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:shears"
]
}
},
{
"condition": "minecraft:match_tool",
"predicate": {
"enchantments": [
{
"enchantment": "minecraft:silk_touch",
"levels": {
"min": 1
}
}
]
}
}
]
}
],
"name": "unicopia:palm_leaves"
},
{
"type": "minecraft:item",
"conditions": [
{
"condition": "minecraft:survives_explosion"
},
{
"chances": [
0.05,
0.0625,
0.083333336,
0.1
],
"condition": "minecraft:table_bonus",
"enchantment": "minecraft:fortune"
}
],
"name": "unicopia:palm_sapling"
}
]
}
],
"rolls": 1.0
},
{
"bonus_rolls": 0.0,
"conditions": [
{
"condition": "minecraft:inverted",
"term": {
"condition": "minecraft:alternative",
"terms": [
{
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:shears"
]
}
},
{
"condition": "minecraft:match_tool",
"predicate": {
"enchantments": [
{
"enchantment": "minecraft:silk_touch",
"levels": {
"min": 1
}
}
]
}
}
]
}
}
],
"entries": [
{
"type": "minecraft:item",
"conditions": [
{
"chances": [
0.02,
0.022222223,
0.025,
0.033333335,
0.1
],
"condition": "minecraft:table_bonus",
"enchantment": "minecraft:fortune"
}
],
"functions": [
{
"add": false,
"count": {
"type": "minecraft:uniform",
"max": 2.0,
"min": 1.0
},
"function": "minecraft:set_count"
},
{
"function": "minecraft:explosion_decay"
}
],
"name": "minecraft:stick"
}
],
"rolls": 1.0
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:palm_log"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:palm_planks"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:palm_sapling"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:palm_wood"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:stripped_palm_log"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1.0,
"bonus_rolls": 0.0,
"entries": [
{
"type": "minecraft:item",
"name": "unicopia:stripped_palm_wood"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,10 @@
{
"type": "minecraft:crafting_shapeless",
"ingredients": [
{ "item": "unicopia:palm_log" }
],
"result": {
"item": "unicopia:palm_planks",
"count": 4
}
}

View file

@ -0,0 +1,15 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
"##",
"##"
],
"key": {
"#": {
"item": "unicopia:palm_log"
}
},
"result": {
"item": "unicopia:palm_wood"
}
}

View file

@ -6,6 +6,7 @@ accessible class net/minecraft/client/render/item/HeldItemRenderer$H
accessible method net/minecraft/world/GameRules register (Ljava/lang/String;Lnet/minecraft/world/GameRules$Category;Lnet/minecraft/world/GameRules$Type;)Lnet/minecraft/world/GameRules$Key;
accessible method net/minecraft/world/GameRules$BooleanRule create (Z)Lnet/minecraft/world/GameRules$Type;
accessible method net/minecraft/world/GameRules$IntRule create (I)Lnet/minecraft/world/GameRules$Type;
accessible method net/minecraft/world/gen/foliage/FoliagePlacerType <init> (Lcom/mojang/serialization/Codec;)V
accessible field net/minecraft/entity/mob/CreeperEntity CHARGED Lnet/minecraft/entity/data/TrackedData;
accessible field net/minecraft/entity/mob/CreeperEntity IGNITED Lnet/minecraft/entity/data/TrackedData;