From ae6e7a0337ace33bbea5ac1602eab5d11faae4d5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 18 Jan 2024 19:52:59 +0000 Subject: [PATCH] Added golden oak trees --- .../ability/EarthPonyGrowAbility.java | 134 ++++++++++++++++-- .../unicopia/block/EnchantedFruitBlock.java | 24 ++++ .../unicopia/block/FruitBearingBlock.java | 14 +- .../unicopia/block/GoldenOakLeavesBlock.java | 26 ++++ .../unicopia/block/UBlocks.java | 14 +- .../unicopia/block/UWoodTypes.java | 1 + .../minelittlepony/unicopia/item/UItems.java | 1 + .../unicopia/server/world/UTreeGen.java | 12 ++ .../unicopia/blockstates/golden_apple.json | 7 + .../blockstates/golden_oak_leaves.json | 7 + .../unicopia/blockstates/golden_oak_log.json | 16 +++ .../blockstates/golden_oak_sapling.json | 7 + .../blockstates/golden_oak_sprout.json | 28 ++++ .../resources/assets/unicopia/lang/en_us.json | 5 + .../unicopia/models/block/golden_apple.json | 6 + .../models/block/golden_oak_leaves.json | 6 + .../unicopia/models/block/golden_oak_log.json | 7 + .../block/golden_oak_log_horizontal.json | 7 + .../models/block/golden_oak_sapling.json | 6 + .../models/item/golden_oak_leaves.json | 3 + .../unicopia/models/item/golden_oak_log.json | 3 + .../models/item/golden_oak_sapling.json | 6 + .../models/item/golden_oak_seeds.json | 6 + .../textures/block/golden_oak_leaves.png | Bin 0 -> 6220 bytes .../textures/block/golden_oak_log.png | Bin 0 -> 6881 bytes .../textures/block/golden_oak_log_top.png | Bin 0 -> 6689 bytes .../textures/item/golden_oak_sapling.png | Bin 0 -> 6670 bytes .../textures/item/golden_oak_seeds.png | Bin 0 -> 6361 bytes .../minecraft/tags/blocks/dragon_immune.json | 4 +- .../data/minecraft/tags/blocks/leaves.json | 1 + .../data/minecraft/tags/blocks/logs.json | 1 + .../minecraft/tags/blocks/logs_that_burn.json | 1 + .../tags/blocks/maintains_farmland.json | 1 + .../minecraft/tags/blocks/mineable/hoe.json | 1 + .../minecraft/tags/blocks/piglin_loved.json | 8 ++ .../minecraft/tags/items/piglin_loved.json | 9 ++ .../loot_tables/blocks/golden_apple.json | 49 +++++++ .../loot_tables/blocks/golden_oak_leaves.json | 116 +++++++++++++++ .../loot_tables/blocks/golden_oak_log.json | 20 +++ .../blocks/golden_oak_sapling.json | 20 +++ .../data/unicopia/recipes/gold_nugget.json | 9 ++ .../tags/items/loot_bug_high_value_drops.json | 1 + 42 files changed, 569 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/EnchantedFruitBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/block/GoldenOakLeavesBlock.java create mode 100644 src/main/resources/assets/unicopia/blockstates/golden_apple.json create mode 100644 src/main/resources/assets/unicopia/blockstates/golden_oak_leaves.json create mode 100644 src/main/resources/assets/unicopia/blockstates/golden_oak_log.json create mode 100644 src/main/resources/assets/unicopia/blockstates/golden_oak_sapling.json create mode 100644 src/main/resources/assets/unicopia/blockstates/golden_oak_sprout.json create mode 100644 src/main/resources/assets/unicopia/models/block/golden_apple.json create mode 100644 src/main/resources/assets/unicopia/models/block/golden_oak_leaves.json create mode 100644 src/main/resources/assets/unicopia/models/block/golden_oak_log.json create mode 100644 src/main/resources/assets/unicopia/models/block/golden_oak_log_horizontal.json create mode 100644 src/main/resources/assets/unicopia/models/block/golden_oak_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_oak_leaves.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_oak_log.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_oak_sapling.json create mode 100644 src/main/resources/assets/unicopia/models/item/golden_oak_seeds.json create mode 100644 src/main/resources/assets/unicopia/textures/block/golden_oak_leaves.png create mode 100644 src/main/resources/assets/unicopia/textures/block/golden_oak_log.png create mode 100644 src/main/resources/assets/unicopia/textures/block/golden_oak_log_top.png create mode 100644 src/main/resources/assets/unicopia/textures/item/golden_oak_sapling.png create mode 100644 src/main/resources/assets/unicopia/textures/item/golden_oak_seeds.png create mode 100644 src/main/resources/data/minecraft/tags/blocks/piglin_loved.json create mode 100644 src/main/resources/data/minecraft/tags/items/piglin_loved.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/golden_apple.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/golden_oak_leaves.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/golden_oak_log.json create mode 100644 src/main/resources/data/unicopia/loot_tables/blocks/golden_oak_sapling.json create mode 100644 src/main/resources/data/unicopia/recipes/gold_nugget.json diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java index b69ebae4f..f02ee066a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java @@ -1,10 +1,13 @@ package com.minelittlepony.unicopia.ability; +import java.util.HashSet; +import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.function.DoubleSupplier; import java.util.function.Supplier; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.USounds; import com.minelittlepony.unicopia.UTags; import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.data.Pos; @@ -12,9 +15,12 @@ import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particle.MagicParticleEffect; import com.minelittlepony.unicopia.particle.ParticleUtils; +import com.minelittlepony.unicopia.server.world.BlockDestructionManager; +import com.minelittlepony.unicopia.server.world.UTreeGen; import com.minelittlepony.unicopia.util.TraceHelper; import com.minelittlepony.unicopia.util.VecHelper; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.CarrotsBlock; @@ -23,10 +29,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.particle.ParticleTypes; +import net.minecraft.state.property.Property; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; import net.minecraft.world.World; +import net.minecraft.world.WorldEvents; /** * Earth Pony ability to grow crops @@ -67,10 +76,14 @@ public double getCostEstimate(Pony player) { public boolean apply(Pony player, Pos data) { int count = 0; - for (BlockPos pos : BlockPos.iterate( - data.pos().add(-2, -2, -2), - data.pos().add( 2, 2, 2))) { - count += applySingle(player, player.asWorld(), player.asWorld().getBlockState(pos), pos); + if (!applyDirectly(player, data.pos())) { + for (BlockPos pos : BlockPos.iterate( + data.pos().add(-2, -2, -2), + data.pos().add( 2, 2, 2))) { + count += applySingle(player, player.asWorld(), player.asWorld().getBlockState(pos), pos); + } + } else { + count = 1; } if (count > 0) { @@ -90,16 +103,7 @@ protected int applySingle(Pony player, World w, BlockState state, BlockPos pos) if (state.isOf(Blocks.CARROTS)) { if (state.get(CarrotsBlock.AGE) == CarrotsBlock.MAX_AGE) { boolean transform = w.random.nextInt(3) == 0; - DoubleSupplier vecComponentFactory = () -> w.random.nextTriangular(0, 0.5); - Supplier posSupplier = () -> pos.toCenterPos().add(VecHelper.supply(vecComponentFactory)); - - for (int i = 0; i < 25; i++) { - ParticleUtils.spawnParticle(w, new MagicParticleEffect(0xFFFF00), posSupplier.get(), Vec3d.ZERO); - if (transform) { - ParticleUtils.spawnParticle(w, ParticleTypes.CLOUD, posSupplier.get(), Vec3d.ZERO); - } - } - + spawnConversionParticles(w, pos, transform); if (transform) { w.setBlockState(pos, UBlocks.GOLD_ROOT.getDefaultState().with(CarrotsBlock.AGE, CarrotsBlock.MAX_AGE)); } @@ -134,6 +138,55 @@ protected int applySingle(Pony player, World w, BlockState state, BlockPos pos) return 0; } + private boolean applyDirectly(Pony player, BlockPos pos) { + return TransmutationRecipe.RECIPES.stream() + .filter(recipe -> recipe.matches(player.asWorld(), pos)) + .map(recipe -> recipe.checkPattern(player.asWorld(), pos)) + .filter(result -> result.matchedLocations().size() + 1 >= TransmutationRecipe.MINIMUM_INPUT) + .filter(result -> { + boolean transform = result.shoudTransform(player.asWorld().random); + + player.playSound(USounds.ENTITY_CRYSTAL_SHARDS_AMBIENT, 1); + + result.matchedLocations().forEach(cell -> { + spawnConversionParticles(player.asWorld(), cell.up(), false); + BlockDestructionManager manager = BlockDestructionManager.of(player.asWorld()); + if (transform) { + if (manager.damageBlock(cell, 8) >= BlockDestructionManager.MAX_DAMAGE || player.asWorld().random.nextInt(20) == 0) { + player.asWorld().setBlockState(cell, Blocks.DIRT.getDefaultState()); + player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, cell, Block.getRawIdFromState(player.asWorld().getBlockState(cell))); + } + } else { + if (manager.damageBlock(cell, 4) >= BlockDestructionManager.MAX_DAMAGE || player.asWorld().random.nextInt(20) == 0) { + player.asWorld().setBlockState(cell, Blocks.DIRT.getDefaultState()); + player.asWorld().syncWorldEvent(WorldEvents.BLOCK_BROKEN, cell, Block.getRawIdFromState(player.asWorld().getBlockState(cell))); + } + } + }); + + spawnConversionParticles(player.asWorld(), pos, transform); + if (transform) { + player.asWorld().setBlockState(pos, result.recipe().getResult(player.asWorld(), pos)); + } + + return true; + }) + .findFirst() + .isPresent(); + } + + private static void spawnConversionParticles(World w, BlockPos pos, boolean success) { + DoubleSupplier vecComponentFactory = () -> w.random.nextTriangular(0, 0.5); + Supplier posSupplier = () -> pos.toCenterPos().add(VecHelper.supply(vecComponentFactory)); + + for (int i = 0; i < 25; i++) { + ParticleUtils.spawnParticle(w, new MagicParticleEffect(0xFFFF00), posSupplier.get(), Vec3d.ZERO); + if (success) { + ParticleUtils.spawnParticle(w, ParticleTypes.CLOUD, posSupplier.get(), Vec3d.ZERO); + } + } + } + @Override public void warmUp(Pony player, AbilitySlot slot) { player.getMagicalReserves().getExertion().addPercent(30); @@ -148,6 +201,57 @@ public void coolDown(Pony player, AbilitySlot slot) { } + private static record TransmutationRecipe(Block input, BlockState output, BlockState material) { + static final List RECIPES = List.of( + new TransmutationRecipe(Blocks.OAK_SAPLING, UTreeGen.GOLDEN_APPLE_TREE.sapling().get().getDefaultState(), Blocks.RAW_GOLD_BLOCK.getDefaultState()), + new TransmutationRecipe(Blocks.CARROTS, UBlocks.GOLD_ROOT.getDefaultState(), Blocks.RAW_GOLD_BLOCK.getDefaultState()), + new TransmutationRecipe(Blocks.CORNFLOWER, UBlocks.CURING_JOKE.getDefaultState(), Blocks.LAPIS_BLOCK.getDefaultState()), + new TransmutationRecipe(Blocks.WITHER_ROSE, UBlocks.PLUNDER_VINE_BUD.getDefaultState(), Blocks.NETHERRACK.getDefaultState()) + ); + static final int RADIUS = 3; + static final int SIDE_LENGTH = (2 * RADIUS) + 1; + static final int AREA = (SIDE_LENGTH * SIDE_LENGTH) - 1; + static final int MINIMUM_INPUT = 9; + + public boolean matches(World world, BlockPos pos) { + return world.getBlockState(pos).isOf(input); + } + + public Result checkPattern(World world, BlockPos pos) { + BlockPos center = pos.down(); + Set matches = new HashSet<>(); + for (BlockPos cell : BlockPos.iterateInSquare(center, RADIUS, Direction.EAST, Direction.NORTH)) { + if (cell.equals(center)) { + continue; + } + if (!world.getBlockState(cell).equals(material)) { + break; + } + matches.add(cell.toImmutable()); + } + return new Result(this, matches); + } + + public BlockState getResult(World world, BlockPos pos) { + BlockState input = world.getBlockState(pos); + BlockState output = this.output; + for (var property : input.getProperties()) { + output = copyProperty(input, output, property); + } + return output; + } + + private > BlockState copyProperty(BlockState from, BlockState to, Property property) { + return to.withIfExists(property, from.get(property)); + } + + record Result (TransmutationRecipe recipe, Set matchedLocations) { + public boolean shoudTransform(Random random) { + return random.nextInt(TransmutationRecipe.AREA) < matchedLocations().size(); + } + } + } + public interface Growable { boolean grow(World world, BlockState state, BlockPos pos); } diff --git a/src/main/java/com/minelittlepony/unicopia/block/EnchantedFruitBlock.java b/src/main/java/com/minelittlepony/unicopia/block/EnchantedFruitBlock.java new file mode 100644 index 000000000..c6af91662 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/EnchantedFruitBlock.java @@ -0,0 +1,24 @@ +package com.minelittlepony.unicopia.block; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; + +public class EnchantedFruitBlock extends FruitBlock { + static final BooleanProperty ENCHANTED = BooleanProperty.of("enchanted"); + + public EnchantedFruitBlock(Settings settings, Direction attachmentFace, Block stem, VoxelShape shape) { + super(settings, attachmentFace, stem, shape); + setDefaultState(getDefaultState().with(ENCHANTED, false)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(ENCHANTED); + } + +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java index 8faa118a5..b9741cef2 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/FruitBearingBlock.java @@ -62,6 +62,14 @@ public boolean hasRandomTicks(BlockState state) { return true; } + protected boolean shouldAdvance(Random random) { + return true; + } + + protected BlockState getPlacedFruitState(Random random) { + return fruit.get().getDefaultState(); + } + @Override public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { super.randomTick(state, world, pos, random); @@ -74,6 +82,10 @@ public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random BlockSoundGroup group = getSoundGroup(state); int steps = FertilizableUtil.getGrowthSteps(world, pos, state, random); while (steps-- > 0) { + if (!shouldAdvance(random)) { + continue; + } + if (state.get(STAGE) == Stage.FRUITING) { state = state.cycle(AGE); if (state.get(AGE) > 20) { @@ -89,7 +101,7 @@ public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random if (stage == Stage.FRUITING && isPositionValidForFruit(state, pos)) { if (world.isAir(fruitPosition)) { - world.setBlockState(fruitPosition, fruit.get().getDefaultState(), Block.NOTIFY_ALL); + world.setBlockState(fruitPosition, getPlacedFruitState(random), Block.NOTIFY_ALL); } } diff --git a/src/main/java/com/minelittlepony/unicopia/block/GoldenOakLeavesBlock.java b/src/main/java/com/minelittlepony/unicopia/block/GoldenOakLeavesBlock.java new file mode 100644 index 000000000..1ae9ed611 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/GoldenOakLeavesBlock.java @@ -0,0 +1,26 @@ +package com.minelittlepony.unicopia.block; + +import java.util.function.Supplier; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.random.Random; + +public class GoldenOakLeavesBlock extends FruitBearingBlock { + + public GoldenOakLeavesBlock(Settings settings, int overlay, Supplier fruit, + Supplier rottenFruitSupplier) { + super(settings, overlay, fruit, rottenFruitSupplier); + } + + @Override + protected boolean shouldAdvance(Random random) { + return random.nextInt(1000) == 0; + } + + @Override + protected BlockState getPlacedFruitState(Random random) { + return super.getPlacedFruitState(random).with(EnchantedFruitBlock.ENCHANTED, random.nextInt(1000) == 0); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index ca6726e92..7fc8d666e 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -79,7 +79,7 @@ public interface UBlocks { Block PALM_STAIRS = register("palm_stairs", new StairsBlock(PALM_PLANKS.getDefaultState(), Settings.copy(PALM_PLANKS).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_SLAB = register("palm_slab", new SlabBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); Block PALM_FENCE = register("palm_fence", new FenceBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL)), ItemGroups.BUILDING_BLOCKS); - Block PALM_FENCE_GATE = register("palm_fence_gate", new FenceGateBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), WoodType.OAK), ItemGroups.BUILDING_BLOCKS); + Block PALM_FENCE_GATE = register("palm_fence_gate", new FenceGateBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).strength(2, 3).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.NORMAL), UWoodTypes.PALM), ItemGroups.BUILDING_BLOCKS); Block PALM_DOOR = register("palm_door", new DoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3.0f).nonOpaque().burnable().pistonBehavior(PistonBehavior.DESTROY), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL); Block PALM_TRAPDOOR = register("palm_trapdoor", new TrapdoorBlock(Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).instrument(Instrument.BASS).strength(3).nonOpaque().allowsSpawning(BlockConstructionUtils::never).burnable(), UWoodTypes.PALM.setType()), ItemGroups.FUNCTIONAL); Block PALM_PRESSURE_PLATE = register("palm_pressure_plate", new PressurePlateBlock(PressurePlateBlock.ActivationRule.EVERYTHING, Settings.create().mapColor(PALM_PLANKS.getDefaultMapColor()).noCollision().strength(0.5f).sounds(BlockSoundGroup.WOOD).pistonBehavior(PistonBehavior.DESTROY), BlockSetType.OAK), ItemGroups.BUILDING_BLOCKS); @@ -127,6 +127,16 @@ public interface UBlocks { Block SOUR_APPLE = register("sour_apple", new FruitBlock(Settings.create().mapColor(MapColor.GREEN), Direction.DOWN, SOUR_APPLE_LEAVES, FruitBlock.DEFAULT_SHAPE)); Block SOUR_APPLE_SPROUT = register("sour_apple_sprout", new SproutBlock(0xE5FFCC88, () -> UItems.SOUR_APPLE_SEEDS, () -> UTreeGen.SOUR_APPLE_TREE.sapling().map(Block::getDefaultState).get())); + Block GOLDEN_OAK_LEAVES = register("golden_oak_leaves", new GoldenOakLeavesBlock(FabricBlockSettings.copy(Blocks.OAK_LEAVES), + MapColor.GOLD.color, + () -> UBlocks.GOLDEN_APPLE, + () -> Items.GOLDEN_APPLE.getDefaultStack() + ), ItemGroups.NATURAL); + Block GOLDEN_APPLE = register("golden_apple", new EnchantedFruitBlock(Settings.create().mapColor(MapColor.GOLD), Direction.DOWN, GOLDEN_OAK_LEAVES, FruitBlock.DEFAULT_SHAPE)); + Block GOLDEN_OAK_SPROUT = register("golden_oak_sprout", new SproutBlock(0xE5FFCC88, () -> UItems.GOLDEN_OAK_SEEDS, () -> UTreeGen.GOLDEN_APPLE_TREE.sapling().map(Block::getDefaultState).get())); + + Block GOLDEN_OAK_LOG = register("golden_oak_log", BlockConstructionUtils.createLogBlock(MapColor.OFF_WHITE, MapColor.GOLD), ItemGroups.BUILDING_BLOCKS); + Block APPLE_PIE = register("apple_pie", new PieBlock(Settings.create().solid().mapColor(MapColor.ORANGE).strength(0.5F).sounds(BlockSoundGroup.WOOL).pistonBehavior(PistonBehavior.DESTROY), () -> UItems.APPLE_PIE_SLICE, () -> UItems.APPLE_PIE, @@ -254,10 +264,12 @@ static void bootstrap() { FlammableBlockRegistry.getDefaultInstance().add(GREEN_APPLE_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(SWEET_APPLE_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(SOUR_APPLE_LEAVES, 30, 60); + FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LEAVES, 60, 120); FlammableBlockRegistry.getDefaultInstance().add(MANGO_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(PALM_LEAVES, 30, 60); FlammableBlockRegistry.getDefaultInstance().add(PALM_LOG, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(PALM_WOOD, 5, 5); + FlammableBlockRegistry.getDefaultInstance().add(GOLDEN_OAK_LOG, 15, 15); FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_LOG, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(STRIPPED_PALM_WOOD, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(PALM_PLANKS, 5, 20); diff --git a/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java b/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java index 0a44586ea..5f76ed971 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UWoodTypes.java @@ -15,6 +15,7 @@ public interface UWoodTypes { WoodType PALM = register("palm"); + WoodType GOLDEN_OAK = register("golden_oak"); RegistryKey PALM_BOAT_TYPE = TerraformBoatTypeRegistry.createKey(Unicopia.id("palm")); BlockSetType CLOUD = new BlockSetTypeBuilder() diff --git a/src/main/java/com/minelittlepony/unicopia/item/UItems.java b/src/main/java/com/minelittlepony/unicopia/item/UItems.java index 40f9eccda..a5ede2a87 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/UItems.java +++ b/src/main/java/com/minelittlepony/unicopia/item/UItems.java @@ -107,6 +107,7 @@ EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, new EntityAttributeModifier(Blunt Item GREEN_APPLE_SEEDS = register("green_apple_seeds", new AliasedBlockItem(UBlocks.GREEN_APPLE_SPROUT, new Item.Settings()), ItemGroups.NATURAL); Item SWEET_APPLE_SEEDS = register("sweet_apple_seeds", new AliasedBlockItem(UBlocks.SWEET_APPLE_SPROUT, new Item.Settings()), ItemGroups.NATURAL); Item SOUR_APPLE_SEEDS = register("sour_apple_seeds", new AliasedBlockItem(UBlocks.SOUR_APPLE_SPROUT, new Item.Settings()), ItemGroups.NATURAL); + Item GOLDEN_OAK_SEEDS = register("golden_oak_seeds", new AliasedBlockItem(UBlocks.GOLDEN_OAK_SPROUT, new Item.Settings()), ItemGroups.NATURAL); Item MUG = register("mug", new Item(new Settings().maxCount(16)), ItemGroups.TOOLS); Item CIDER = register("cider", new DrinkableItem(new Item.Settings().food(UFoodComponents.CIDER).maxCount(1).recipeRemainder(MUG)), ItemGroups.FOOD_AND_DRINK); diff --git a/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java b/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java index bb55a2358..8331e6943 100644 --- a/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java +++ b/src/main/java/com/minelittlepony/unicopia/server/world/UTreeGen.java @@ -46,6 +46,16 @@ 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 GOLDEN_APPLE_TREE = Tree.Builder.create(Unicopia.id("golden_oak_tree"), + new StraightTrunkPlacer(6, 7, 3), + new BlobFoliagePlacer(ConstantIntProvider.create(3), ConstantIntProvider.create(0), 3) + ) + .configure(TreeFeatureConfig.Builder::forceDirt) + .farmingCondition(1, 3, 5) + .log(UBlocks.GOLDEN_OAK_LOG) + .leaves(UBlocks.GOLDEN_OAK_LEAVES) + .sapling(Unicopia.id("golden_oak_sapling")) + .build(); Tree BANANA_TREE = Tree.Builder.create(Unicopia.id("banana_tree"), new StraightTrunkPlacer(4, 5, 3), new FernFoliagePlacer(ConstantIntProvider.create(4), ConstantIntProvider.create(0)) @@ -84,6 +94,8 @@ static Tree createAppleTree(String name, Block leaves, int preferredDensity) { new BlobFoliagePlacer(ConstantIntProvider.create(3), ConstantIntProvider.create(0), 3) ) .configure(TreeFeatureConfig.Builder::forceDirt) + .biomes(selector -> selector.hasTag(BiomeTags.IS_FOREST)) + .count(2, 0.01F, 1) .farmingCondition(1, preferredDensity - 2, preferredDensity) .log(Blocks.OAK_LOG) .leaves(leaves) diff --git a/src/main/resources/assets/unicopia/blockstates/golden_apple.json b/src/main/resources/assets/unicopia/blockstates/golden_apple.json new file mode 100644 index 000000000..e0c679aa8 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/golden_apple.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/golden_apple" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/golden_oak_leaves.json b/src/main/resources/assets/unicopia/blockstates/golden_oak_leaves.json new file mode 100644 index 000000000..b8084dfb1 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/golden_oak_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/golden_oak_leaves" + } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/golden_oak_log.json b/src/main/resources/assets/unicopia/blockstates/golden_oak_log.json new file mode 100644 index 000000000..4f50529f6 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/golden_oak_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "unicopia:block/golden_oak_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "unicopia:block/golden_oak_log" + }, + "axis=z": { + "model": "unicopia:block/golden_oak_log_horizontal", + "x": 90 + } + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/golden_oak_sapling.json b/src/main/resources/assets/unicopia/blockstates/golden_oak_sapling.json new file mode 100644 index 000000000..7288f548c --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/golden_oak_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/golden_oak_sapling" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/blockstates/golden_oak_sprout.json b/src/main/resources/assets/unicopia/blockstates/golden_oak_sprout.json new file mode 100644 index 000000000..f88ff7ea5 --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/golden_oak_sprout.json @@ -0,0 +1,28 @@ +{ + "variants": { + "age=0": { + "model": "unicopia:block/apple_sprout_stage0" + }, + "age=1": { + "model": "unicopia:block/apple_sprout_stage1" + }, + "age=2": { + "model": "unicopia:block/apple_sprout_stage2" + }, + "age=3": { + "model": "unicopia:block/apple_sprout_stage3" + }, + "age=4": { + "model": "unicopia:block/apple_sprout_stage4" + }, + "age=5": { + "model": "unicopia:block/apple_sprout_stage5" + }, + "age=6": { + "model": "unicopia:block/apple_sprout_stage6" + }, + "age=7": { + "model": "unicopia:block/apple_sprout_stage7" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index 97196487d..d516f4d97 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -123,6 +123,7 @@ "item.unicopia.green_apple_seeds": "Granny Smith Apple Seeds", "item.unicopia.sweet_apple_seeds": "Sweet Apple Seeds", "item.unicopia.sour_apple_seeds": "Sour Apple Seeds", + "item.unicopia.golden_oak_seeds": "Golden Oak Seeds", "item.unicopia.apple_pie_hoof": "Apple Pie with a Hoofprint", "item.unicopia.apple_pie_slice": "Slice Of Apple Pie", "item.unicopia.candied_apple": "Candied Apple", @@ -248,6 +249,10 @@ "block.unicopia.weather_vane": "Weather Vane", "block.unicopia.curing_joke": "Curing Joke", "block.unicopia.gold_root": "Gold Root", + "block.unicopia.golden_oak_sprout": "Golden Oak Sprout", + "block.unicopia.golden_oak_sapling": "Golden Oak Sapling", + "block.unicopia.golden_oak_leaves": "Golden Oak Leaves", + "block.unicopia.golden_oak_log": "Golden Oak Log", "block.unicopia.mango": "Mango", "block.unicopia.mango_leaves": "Mango Leaves", "block.unicopia.mango_sapling": "Mango Sapling", diff --git a/src/main/resources/assets/unicopia/models/block/golden_apple.json b/src/main/resources/assets/unicopia/models/block/golden_apple.json new file mode 100644 index 000000000..a2a567a93 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "unicopia:block/fruit", + "textures": { + "cross": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/golden_oak_leaves.json b/src/main/resources/assets/unicopia/models/block/golden_oak_leaves.json new file mode 100644 index 000000000..0c8f2bd94 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/golden_oak_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "unicopia:block/golden_oak_leaves" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/golden_oak_log.json b/src/main/resources/assets/unicopia/models/block/golden_oak_log.json new file mode 100644 index 000000000..d4909cb0a --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/golden_oak_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "unicopia:block/golden_oak_log_top", + "side": "unicopia:block/golden_oak_log" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/golden_oak_log_horizontal.json b/src/main/resources/assets/unicopia/models/block/golden_oak_log_horizontal.json new file mode 100644 index 000000000..8dc80c7b1 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/golden_oak_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "unicopia:block/golden_oak_log_top", + "side": "unicopia:block/golden_oak_log" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/block/golden_oak_sapling.json b/src/main/resources/assets/unicopia/models/block/golden_oak_sapling.json new file mode 100644 index 000000000..c4c2ba33f --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/golden_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "unicopia:item/golden_oak_sapling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/golden_oak_leaves.json b/src/main/resources/assets/unicopia/models/item/golden_oak_leaves.json new file mode 100644 index 000000000..14afba2fd --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/golden_oak_leaves" +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/golden_oak_log.json b/src/main/resources/assets/unicopia/models/item/golden_oak_log.json new file mode 100644 index 000000000..699482c59 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/golden_oak_log" +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/golden_oak_sapling.json b/src/main/resources/assets/unicopia/models/item/golden_oak_sapling.json new file mode 100644 index 000000000..cc4be5529 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/golden_oak_sapling" + } +} diff --git a/src/main/resources/assets/unicopia/models/item/golden_oak_seeds.json b/src/main/resources/assets/unicopia/models/item/golden_oak_seeds.json new file mode 100644 index 000000000..16cb1fc6e --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/golden_oak_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "unicopia:item/golden_oak_seeds" + } +} diff --git a/src/main/resources/assets/unicopia/textures/block/golden_oak_leaves.png b/src/main/resources/assets/unicopia/textures/block/golden_oak_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..2242b16857eb602a0f29422b0754cb9960283603 GIT binary patch literal 6220 zcmeHLX;f547JeYeHpaN1xDeYWZs?=mzDdUg2(;4d#}G42@|JqgN-uOb(5TUTvF;Np&WIUOP8XY%6VoY#CL~|zKGKtHKsFBH-1WBe|vj{UeXO3r#zkHnPs#kUE zt9!q?_g3+|X(@@lLI;N;2-3@x6rTa>C$$pX6aEfs{#k_88IWyKO{Qoh7`{MBzW~Hf zlYzyrOWWVC2hs!fErz8pY-=)F8SEG6t5?AGkoNXk*dE<3qs_tn{E=R;E{BDH?f$Ud z35#V(+ge9pTYG|if2=>^ljx`uP3ANm5rbnfBm?JT1SMd&fO9&W6>wg_S-8I6oA))+ zkQ!e^WvJh)mbkbyQ(TdB?=3tWd?ubPL@ZWhp zt|_@YwDC~yCkKabe?F&RVx5)Tl)UuIuXaYvNm_C3(wS$6EBs#l_^kM<6`*K2NVeRQ&Umg!Q!nbynPFnMC$ zz`Xj%t1agXHjJ8hd(iuz|MjOCJ=V8AeYmmyt;C5xGme6W`nAT3&Y+07gpygbO^0qt zLmF$Zz2Q8120e4=%BOqYTU8gNi`ze?0SQ`i)KmJ0b1&a)sN?@MZ}#-&7C*lxXGz`d zVjJ|EQ(s2gd%s& zcN9AFedZ{#0ptTK6m`K>@or0M5!X3GqafE}b@*mMvb#yTE$V%;y6L8k_{{052%O%D z+fBN|cAqemGMj~XyIiQLXNouKwe{edit6=b?ajZK`zXqx9pnk6}&;o18_ z(}2?jJyFB-R6&Iv@f-I-;#=Nt8%S+{f848utg-D14x z1`xC}4`+4c;jtJdU~TGaaAvz=QA_@pv=%(NSSSy-JjvpM>zDYt+9E0w6tumyz2;kd zp`_FKfD8-L<3N@(Zp&N-Qa|yowSeNuU&~0#ssn z45a}MNhM?%NOE^{mtA!ii%u{p7xD(5t8#Si8ba5Wgb^#+u6vt2k%fdN< zCIpHe3(qk~nBmtqkp~3LVSq&$f?-gKq!pB7X$~bAiDpz)Avyx4lfZ{yA}>(Pqcf3_ zR1#1kiz+;?#?1;;U(2a?EB4|x}Pfg}VRe{?4D48;-@%b^^`vnVC16e_7K zjp7O|tCT{D7-&m04`mlgJPU_cEx3z(dt^TXN5vQwz@THGqjE4UQ$R#{R)Q9bJWy$x z;wXad9$o*Bqqdo-SxG%Q6BS+&MN(l=QHAFgMPmTvNl8Lg4kvLL9vXm`9t%b2hJp2KKJBO5uepRy_jr*9;`cFKkLh|K1|CTG zv3EVD>wy?}AmPW}_0Z@Fz5js<*x>(_#qjgfLEwK6e!A)@O-+nP{)N1W96a4JNc)@> z;z)Ylg&<-5wBmdA?TW4-#-2NTn$D~BZ&X+P4SbmxKBW4PSTq6h`H*< z*G?Xp{Fikp4PV&PKGdBq|MJHJ`<@OBG=&%rh8`d7Z&)@tGXpq#{| z)~VwwQhVwWkY5&J-Ep{XpLnlotN&pB=y0{N z{8G{9*-uI4i+*J(#+iq|TM=Ej@j%w)jNmQYoU?cJmFJhQ+SU60iu4t!M~+o)4ndA) zc&Cb<*~7xqPE?jJ8oq|BcsFoxkJJ!k#6P|{8NWekx>7s-&gMBu+m=lGqb=*shquwE zhVoO!UH9G$3?oNf9a%n7uE&TTnCA{9aJY`5U`S!z;qBd7G-YuZ+B*j4*E*J!psV zd`ynSym$#;+^}?WfdA2- dst?}_szg7?ySne}Cg`<@DIq0(@8p*j{2Tn{Jxc%p literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/golden_oak_log.png b/src/main/resources/assets/unicopia/textures/block/golden_oak_log.png new file mode 100644 index 0000000000000000000000000000000000000000..414dd04ceb1e5f10d54be9265ad3f5856f484786 GIT binary patch literal 6881 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/golden_oak_log_top.png b/src/main/resources/assets/unicopia/textures/block/golden_oak_log_top.png new file mode 100644 index 0000000000000000000000000000000000000000..be183711ca43ba9a8e6395457654d477366aaac5 GIT binary patch literal 6689 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